X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=file.c;h=13fdd3bfb9d3cd4930cfb20f679582350a1dbd1e;hp=883e36006e39b84390906943af13ac69365e49f0;hb=66311debd9b145ae37087df7c7f3ed16a3852090;hpb=c90d9cb8ba073d1c98e61591303aa96300750940 diff --git a/file.c b/file.c index 883e360..13fdd3b 100644 --- a/file.c +++ b/file.c @@ -35,6 +35,7 @@ static void assert_eol(struct uci_context *ctx, char **str) { 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"); @@ -69,7 +70,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,11 +123,12 @@ 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: - UCI_THROW(ctx, ctx->errno); + UCI_THROW(ctx, ctx->err); } else pctx->section = uci_alloc_section(pctx->package, type, name); } @@ -156,7 +158,7 @@ static void uci_parse_option(struct uci_context *ctx, char **str) UCI_TRAP_RESTORE(ctx); return; error: - UCI_THROW(ctx, ctx->errno); + UCI_THROW(ctx, ctx->err); } else uci_alloc_option(pctx->section, name, value); } @@ -168,19 +170,17 @@ error: 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': @@ -199,7 +199,7 @@ static void uci_parse_line(struct uci_context *ctx, bool single) uci_parse_error(ctx, word, "unterminated command"); break; } - } + } while (1); } /* max number of characters that escaping adds to the string */ @@ -323,12 +323,14 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u 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) @@ -419,8 +421,8 @@ done: if (path) free(path); uci_close_stream(f); - if (ctx->errno) - UCI_THROW(ctx, ctx->errno); + if (ctx->err) + UCI_THROW(ctx, ctx->err); } @@ -509,7 +511,7 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na } 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); @@ -522,8 +524,8 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na done: uci_close_stream(file); - if (ctx->errno) - UCI_THROW(ctx, ctx->errno); + if (ctx->err) + UCI_THROW(ctx, ctx->err); return package; }