* 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);
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:
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);
/* 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);
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 */
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;
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)
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)
if (package) {
package->path = filename;
- package->confdir = confdir;
+ package->has_history = confdir;
uci_load_history(ctx, package, false);
}
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,
+);