X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=list.c;h=00fca3f074a5075ac4c81abe0b3c8d556b68af7c;hp=8d73f11405ebad863a4c1fa5228b83c7f6620ccf;hb=508525c69e08a96031ed24f2d09e3bc2d1d33fca;hpb=f7df28b4d0155c780fa46a09d2dbcf7825faebae diff --git a/list.c b/list.c index 8d73f11..00fca3f 100644 --- a/list.c +++ b/list.c @@ -24,10 +24,10 @@ static inline void uci_list_init(struct uci_list *ptr) /* inserts a new list entry between two consecutive entries */ static inline void __uci_list_add(struct uci_list *prev, struct uci_list *next, struct uci_list *ptr) { - prev->next = ptr; next->prev = ptr; ptr->prev = prev; ptr->next = next; + prev->next = ptr; } /* inserts a new list entry at the tail of the list */ @@ -71,6 +71,7 @@ static struct uci_option *uci_add_option(struct uci_section *section, const char option->value = uci_strdup(ctx, value); uci_list_add(§ion->options, &option->list); UCI_TRAP_RESTORE(ctx); + return option; error: uci_drop_option(option); @@ -103,13 +104,16 @@ static struct uci_section *uci_add_section(struct uci_config *cfg, const char *t struct uci_context *ctx = cfg->ctx; UCI_TRAP_SAVE(ctx, error); + cfg->n_section++; section = (struct uci_section *) uci_malloc(ctx, sizeof(struct uci_section)); section->config = cfg; uci_list_init(§ion->list); uci_list_init(§ion->options); section->type = uci_strdup(ctx, type); - if (name) + if (name && name[0]) section->name = uci_strdup(ctx, name); + else + asprintf(§ion->name, "cfg%d", cfg->n_section); uci_list_add(&cfg->sections, §ion->list); UCI_TRAP_RESTORE(ctx); @@ -178,7 +182,18 @@ found: return 0; } -char **uci_list_configs(struct uci_context *ctx) +static inline char *get_filename(char *path) +{ + char *p; + + p = strrchr(path, '/'); + p++; + if (!*p) + return NULL; + return p; +} + +char **uci_list_configs() { char **configs; glob_t globbuf; @@ -189,8 +204,15 @@ char **uci_list_configs(struct uci_context *ctx) return NULL; size = sizeof(char *) * (globbuf.gl_pathc + 1); - for(i = 0; i < globbuf.gl_pathc; i++) - size += strlen(globbuf.gl_pathv[i]) + 1; + for(i = 0; i < globbuf.gl_pathc; i++) { + char *p; + + p = get_filename(globbuf.gl_pathv[i]); + if (!p) + continue; + + size += strlen(p) + 1; + } configs = malloc(size); if (!configs) @@ -199,8 +221,14 @@ char **uci_list_configs(struct uci_context *ctx) memset(configs, 0, size); buf = (char *) &configs[globbuf.gl_pathc + 1]; for(i = 0; i < globbuf.gl_pathc; i++) { + char *p; + + p = get_filename(globbuf.gl_pathv[i]); + if (!p) + continue; + configs[i] = buf; - strcpy(buf, globbuf.gl_pathv[i]); + strcpy(buf, p); buf += strlen(buf) + 1; } return configs;