X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=list.c;h=8d73f11405ebad863a4c1fa5228b83c7f6620ccf;hp=addfc7366413ecc69f4f6073cc848a0d54893586;hb=f7df28b4d0155c780fa46a09d2dbcf7825faebae;hpb=5e35ebaeb9da2e5fc7f455b6da9904b5187b0d06 diff --git a/list.c b/list.c index addfc73..8d73f11 100644 --- a/list.c +++ b/list.c @@ -12,6 +12,8 @@ * GNU General Public License for more details. */ +#include + /* initialize a list head/item */ static inline void uci_list_init(struct uci_list *ptr) { @@ -119,7 +121,7 @@ error: return NULL; } -static void uci_drop_file(struct uci_config *cfg) +static void uci_drop_config(struct uci_config *cfg) { struct uci_section *s; @@ -137,7 +139,7 @@ static void uci_drop_file(struct uci_config *cfg) } -static struct uci_config *uci_alloc_file(struct uci_context *ctx, const char *name) +static struct uci_config *uci_alloc_config(struct uci_context *ctx, const char *name) { struct uci_config *cfg = NULL; @@ -151,8 +153,56 @@ static struct uci_config *uci_alloc_file(struct uci_context *ctx, const char *na return cfg; error: - uci_drop_file(cfg); + uci_drop_config(cfg); UCI_THROW(ctx, ctx->errno); return NULL; } +int uci_unload(struct uci_context *ctx, const char *name) +{ + struct uci_config *cfg; + + UCI_HANDLE_ERR(ctx); + UCI_ASSERT(ctx, name != NULL); + + uci_foreach_entry(config, &ctx->root, cfg) { + if (!strcmp(cfg->name, name)) + goto found; + } + UCI_THROW(ctx, UCI_ERR_NOTFOUND); + +found: + uci_list_del(&cfg->list); + uci_drop_config(cfg); + + return 0; +} + +char **uci_list_configs(struct uci_context *ctx) +{ + char **configs; + glob_t globbuf; + int size, i; + char *buf; + + if (glob(UCI_CONFDIR "/*", GLOB_MARK, NULL, &globbuf) != 0) + return NULL; + + size = sizeof(char *) * (globbuf.gl_pathc + 1); + for(i = 0; i < globbuf.gl_pathc; i++) + size += strlen(globbuf.gl_pathv[i]) + 1; + + configs = malloc(size); + if (!configs) + return NULL; + + memset(configs, 0, size); + buf = (char *) &configs[globbuf.gl_pathc + 1]; + for(i = 0; i < globbuf.gl_pathc; i++) { + configs[i] = buf; + strcpy(buf, globbuf.gl_pathv[i]); + buf += strlen(buf) + 1; + } + return configs; +} +