projects
/
project
/
uci.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
parser: fix precedence of quoting over ; as command terminator, thx to netprince...
[project/uci.git]
/
file.c
diff --git
a/file.c
b/file.c
index
9f59637
..
5360ef7
100644
(file)
--- a/
file.c
+++ b/
file.c
@@
-35,6
+35,7
@@
static void assert_eol(struct uci_context *ctx, char **str)
{
char *tmp;
{
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");
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
*/
* 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 (e)
UCI_THROW(ctx, UCI_ERR_DUPLICATE);
pctx->package = uci_alloc_package(ctx, name);
@@
-122,7
+123,8
@@
static void uci_parse_config(struct uci_context *ctx, char **str)
if (pctx->merge) {
UCI_TRAP_SAVE(ctx, error);
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_TRAP_RESTORE(ctx);
return;
error:
@@
-168,19
+170,17
@@
error:
static void uci_parse_line(struct uci_context *ctx, bool single)
{
struct uci_parse_context *pctx = ctx->pctx;
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)
if (!word)
-
continue
;
+
return
;
switch(word[0]) {
switch(word[0]) {
+ case 0:
case '#':
return;
case 'p':
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;
}
uci_parse_error(ctx, word, "unterminated command");
break;
}
- }
+ }
while (1);
}
/* max number of characters that escaping adds to the string */
}
/* max number of characters that escaping adds to the string */
@@
-293,7
+293,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 */
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);
uci_cleanup(ctx);
uci_alloc_parse_context(ctx);
@@
-330,6
+329,8
@@
error:
}
uci_fixup_section(ctx, ctx->pctx->section);
}
uci_fixup_section(ctx, ctx->pctx->section);
+ if (!pctx->package && name)
+ uci_switch_config(ctx);
if (package)
*package = pctx->package;
if (pctx->merge)
if (package)
*package = pctx->package;
if (pctx->merge)
@@
-375,7
+376,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);
/* 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);
if (!overwrite) {
name = uci_strdup(ctx, p->e.name);
path = uci_strdup(ctx, p->path);
@@
-392,7
+393,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;
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 */
*package = p;
/* freed together with the uci_package */
@@
-517,7
+518,7
@@
static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
if (package) {
package->path = filename;
if (package) {
package->path = filename;
- package->
confdir
= confdir;
+ package->
has_history
= confdir;
uci_load_history(ctx, package, false);
}
uci_load_history(ctx, package, false);
}
@@
-528,9
+529,8
@@
done:
return package;
}
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,
.load = uci_file_load,
.commit = uci_file_commit,
.list_configs = uci_list_config_files,
-
}
;
+
)
;