{
char *tmp;
+ skip_whitespace(ctx, str);
tmp = next_arg(ctx, str, false, false);
if (*tmp && (ctx->flags & UCI_FLAG_STRICT))
uci_parse_error(ctx, *str, "too many arguments");
* 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_THROW(ctx, ctx->errno);
+ UCI_THROW(ctx, ctx->err);
} else
pctx->section = uci_alloc_section(pctx->package, type, name);
}
UCI_TRAP_RESTORE(ctx);
return;
error:
- UCI_THROW(ctx, ctx->errno);
+ UCI_THROW(ctx, ctx->err);
} else
uci_alloc_option(pctx->section, name, value);
}
static void uci_parse_line(struct uci_context *ctx, bool single)
{
struct uci_parse_context *pctx = ctx->pctx;
- char *word, *brk = NULL;
-
- for (word = strtok_r(pctx->buf, ";", &brk);
- word;
- word = strtok_r(NULL, ";", &brk)) {
-
- char *pbrk = NULL;
- word = strtok_r(word, " \t", &pbrk);
+ char *word, *brk;
+ word = pctx->buf;
+ do {
+ brk = NULL;
+ word = strtok_r(word, " \t", &brk);
if (!word)
- continue;
+ return;
switch(word[0]) {
+ case 0:
case '#':
return;
case 'p':
uci_parse_error(ctx, word, "unterminated command");
break;
}
- }
+ } while (1);
}
/* max number of characters that escaping adds to the string */
error:
if (ctx->flags & UCI_FLAG_PERROR)
uci_perror(ctx, NULL);
- if ((ctx->errno != UCI_ERR_PARSE) ||
+ if ((ctx->err != UCI_ERR_PARSE) ||
(ctx->flags & UCI_FLAG_STRICT))
- UCI_THROW(ctx, ctx->errno);
+ UCI_THROW(ctx, ctx->err);
}
uci_fixup_section(ctx, ctx->pctx->section);
+ if (!pctx->package && name)
+ uci_switch_config(ctx);
if (package)
*package = pctx->package;
if (pctx->merge)
if (path)
free(path);
uci_close_stream(f);
- if (ctx->errno)
- UCI_THROW(ctx, ctx->errno);
+ if (ctx->err)
+ UCI_THROW(ctx, ctx->err);
}
}
file = uci_open_stream(ctx, filename, SEEK_SET, false, false);
- ctx->errno = 0;
+ ctx->err = 0;
UCI_TRAP_SAVE(ctx, done);
UCI_INTERNAL(uci_import, ctx, file, name, &package, true);
UCI_TRAP_RESTORE(ctx);
done:
uci_close_stream(file);
- if (ctx->errno)
- UCI_THROW(ctx, ctx->errno);
+ if (ctx->err)
+ UCI_THROW(ctx, ctx->err);
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,
-};
+);