From 0c51136398083908842f9faeb005cd5a5cc49273 Mon Sep 17 00:00:00 2001 From: javiplx@gmail.com Date: Thu, 07 Apr 2011 11:53:24 -0400 Subject: Introduce a new pkg_src list in global configuration to store the contents of 'dists' entries for apt-alike repositories git-svn-id: http://opkg.googlecode.com/svn/trunk@614 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c index 864d2ac..4711ce7 100644 --- a/libopkg/opkg_conf.c +++ b/libopkg/opkg_conf.c @@ -185,13 +185,14 @@ opkg_conf_set_option(const char *name, const char *value) static int opkg_conf_parse_file(const char *filename, - pkg_src_list_t *pkg_src_list) + pkg_src_list_t *pkg_src_list, + pkg_src_list_t *dist_src_list) { int line_num = 0; int err = 0; FILE *file; regex_t valid_line_re, comment_re; -#define regmatch_size 12 +#define regmatch_size 14 regmatch_t regmatch[regmatch_size]; file = fopen(filename, "r"); @@ -213,7 +214,7 @@ opkg_conf_parse_file(const char *filename, "^[[:space:]]*(\"([^\"]*)\"|([^[:space:]]*))" "[[:space:]]*(\"([^\"]*)\"|([^[:space:]]*))" "[[:space:]]*(\"([^\"]*)\"|([^[:space:]]*))" - "([[:space:]]+([^[:space:]]+))?[[:space:]]*$", + "([[:space:]]+([^[:space:]]+))?([[:space:]]+(.*))?[[:space:]]*$", REG_EXTENDED); if (err) goto err2; @@ -264,10 +265,19 @@ opkg_conf_parse_file(const char *filename, extra = NULL; if (regmatch[11].rm_so > 0) { + if (regmatch[13].rm_so > 0 && regmatch[13].rm_so!=regmatch[13].rm_eo ) + extra = xstrndup (line + regmatch[11].rm_so, + regmatch[13].rm_eo - regmatch[11].rm_so); + else extra = xstrndup (line + regmatch[11].rm_so, regmatch[11].rm_eo - regmatch[11].rm_so); } + if (regmatch[13].rm_so!=regmatch[13].rm_eo && strncmp(type, "dist", 4)!=0) { + opkg_msg(ERROR, "%s:%d: Ignoring config line with trailing garbage: `%s'\n", + filename, line_num, line); + } else { + /* We use the conf->tmp_dest_list below instead of conf->pkg_dest_list because we might encounter an offline_root option later and that would invalidate the @@ -276,6 +286,20 @@ opkg_conf_parse_file(const char *filename, tmp_src_nv_pair_list for sake of symmetry.) */ if (strcmp(type, "option") == 0) { opkg_conf_set_option(name, value); + } else if (strcmp(type, "dist") == 0) { + if (!nv_pair_list_find((nv_pair_list_t*) dist_src_list, name)) { + pkg_src_list_append (dist_src_list, name, value, extra, 0); + } else { + opkg_msg(ERROR, "Duplicate dist declaration (%s %s). " + "Skipping.\n", name, value); + } + } else if (strcmp(type, "dist/gz") == 0) { + if (!nv_pair_list_find((nv_pair_list_t*) dist_src_list, name)) { + pkg_src_list_append (dist_src_list, name, value, extra, 1); + } else { + opkg_msg(ERROR, "Duplicate dist declaration (%s %s). " + "Skipping.\n", name, value); + } } else if (strcmp(type, "src") == 0) { if (!nv_pair_list_find((nv_pair_list_t*) pkg_src_list, name)) { pkg_src_list_append (pkg_src_list, name, value, extra, 0); @@ -307,6 +331,8 @@ opkg_conf_parse_file(const char *filename, filename, line_num, line); } + } + free(type); free(name); free(value); @@ -412,6 +438,7 @@ int opkg_conf_init(void) { pkg_src_list_init(&conf->pkg_src_list); + pkg_src_list_init(&conf->dist_src_list); pkg_dest_list_init(&conf->pkg_dest_list); pkg_dest_list_init(&conf->tmp_dest_list); nv_pair_list_init(&conf->arch_list); @@ -443,7 +470,7 @@ opkg_conf_load(void) goto err0; } if (opkg_conf_parse_file(conf->conf_file, - &conf->pkg_src_list)) + &conf->pkg_src_list, &conf->dist_src_list)) goto err1; } @@ -472,7 +499,7 @@ opkg_conf_load(void) !strcmp(conf->conf_file, globbuf.gl_pathv[i])) continue; if ( opkg_conf_parse_file(globbuf.gl_pathv[i], - &conf->pkg_src_list)<0) { + &conf->pkg_src_list, &conf->dist_src_list)<0) { globfree(&globbuf); goto err1; } @@ -576,6 +603,7 @@ err2: } err1: pkg_src_list_deinit(&conf->pkg_src_list); + pkg_src_list_deinit(&conf->dist_src_list); pkg_dest_list_deinit(&conf->pkg_dest_list); nv_pair_list_deinit(&conf->arch_list); @@ -617,6 +645,7 @@ opkg_conf_deinit(void) free(conf->conf_file); pkg_src_list_deinit(&conf->pkg_src_list); + pkg_src_list_deinit(&conf->dist_src_list); pkg_dest_list_deinit(&conf->pkg_dest_list); nv_pair_list_deinit(&conf->arch_list); diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h index 0340ff2..3a60bc5 100644 --- a/libopkg/opkg_conf.h +++ b/libopkg/opkg_conf.h @@ -45,6 +45,7 @@ extern opkg_conf_t *conf; struct opkg_conf { pkg_src_list_t pkg_src_list; + pkg_src_list_t dist_src_list; pkg_dest_list_t pkg_dest_list; pkg_dest_list_t tmp_dest_list; nv_pair_list_t arch_list; -- cgit v0.9.1