From fa745fb4677c3de37aad93b180fe9475179eb7e6 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sat, 13 Jan 2018 11:49:58 -0500 Subject: extract default settings to separate function 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 Signed-off-by: Allan McRae --- src/pacman/conf.c | 166 +++++++++++++++++++++++++++++------------------------- src/pacman/conf.h | 1 + 2 files changed, 89 insertions(+), 78 deletions(-) (limited to 'src') 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: */ -- cgit v1.2.3-70-g09d2