]> pilppa.com Git - uci.git/commitdiff
uci_revert api cleanup
authorFelix Fietkau <nbd@pi.lan>
Fri, 22 Aug 2008 18:39:37 +0000 (20:39 +0200)
committerFelix Fietkau <nbd@pi.lan>
Fri, 22 Aug 2008 18:39:37 +0000 (20:39 +0200)
cli.c
history.c
uci.h

diff --git a/cli.c b/cli.c
index 290dcbfddaae976af725cbf5d13530b2593a80aa..a1f4ce35f97a10bba7f00561d8b1cb4eed915efb 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -354,7 +354,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
                ret = uci_rename(ctx, &ptr);
                break;
        case CMD_REVERT:
-               ret = uci_revert(ctx, &ptr.p, ptr.section, ptr.option);
+               ret = uci_revert(ctx, &ptr);
                break;
        case CMD_SET:
                ret = uci_set(ctx, ptr.p, ptr.section, ptr.option, ptr.value, NULL);
index 07db1d3b77124236b888503bb5872da505af9e01..ae66f66c0f60ff8bcc4e54a283e83b48793ce252 100644 (file)
--- a/history.c
+++ b/history.c
@@ -324,16 +324,15 @@ done:
        uci_cleanup(ctx);
 }
 
-int uci_revert(struct uci_context *ctx, struct uci_package **pkg, const char *section, const char *option)
+int uci_revert(struct uci_context *ctx, struct uci_ptr *ptr)
 {
-       struct uci_package *p;
-       char *name = NULL;
+       char *package = NULL;
+       char *section = NULL;
+       char *option = NULL;
 
        UCI_HANDLE_ERR(ctx);
-       UCI_ASSERT(ctx, pkg != NULL);
-       p = *pkg;
-       UCI_ASSERT(ctx, p != NULL);
-       UCI_ASSERT(ctx, p->has_history);
+       expand_ptr(ctx, ptr, true);
+       UCI_ASSERT(ctx, ptr->p->has_history);
 
        /* 
         * - flush unwritten changes
@@ -343,20 +342,28 @@ int uci_revert(struct uci_context *ctx, struct uci_package **pkg, const char *se
         * - reload the package
         */
        UCI_TRAP_SAVE(ctx, error);
-       UCI_INTERNAL(uci_save, ctx, p);
-       name = uci_strdup(ctx, p->e.name);
+       UCI_INTERNAL(uci_save, ctx, ptr->p);
+
+       /* NB: need to clone package, section and option names, 
+        * as they may get freed on uci_free_package() */
+       package = uci_strdup(ctx, ptr->p->e.name);
+       section = uci_strdup(ctx, ptr->section);
+       option = uci_strdup(ctx, ptr->option);
 
-       *pkg = NULL;
-       uci_free_package(&p);
-       uci_filter_history(ctx, name, section, option);
+       uci_free_package(&ptr->p);
+       uci_filter_history(ctx, package, section, option);
 
-       UCI_INTERNAL(uci_load, ctx, name, &p);
+       UCI_INTERNAL(uci_load, ctx, package, &ptr->p);
        UCI_TRAP_RESTORE(ctx);
        ctx->err = 0;
 
 error:
-       if (name)
-               free(name);
+       if (package)
+               free(package);
+       if (section)
+               free(section);
+       if (option)
+               free(option);
        if (ctx->err)
                UCI_THROW(ctx, ctx->err);
        return 0;
diff --git a/uci.h b/uci.h
index ed1a83407ec003e3f364912c9f7db7627a79b67a..7866a75053daecf1e66a117e937f5c1ccb22af9b 100644 (file)
--- a/uci.h
+++ b/uci.h
@@ -247,11 +247,9 @@ extern int uci_add_history_path(struct uci_context *ctx, const char *dir);
 /**
  * uci_revert: revert all changes to a config item
  * @ctx: uci context
- * @p: pointer to a uci_package struct ptr (will be replaced by the revert)
- * @section: section name (optional)
- * @option option name (optional)
+ * @ptr: uci pointer
  */
-extern int uci_revert(struct uci_context *ctx, struct uci_package **p, const char *section, const char *option);
+extern int uci_revert(struct uci_context *ctx, struct uci_ptr *ptr);
 
 /**
  * uci_parse_argument: parse a shell-style argument, with an arbitrary quoting style