Default values for configuration settings were being set during alpm setup and in some cases were never saved back to the original config struct. Refactoring all default settings into a separate function and saving them onto the original config struct will allow pacman-conf to resolve the defaults without having to setup alpm. Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> --- src/pacman/conf.c | 166 +++++++++++++++++++++++++++++------------------------- src/pacman/conf.h | 1 + 2 files changed, 89 insertions(+), 78 deletions(-) diff --git a/src/pacman/conf.c b/src/pacman/conf.c index e4980ed2..1ad75405 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -616,37 +616,39 @@ static int _parse_options(const char *key, char *value, return 0; } -static int _add_mirror(alpm_db_t *db, char *value) +static char *replace_server_vars(config_t *c, config_repo_t *r, const char *s) { - const char *dbname = alpm_db_get_name(db); - /* let's attempt a replacement for the current repo */ - char *temp = strreplace(value, "$repo", dbname); - /* let's attempt a replacement for the arch */ - const char *arch = config->arch; - char *server; - if(arch) { - server = strreplace(temp, "$arch", arch); + if(c->arch == NULL && strstr(s, "$arch")) { + pm_printf(ALPM_LOG_ERROR, + _("mirror '%s' contains the '%s' variable, but no '%s' is defined.\n"), + s, "$arch", "Architecture"); + return NULL; + } + + if(c->arch) { + char *temp, *replaced; + + replaced = strreplace(s, "$arch", c->arch); + + temp = replaced; + replaced = strreplace(temp, "$repo", r->name); free(temp); + + return replaced; } else { - if(strstr(temp, "$arch")) { - free(temp); - pm_printf(ALPM_LOG_ERROR, - _("mirror '%s' contains the '%s' variable, but no '%s' is defined.\n"), - value, "$arch", "Architecture"); - return 1; - } - server = temp; + return strreplace(s, "$repo", r->name); } +} - if(alpm_db_add_server(db, server) != 0) { +static int _add_mirror(alpm_db_t *db, char *value) +{ + if(alpm_db_add_server(db, value) != 0) { /* pm_errno is set by alpm_db_setserver */ pm_printf(ALPM_LOG_ERROR, _("could not add server URL to database '%s': %s (%s)\n"), - dbname, server, alpm_strerror(alpm_errno(config->handle))); - free(server); + alpm_db_get_name(db), value, alpm_strerror(alpm_errno(config->handle))); return 1; } - free(server); return 0; } @@ -655,9 +657,6 @@ static int register_repo(config_repo_t *repo) alpm_list_t *i; alpm_db_t *db; - repo->siglevel = merge_siglevel(config->siglevel, - repo->siglevel, repo->siglevel_mask); - db = alpm_register_syncdb(config->handle, repo->name, repo->siglevel); if(db == NULL) { pm_printf(ALPM_LOG_ERROR, _("could not register '%s' database (%s)\n"), @@ -665,18 +664,12 @@ static int register_repo(config_repo_t *repo) return 1; } - pm_printf(ALPM_LOG_DEBUG, - "setting usage of %d for %s repository\n", - repo->usage == 0 ? ALPM_DB_USAGE_ALL : repo->usage, - repo->name); - alpm_db_set_usage(db, repo->usage == 0 ? ALPM_DB_USAGE_ALL : repo->usage); + pm_printf(ALPM_LOG_DEBUG, "setting usage of %d for %s repository\n", + repo->usage, repo->name); + alpm_db_set_usage(db, repo->usage); for(i = repo->servers; i; i = alpm_list_next(i)) { - char *value = i->data; - if(_add_mirror(db, value) != 0) { - pm_printf(ALPM_LOG_ERROR, - _("could not add mirror '%s' to database '%s' (%s)\n"), - value, repo->name, alpm_strerror(alpm_errno(config->handle))); + if(_add_mirror(db, i->data) != 0) { return 1; } } @@ -699,25 +692,6 @@ static int setup_libalpm(void) pm_printf(ALPM_LOG_DEBUG, "setup_libalpm called\n"); - /* Configure root path first. If it is set and dbpath/logfile were not - * set, then set those as well to reside under the root. */ - if(config->rootdir) { - char path[PATH_MAX]; - if(!config->dbpath) { - snprintf(path, PATH_MAX, "%s/%s", config->rootdir, DBPATH + 1); - config->dbpath = strdup(path); - } - if(!config->logfile) { - snprintf(path, PATH_MAX, "%s/%s", config->rootdir, LOGFILE + 1); - config->logfile = strdup(path); - } - } else { - config->rootdir = strdup(ROOTDIR); - if(!config->dbpath) { - config->dbpath = strdup(DBPATH); - } - } - /* initialize library */ handle = alpm_initialize(config->rootdir, config->dbpath, &err); if(!handle) { @@ -740,7 +714,6 @@ static int setup_libalpm(void) alpm_option_set_dbext(handle, ".files"); } - config->logfile = config->logfile ? config->logfile : strdup(LOGFILE); ret = alpm_option_set_logfile(handle, config->logfile); if(ret != 0) { pm_printf(ALPM_LOG_ERROR, _("problem setting logfile '%s' (%s)\n"), @@ -750,7 +723,6 @@ static int setup_libalpm(void) /* Set GnuPG's home directory. This is not relative to rootdir, even if * rootdir is defined. Reasoning: gpgdir contains configuration data. */ - config->gpgdir = config->gpgdir ? config->gpgdir : strdup(GPGDIR); ret = alpm_option_set_gpgdir(handle, config->gpgdir); if(ret != 0) { pm_printf(ALPM_LOG_ERROR, _("problem setting gpgdir '%s' (%s)\n"), @@ -760,39 +732,21 @@ static int setup_libalpm(void) /* Set user hook directory. This is not relative to rootdir, even if * rootdir is defined. Reasoning: hookdir contains configuration data. */ - if(config->hookdirs == NULL) { - if((ret = alpm_option_add_hookdir(handle, HOOKDIR)) != 0) { + /* add hook directories 1-by-1 to avoid overwriting the system directory */ + for(i = config->hookdirs; i; i = alpm_list_next(i)) { + if((ret = alpm_option_add_hookdir(handle, i->data)) != 0) { pm_printf(ALPM_LOG_ERROR, _("problem adding hookdir '%s' (%s)\n"), - HOOKDIR, alpm_strerror(alpm_errno(handle))); + (char *) i->data, alpm_strerror(alpm_errno(handle))); return ret; } - } else { - /* add hook directories 1-by-1 to avoid overwriting the system directory */ - for(i = config->hookdirs; i; i = alpm_list_next(i)) { - if((ret = alpm_option_add_hookdir(handle, i->data)) != 0) { - pm_printf(ALPM_LOG_ERROR, _("problem adding hookdir '%s' (%s)\n"), - (char *) i->data, alpm_strerror(alpm_errno(handle))); - return ret; - } - } } - /* add a default cachedir if one wasn't specified */ - if(config->cachedirs == NULL) { - alpm_option_add_cachedir(handle, CACHEDIR); - } else { - alpm_option_set_cachedirs(handle, config->cachedirs); - } + alpm_option_set_cachedirs(handle, config->cachedirs); alpm_option_set_overwrite_files(handle, config->overwrite_files); alpm_option_set_default_siglevel(handle, config->siglevel); - config->localfilesiglevel = merge_siglevel(config->siglevel, - config->localfilesiglevel, config->localfilesiglevel_mask); - config->remotefilesiglevel = merge_siglevel(config->siglevel, - config->remotefilesiglevel, config->remotefilesiglevel_mask); - alpm_option_set_local_file_siglevel(handle, config->localfilesiglevel); alpm_option_set_remote_file_siglevel(handle, config->remotefilesiglevel); @@ -1036,6 +990,59 @@ static int _parse_directive(const char *file, int linenum, const char *name, } } +int setdefaults(config_t *c) +{ + alpm_list_t *i; + +#define SETDEFAULT(opt, val) if(!opt) { opt = val; if(!opt) { return -1; } } + + if(c->rootdir) { + char path[PATH_MAX]; + if(!c->dbpath) { + snprintf(path, PATH_MAX, "%s/%s", c->rootdir, DBPATH + 1); + SETDEFAULT(c->dbpath, strdup(path)); + } + if(!c->logfile) { + snprintf(path, PATH_MAX, "%s/%s", c->rootdir, LOGFILE + 1); + SETDEFAULT(c->logfile, strdup(path)); + } + } else { + SETDEFAULT(c->rootdir, strdup(ROOTDIR)); + SETDEFAULT(c->dbpath, strdup(DBPATH)); + } + + SETDEFAULT(c->logfile, strdup(LOGFILE)); + SETDEFAULT(c->gpgdir, strdup(GPGDIR)); + SETDEFAULT(c->cachedirs, alpm_list_add(NULL, strdup(CACHEDIR))); + SETDEFAULT(c->hookdirs, alpm_list_add(NULL, strdup(HOOKDIR))); + SETDEFAULT(c->cleanmethod, PM_CLEAN_KEEPINST); + + c->localfilesiglevel = merge_siglevel(c->siglevel, + c->localfilesiglevel, c->localfilesiglevel_mask); + c->remotefilesiglevel = merge_siglevel(c->siglevel, + c->remotefilesiglevel, c->remotefilesiglevel_mask); + + for(i = c->repos; i; i = i->next) { + config_repo_t *r = i->data; + alpm_list_t *j; + SETDEFAULT(r->usage, ALPM_DB_USAGE_ALL); + r->siglevel = merge_siglevel(c->siglevel, r->siglevel, r->siglevel_mask); + for(j = r->servers; j; j = j->next) { + char *newurl = replace_server_vars(c, r, j->data); + if(newurl == NULL) { + return -1; + } else { + free(j->data); + j->data = newurl; + } + } + } + +#undef SETDEFAULT + + return 0; +} + int parseconfigfile(const char *file) { struct section_t section; @@ -1054,6 +1061,9 @@ int parseconfig(const char *file) if((ret = parseconfigfile(file))) { return ret; } + if((ret = setdefaults(config))) { + return ret; + } pm_printf(ALPM_LOG_DEBUG, "config: finished parsing %s\n", file); if((ret = setup_libalpm())) { return ret; diff --git a/src/pacman/conf.h b/src/pacman/conf.h index e937051b..786eec6e 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -243,6 +243,7 @@ void config_repo_free(config_repo_t *repo); int config_set_arch(const char *arch); int parseconfig(const char *file); int parseconfigfile(const char *file); +int setdefaults(config_t *c); #endif /* PM_CONF_H */ /* vim: set noet: */ -- 2.15.1