X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=list.c;h=b644523bc5760c36e3a4cb8cdc11fc625dcf8153;hp=4fe511670e409ef06889783bee2092d3b12d3766;hb=4094cedb83a0b92a179af13d1781a8fd7d3d943e;hpb=0d93aa6955690384f76da04a17831aa3a2d116cf diff --git a/list.c b/list.c index 4fe5116..b644523 100644 --- a/list.c +++ b/list.c @@ -144,34 +144,6 @@ uci_free_section(struct uci_section *s) uci_free_element(&s->e); } -static struct uci_package * -uci_alloc_package(struct uci_context *ctx, const char *name) -{ - struct uci_package *p; - - p = uci_alloc_element(ctx, package, name, 0); - p->ctx = ctx; - uci_list_init(&p->sections); - uci_list_init(&p->history); - return p; -} - -static void -uci_free_package(struct uci_package *p) -{ - struct uci_element *e, *tmp; - - if(!p) - return; - - if (p->path) - free(p->path); - uci_foreach_element_safe(&p->sections, tmp, e) { - uci_free_section(uci_to_section(e)); - } - uci_free_element(&p->e); -} - /* record a change that was done to a package */ static void uci_add_history(struct uci_context *ctx, struct uci_package *p, int cmd, char *section, char *option, char *value) @@ -210,6 +182,39 @@ uci_free_history(struct uci_history *h) uci_free_element(&h->e); } +static struct uci_package * +uci_alloc_package(struct uci_context *ctx, const char *name) +{ + struct uci_package *p; + + p = uci_alloc_element(ctx, package, name, 0); + p->ctx = ctx; + uci_list_init(&p->sections); + uci_list_init(&p->history); + return p; +} + +static void +uci_free_package(struct uci_package **package) +{ + struct uci_element *e, *tmp; + struct uci_package *p = *package; + + if(!p) + return; + + if (p->path) + free(p->path); + uci_foreach_element_safe(&p->sections, tmp, e) { + uci_free_section(uci_to_section(e)); + } + uci_foreach_element_safe(&p->history, tmp, e) { + uci_free_history(uci_to_history(e)); + } + uci_free_element(&p->e); + *package = NULL; +} + static struct uci_element *uci_lookup_list(struct uci_context *ctx, struct uci_list *list, const char *name) { struct uci_element *e; @@ -407,7 +412,10 @@ int uci_set(struct uci_context *ctx, struct uci_package *p, char *section, char * if the section/option is to be modified and it is not found * create a new element in the appropriate list */ - UCI_INTERNAL(uci_lookup, ctx, &e, p, section, NULL); + e = uci_lookup_list(ctx, &p->sections, section); + if (!e) + goto notfound; + s = uci_to_section(e); if (option) { e = uci_lookup_list(ctx, &s->options, option); @@ -459,7 +467,7 @@ int uci_unload(struct uci_context *ctx, struct uci_package *p) UCI_HANDLE_ERR(ctx); UCI_ASSERT(ctx, p != NULL); - uci_free_package(p); + uci_free_package(&p); return 0; }