diff options
| -rw-r--r-- | src/pacman/conf.c | 57 | 
1 files changed, 25 insertions, 32 deletions
| diff --git a/src/pacman/conf.c b/src/pacman/conf.c index 918ebd58..370ec510 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -369,7 +369,6 @@ static int _parse_options(const char *key, char *value,  				return 1;  			}  		} else { -  			pm_printf(PM_LOG_WARNING,  					_("config file %s, line %d: directive '%s' in section '%s' not recognized.\n"),  					file, linenum, key, "options"); @@ -486,13 +485,12 @@ static int setlibpaths(void)  /* The real parseconfig. Called with a null section argument by the publicly   * visible parseconfig so we can recall from within ourself on an include */  static int _parseconfig(const char *file, int parse_options, -		const char *givensection, pmdb_t * const givendb) +		char **section, pmdb_t *db)  {  	FILE *fp = NULL;  	char line[PATH_MAX+1];  	int linenum = 0; -	char *ptr, *section = NULL; -	pmdb_t *db = NULL; +	char *ptr;  	int ret = 0;  	pm_printf(PM_LOG_DEBUG, "config: attempting to read file %s\n", file); @@ -502,15 +500,6 @@ static int _parseconfig(const char *file, int parse_options,  		return 1;  	} -	/* if we are passed a section, use it as our starting point */ -	if(givensection != NULL) { -		section = strdup(givensection); -	} -	/* if we are passed a db, use it as our starting point */ -	if(givendb != NULL) { -		db = givendb; -	} -  	while(fgets(line, PATH_MAX, fp)) {  		char *key, *value; @@ -534,31 +523,33 @@ static int _parseconfig(const char *file, int parse_options,  		}  		if(line[0] == '[' && line[strlen(line)-1] == ']') { +			char *name;  			/* new config section, skip the '[' */  			ptr = line;  			ptr++; -			if(section) { -				free(section); -			} -			section = strdup(ptr); -			section[strlen(section)-1] = '\0'; -			pm_printf(PM_LOG_DEBUG, "config: new section '%s'\n", section); -			if(!strlen(section)) { +			name = strdup(ptr); +			name[strlen(name)-1] = '\0'; +			if(!strlen(name)) {  				pm_printf(PM_LOG_ERROR, _("config file %s, line %d: bad section name.\n"),  						file, linenum);  				ret = 1;  				goto cleanup;  			} +			pm_printf(PM_LOG_DEBUG, "config: new section '%s'\n", name);  			/* if we are not looking at the options section, register a db */ -			if(!parse_options && strcmp(section, "options") != 0) { -				db = alpm_db_register_sync(section); +			if(!parse_options && strcmp(name, "options") != 0) { +				db = alpm_db_register_sync(name);  				if(db == NULL) {  					pm_printf(PM_LOG_ERROR, _("could not register '%s' database (%s)\n"), -							section, alpm_strerrorlast()); +							name, alpm_strerrorlast());  					ret = 1;  					goto cleanup;  				}  			} +			if(*section) { +				free(*section); +			} +			*section = name;  			continue;  		} @@ -577,7 +568,7 @@ static int _parseconfig(const char *file, int parse_options,  			goto cleanup;  		}  		/* For each directive, compare to the camelcase string. */ -		if(section == NULL) { +		if(*section == NULL) {  			pm_printf(PM_LOG_ERROR, _("config file %s, line %d: All directives must belong to a section.\n"),  					file, linenum);  			ret = 1; @@ -624,12 +615,12 @@ static int _parseconfig(const char *file, int parse_options,  			globfree(&globbuf);  			continue;  		} -		if(parse_options && strcmp(section, "options") == 0) { +		if(parse_options && strcmp(*section, "options") == 0) {  			/* we are either in options ... */  			if((ret = _parse_options(key, value, file, linenum)) != 0) {  				goto cleanup;  			} -		} else if (!parse_options && strcmp(section, "options") != 0) { +		} else if (!parse_options && strcmp(*section, "options") != 0) {  			/* ... or in a repo section */  			if(strcmp(key, "Server") == 0) {  				if(value == NULL) { @@ -661,16 +652,13 @@ static int _parseconfig(const char *file, int parse_options,  			} else {  				pm_printf(PM_LOG_WARNING,  						_("config file %s, line %d: directive '%s' in section '%s' not recognized.\n"), -						file, linenum, key, section); +						file, linenum, key, *section);  			}  		}  	}  cleanup:  	fclose(fp); -	if(section){ -		free(section); -	}  	pm_printf(PM_LOG_DEBUG, "config: finished parsing %s\n", file);  	return ret;  } @@ -682,22 +670,27 @@ cleanup:  int parseconfig(const char *file)  {  	int ret; +	char *section = NULL;  	/* the config parse is a two-pass affair. We first parse the entire thing for  	 * the [options] section so we can get all default and path options set.  	 * Next, we go back and parse everything but [options]. */  	/* call the real parseconfig function with a null section & db argument */  	pm_printf(PM_LOG_DEBUG, "parseconfig: options pass\n"); -	if((ret = _parseconfig(file, 1, NULL, NULL))) { +	if((ret = _parseconfig(file, 1, §ion, NULL))) { +		free(section);  		return ret;  	} +	free(section);  	/* call setlibpaths here to ensure we have called it at least once */  	if((ret = setlibpaths())) {  		return ret;  	}  	/* second pass, repo section parsing */ +	section = NULL;  	pm_printf(PM_LOG_DEBUG, "parseconfig: repo pass\n"); -	return _parseconfig(file, 0, NULL, NULL); +	return _parseconfig(file, 0, §ion, NULL); +	free(section);  }  /* vim: set ts=2 sw=2 noet: */ | 
