X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=list.c;h=e89633e3486bae09688f72bef1afa4ffe25ce112;hp=5561778b1c47b22c4ce297cc1048b34c625d8ce2;hb=787fb6d4106cfd22485bd89d190be26e2a2c6178;hpb=f0be94e4d8d2a0c8ab35b932e88170cc37cca4af diff --git a/list.c b/list.c index 5561778..e89633e 100644 --- a/list.c +++ b/list.c @@ -153,6 +153,8 @@ uci_free_package(struct uci_package *p) if(!p) return; + if (p->path) + free(p->path); uci_foreach_element_safe(&p->sections, tmp, e) { uci_free_section(uci_to_section(e)); } @@ -174,7 +176,7 @@ uci_add_history(struct uci_context *ctx, struct uci_package *p, int cmd, char *s } -static struct uci_element *uci_lookup_list(struct uci_context *ctx, struct uci_list *list, char *name) +static struct uci_element *uci_lookup_list(struct uci_context *ctx, struct uci_list *list, const char *name) { struct uci_element *e; @@ -182,35 +184,35 @@ static struct uci_element *uci_lookup_list(struct uci_context *ctx, struct uci_l if (!strcmp(e->name, name)) return e; } - UCI_THROW(ctx, UCI_ERR_NOTFOUND); + return NULL; } -int uci_lookup(struct uci_context *ctx, struct uci_element **res, char *package, char *section, char *option) +int uci_lookup(struct uci_context *ctx, struct uci_element **res, struct uci_package *p, char *section, char *option) { struct uci_element *e; - struct uci_package *p; struct uci_section *s; struct uci_option *o; UCI_HANDLE_ERR(ctx); UCI_ASSERT(ctx, res != NULL); - UCI_ASSERT(ctx, package != NULL); - - e = uci_lookup_list(ctx, &ctx->root, package); - if (!section) - goto found; + UCI_ASSERT(ctx, p != NULL); + UCI_ASSERT(ctx, section != NULL); - p = uci_to_package(e); e = uci_lookup_list(ctx, &p->sections, section); - if (!option) - goto found; + if (!e) + goto notfound; - s = uci_to_section(e); - e = uci_lookup_list(ctx, &s->options, option); + if (option) { + s = uci_to_section(e); + e = uci_lookup_list(ctx, &s->options, option); + } -found: *res = e; return 0; + +notfound: + UCI_THROW(ctx, UCI_ERR_NOTFOUND); + return 0; } int uci_set_element_value(struct uci_context *ctx, struct uci_element **element, char *value) @@ -280,14 +282,11 @@ int uci_set(struct uci_context *ctx, char *package, char *section, char *option, UCI_ASSERT(ctx, package != NULL); UCI_ASSERT(ctx, section != NULL); - fprintf(stderr, "uci_set: '%s' '%s' '%s' = '%s'\n", package, section, option, value); - /* * look up the package, section and option (if set) * if the section/option is to be modified and it is not found * create a new element in the appropriate list */ - UCI_TRAP_SAVE(ctx, notfound); e = uci_lookup_list(ctx, &ctx->root, package); if (!e) goto notfound; @@ -296,15 +295,14 @@ int uci_set(struct uci_context *ctx, char *package, char *section, char *option, e = uci_lookup_list(ctx, &p->sections, section); if (!e) goto notfound; - s = uci_to_section(e); + s = uci_to_section(e); if (option) { e = uci_lookup_list(ctx, &s->options, option); if (!e) goto notfound; o = uci_to_option(e); } - UCI_TRAP_RESTORE(ctx); /* * no unknown element was supplied, assume that we can just update @@ -326,34 +324,26 @@ notfound: * an option was supplied, but the section wasn't found */ if (!p || (!s && option)) - UCI_THROW(ctx, ctx->errno); + UCI_THROW(ctx, UCI_ERR_NOTFOUND); /* now add the missing entry */ uci_add_history(ctx, p, UCI_CMD_ADD, section, option, value); if (s) uci_alloc_option(s, option, value); else - uci_alloc_section(p, section, value); + uci_alloc_section(p, value, section); return 0; } -int uci_unload(struct uci_context *ctx, const char *name) +int uci_unload(struct uci_context *ctx, struct uci_package *p) { struct uci_element *e; UCI_HANDLE_ERR(ctx); - UCI_ASSERT(ctx, name != NULL); - - uci_foreach_element(&ctx->root, e) { - if (!strcmp(e->name, name)) - goto found; - } - UCI_THROW(ctx, UCI_ERR_NOTFOUND); - -found: - uci_free_package(uci_to_package(e)); + UCI_ASSERT(ctx, p != NULL); + uci_free_package(p); return 0; }