add feature flags for the build process, improve automatic rebuild
[project/uci.git] / file.c
diff --git a/file.c b/file.c
index 62ab1a8..d320ba6 100644 (file)
--- a/file.c
+++ b/file.c
@@ -69,7 +69,7 @@ static void uci_switch_config(struct uci_context *ctx)
         * if an older config under the same name exists, unload it
         * ignore errors here, e.g. if the config was not found
         */
-       e = uci_lookup_list(ctx, &ctx->root, name);
+       e = uci_lookup_list(&ctx->root, name);
        if (e)
                UCI_THROW(ctx, UCI_ERR_DUPLICATE);
        pctx->package = uci_alloc_package(ctx, name);
@@ -122,7 +122,8 @@ static void uci_parse_config(struct uci_context *ctx, char **str)
 
        if (pctx->merge) {
                UCI_TRAP_SAVE(ctx, error);
-               uci_set(ctx, pctx->package, name, NULL, type, NULL);
+               if (uci_set(ctx, pctx->package, name, NULL, type, NULL) != UCI_OK)
+                       goto error;
                UCI_TRAP_RESTORE(ctx);
                return;
 error:
@@ -293,7 +294,6 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u
        UCI_HANDLE_ERR(ctx);
 
        /* make sure no memory from previous parse attempts is leaked */
-       ctx->internal = true;
        uci_cleanup(ctx);
 
        uci_alloc_parse_context(ctx);
@@ -375,7 +375,7 @@ void uci_file_commit(struct uci_context *ctx, struct uci_package **package, bool
 
        /* flush unsaved changes and reload from history file */
        UCI_TRAP_SAVE(ctx, done);
-       if (p->confdir) {
+       if (p->has_history) {
                if (!overwrite) {
                        name = uci_strdup(ctx, p->e.name);
                        path = uci_strdup(ctx, p->path);
@@ -392,7 +392,7 @@ void uci_file_commit(struct uci_context *ctx, struct uci_package **package, bool
                        UCI_INTERNAL(uci_import, ctx, f, name, &p, true);
 
                        p->path = path;
-                       p->confdir = true;
+                       p->has_history = true;
                        *package = p;
 
                        /* freed together with the uci_package */
@@ -442,7 +442,7 @@ static inline char *get_filename(char *path)
        return p;
 }
 
-int uci_list_configs(struct uci_context *ctx, char ***list)
+static char **uci_list_config_files(struct uci_context *ctx)
 {
        char **configs;
        glob_t globbuf;
@@ -450,8 +450,6 @@ int uci_list_configs(struct uci_context *ctx, char ***list)
        char *buf;
        char *dir;
 
-       UCI_HANDLE_ERR(ctx);
-
        dir = uci_malloc(ctx, strlen(ctx->confdir) + 1 + sizeof("/*"));
        sprintf(dir, "%s/*", ctx->confdir);
        if (glob(dir, GLOB_MARK, NULL, &globbuf) != 0)
@@ -481,10 +479,8 @@ int uci_list_configs(struct uci_context *ctx, char ***list)
                strcpy(buf, p);
                buf += strlen(buf) + 1;
        }
-       *list = configs;
        free(dir);
-
-       return 0;
+       return configs;
 }
 
 static struct uci_package *uci_file_load(struct uci_context *ctx, const char *name)
@@ -521,7 +517,7 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
 
        if (package) {
                package->path = filename;
-               package->confdir = confdir;
+               package->has_history = confdir;
                uci_load_history(ctx, package, false);
        }
 
@@ -532,8 +528,8 @@ done:
        return package;
 }
 
-static struct uci_backend uci_file_backend = {
-       .name = "file",
+static UCI_BACKEND(uci_file_backend, "file",
        .load = uci_file_load,
        .commit = uci_file_commit,
-};
+       .list_configs = uci_list_config_files,
+);