Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> --- src/pacman/conf.c | 88 +++++++++++++++++++++++++++++-------------------------- src/pacman/conf.h | 9 ++++++ 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/pacman/conf.c b/src/pacman/conf.c index f75f3a7..bcfa12a 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -151,6 +151,16 @@ int config_free(config_t *oldconfig) return 0; } +void config_repo_free(config_repo_t *repo) +{ + if(repo == NULL) { + return; + } + free(repo->name); + FREELIST(repo->servers); + free(repo); +} + /** Helper function for download_with_xfercommand() */ static char *get_filename(const char *url) { @@ -750,14 +760,10 @@ static int setup_libalpm(void) * calling library methods. */ struct section_t { - /* useful for all sections */ const char *name; + config_repo_t *repo; int is_options; int parse_options; - /* db section option gathering */ - alpm_list_t *servers; - alpm_siglevel_t siglevel; - alpm_db_usage_t usage; }; static int process_usage(alpm_list_t *values, alpm_db_usage_t *usage, @@ -798,6 +804,7 @@ static int _parse_repo(const char *key, char *value, const char *file, int line, struct section_t *section) { int ret = 0; + config_repo_t *repo = section->repo; if(strcmp(key, "Server") == 0) { if(!value) { @@ -805,7 +812,7 @@ static int _parse_repo(const char *key, char *value, const char *file, file, line, key); ret = 1; } else { - section->servers = alpm_list_add(section->servers, strdup(value)); + repo->servers = alpm_list_add(repo->servers, strdup(value)); } } else if(strcmp(key, "SigLevel") == 0) { if(!value) { @@ -815,10 +822,10 @@ static int _parse_repo(const char *key, char *value, const char *file, alpm_list_t *values = NULL; setrepeatingoption(value, "SigLevel", &values); if(values) { - if(section->siglevel == ALPM_SIG_USE_DEFAULT) { - section->siglevel = config->siglevel; + if(repo->siglevel == ALPM_SIG_USE_DEFAULT) { + repo->siglevel = config->siglevel; } - ret = process_siglevel(values, §ion->siglevel, file, line); + ret = process_siglevel(values, &repo->siglevel, file, line); FREELIST(values); } } @@ -826,7 +833,7 @@ static int _parse_repo(const char *key, char *value, const char *file, alpm_list_t *values = NULL; setrepeatingoption(value, "Usage", &values); if(values) { - if(process_usage(values, §ion->usage, file, line)) { + if(process_usage(values, &repo->usage, file, line)) { FREELIST(values); return 1; } @@ -835,7 +842,7 @@ static int _parse_repo(const char *key, char *value, const char *file, } else { pm_printf(ALPM_LOG_WARNING, _("config file %s, line %d: directive '%s' in section '%s' not recognized.\n"), - file, line, key, section->name); + file, line, key, repo->name); } return ret; @@ -852,51 +859,42 @@ static int _parse_repo(const char *key, char *value, const char *file, */ static int finish_section(struct section_t *section) { - int ret = 0; alpm_list_t *i; alpm_db_t *db; + config_repo_t *repo = section->repo; pm_printf(ALPM_LOG_DEBUG, "config: finish section '%s'\n", section->name); /* parsing options (or nothing)- nothing to do except free the pieces */ - if(!section->name || section->parse_options || section->is_options) { - goto cleanup; + if(section->parse_options || !section->repo) { + return 0; } /* if we are not looking at options sections only, register a db */ - db = alpm_register_syncdb(config->handle, section->name, section->siglevel); + 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"), - section->name, alpm_strerror(alpm_errno(config->handle))); - ret = 1; - goto cleanup; + repo->name, alpm_strerror(alpm_errno(config->handle))); + return 1; } pm_printf(ALPM_LOG_DEBUG, - "setting usage of %d for %s repoistory\n", - section->usage == 0 ? ALPM_DB_USAGE_ALL : section->usage, - section->name); - alpm_db_set_usage(db, section->usage == 0 ? ALPM_DB_USAGE_ALL : section->usage); + "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); - for(i = section->servers; i; i = alpm_list_next(i)) { + 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, section->name, alpm_strerror(alpm_errno(config->handle))); - ret = 1; - goto cleanup; + value, repo->name, alpm_strerror(alpm_errno(config->handle))); + return 1; } - free(value); } -cleanup: - alpm_list_free(section->servers); - section->servers = NULL; - section->siglevel = ALPM_SIG_USE_DEFAULT; - section->name = NULL; - section->usage = 0; - return ret; + return 0; } static int _parse_directive(const char *file, int linenum, const char *name, @@ -904,13 +902,21 @@ static int _parse_directive(const char *file, int linenum, const char *name, { struct section_t *section = data; if(!key && !value) { - int ret = finish_section(section); - pm_printf(ALPM_LOG_DEBUG, "config: new section '%s'\n", name); + int ret = finish_section(data); section->name = name; - if(name && strcmp(name, "options") == 0) { + pm_printf(ALPM_LOG_DEBUG, "config: new section '%s'\n", name); + config_repo_free(section->repo); + section->repo = NULL; + section->is_options = 0; + if(!name) { + /* end of file, do nothing */ + } else if(strcmp(name, "options") == 0) { section->is_options = 1; - } else { - section->is_options = 0; + } else if(!section->parse_options) { + section->repo = calloc(sizeof(config_repo_t), 1); + section->repo->name = strdup(name); + section->repo->siglevel = ALPM_SIG_USE_DEFAULT; + section->repo->usage = 0; } return ret; } @@ -924,7 +930,7 @@ static int _parse_directive(const char *file, int linenum, const char *name, if(section->parse_options && section->is_options) { /* we are either in options ... */ return _parse_options(key, value, file, linenum); - } else if(!section->parse_options && !section->is_options) { + } else if(!section->parse_options && section->repo) { /* ... or in a repo section */ return _parse_repo(key, value, file, linenum, section); } @@ -941,8 +947,6 @@ int parseconfig(const char *file) int ret; struct section_t section; memset(§ion, 0, sizeof(struct section_t)); - section.siglevel = ALPM_SIG_USE_DEFAULT; - section.usage = 0; /* 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]. */ diff --git a/src/pacman/conf.h b/src/pacman/conf.h index e8cac50..97f006f 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -34,6 +34,13 @@ typedef struct __colstr_t { const char *nocolor; } colstr_t; +typedef struct __config_repo_t { + char *name; + alpm_list_t *servers; + alpm_db_usage_t usage; + alpm_siglevel_t siglevel; +} config_repo_t; + typedef struct __config_t { unsigned short op; unsigned short quiet; @@ -205,6 +212,8 @@ void enable_colors(int colors); config_t *config_new(void); int config_free(config_t *oldconfig); +void config_repo_free(config_repo_t *repo); + int config_set_arch(const char *arch); int parseconfig(const char *file); #endif /* _PM_CONF_H */ -- 1.9.2