projects
/
project
/
uci.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
implement extended uci lookup syntax
[project/uci.git]
/
file.c
diff --git
a/file.c
b/file.c
index
29ff318
..
ae0008f
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");
@@
-122,11
+123,12
@@
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:
- UCI_THROW(ctx, ctx->err
no
);
+ UCI_THROW(ctx, ctx->err);
} else
pctx->section = uci_alloc_section(pctx->package, type, name);
}
} 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_TRAP_RESTORE(ctx);
return;
error:
- UCI_THROW(ctx, ctx->err
no
);
+ UCI_THROW(ctx, ctx->err);
} else
uci_alloc_option(pctx->section, name, value);
}
} else
uci_alloc_option(pctx->section, name, value);
}
@@
-168,38
+170,44
@@
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':
if ((word[1] == 0) || !strcmp(word + 1, "ackage"))
uci_parse_package(ctx, &word, single);
case '#':
return;
case 'p':
if ((word[1] == 0) || !strcmp(word + 1, "ackage"))
uci_parse_package(ctx, &word, single);
+ else
+ goto invalid;
break;
case 'c':
if ((word[1] == 0) || !strcmp(word + 1, "onfig"))
uci_parse_config(ctx, &word);
break;
case 'c':
if ((word[1] == 0) || !strcmp(word + 1, "onfig"))
uci_parse_config(ctx, &word);
+ else
+ goto invalid;
break;
case 'o':
if ((word[1] == 0) || !strcmp(word + 1, "ption"))
uci_parse_option(ctx, &word);
break;
case 'o':
if ((word[1] == 0) || !strcmp(word + 1, "ption"))
uci_parse_option(ctx, &word);
+ else
+ goto invalid;
break;
default:
break;
default:
- uci_parse_error(ctx, word, "unterminated command");
- break;
+ goto invalid;
}
}
- }
+ continue;
+invalid:
+ uci_parse_error(ctx, word, "invalid command");
+ } while (1);
}
/* max number of characters that escaping adds to the string */
}
/* max number of characters that escaping adds to the string */
@@
-208,42
+216,47
@@
static void uci_parse_line(struct uci_context *ctx, bool single)
/*
* escape an uci string for export
*/
/*
* escape an uci string for export
*/
-static char *uci_escape(struct uci_context *ctx, char *str)
+static char *uci_escape(struct uci_context *ctx, c
onst c
har *str)
{
{
- c
har *s, *p
;
- int
po
s = 0;
+ c
onst char *end
;
+ int
of
s = 0;
if (!ctx->buf) {
ctx->bufsz = LINEBUF;
ctx->buf = malloc(LINEBUF);
}
if (!ctx->buf) {
ctx->bufsz = LINEBUF;
ctx->buf = malloc(LINEBUF);
}
- s = str;
- p = strchr(str, '\'');
- if (!p)
- return str;
+ while (1) {
+ int len;
- do {
- int len = p - s;
- if (len > 0) {
- if (p + sizeof(UCI_QUOTE_ESCAPE) - str >= ctx->bufsz) {
- ctx->bufsz *= 2;
- ctx->buf = realloc(ctx->buf, ctx->bufsz);
- if (!ctx->buf)
- UCI_THROW(ctx, UCI_ERR_MEM);
- }
- memcpy(&ctx->buf[pos], s, len);
- pos += len;
+ end = strchr(str, '\'');
+ if (!end)
+ end = str + strlen(str);
+ len = end - str;
+
+ /* make sure that we have enough room in the buffer */
+ while (ofs + len + sizeof(UCI_QUOTE_ESCAPE) + 1 > ctx->bufsz) {
+ ctx->bufsz *= 2;
+ ctx->buf = uci_realloc(ctx, ctx->buf, ctx->bufsz);
}
}
- strcpy(&ctx->buf[pos], UCI_QUOTE_ESCAPE);
- pos += sizeof(UCI_QUOTE_ESCAPE);
- s = p + 1;
- } while ((p = strchr(s, '\'')));
+ /* copy the string until the character before the quote */
+ memcpy(&ctx->buf[ofs], str, len);
+ ofs += len;
+
+ /* end of string? return the buffer */
+ if (*end == 0)
+ break;
+
+ memcpy(&ctx->buf[ofs], UCI_QUOTE_ESCAPE, sizeof(UCI_QUOTE_ESCAPE));
+ ofs += strlen(&ctx->buf[ofs]);
+ str = end + 1;
+ }
+
+ ctx->buf[ofs] = 0;
return ctx->buf;
}
return ctx->buf;
}
-
/*
* export a single config package to a file stream
*/
/*
* export a single config package to a file stream
*/
@@
-309,7
+322,7
@@
int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u
* NB: the config file can still override the package name
*/
if (name) {
* NB: the config file can still override the package name
*/
if (name) {
- UCI_ASSERT(ctx, uci_validate_
name(nam
e));
+ UCI_ASSERT(ctx, uci_validate_
str(name, fals
e));
pctx->name = name;
}
pctx->name = name;
}
@@
-323,12
+336,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);
error:
if (ctx->flags & UCI_FLAG_PERROR)
uci_perror(ctx, NULL);
- if ((ctx->err
no
!= UCI_ERR_PARSE) ||
+ if ((ctx->err != UCI_ERR_PARSE) ||
(ctx->flags & UCI_FLAG_STRICT))
(ctx->flags & UCI_FLAG_STRICT))
- UCI_THROW(ctx, ctx->err
no
);
+ UCI_THROW(ctx, ctx->err);
}
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)
@@
-348,7
+363,7
@@
static char *uci_config_path(struct uci_context *ctx, const char *name)
{
char *filename;
{
char *filename;
- UCI_ASSERT(ctx, uci_validate_
name(nam
e));
+ UCI_ASSERT(ctx, uci_validate_
str(name, fals
e));
filename = uci_malloc(ctx, strlen(name) + strlen(ctx->confdir) + 2);
sprintf(filename, "%s/%s", ctx->confdir, name);
filename = uci_malloc(ctx, strlen(name) + strlen(ctx->confdir) + 2);
sprintf(filename, "%s/%s", ctx->confdir, name);
@@
-419,8
+434,8
@@
done:
if (path)
free(path);
uci_close_stream(f);
if (path)
free(path);
uci_close_stream(f);
- if (ctx->err
no
)
- UCI_THROW(ctx, ctx->err
no
);
+ if (ctx->err)
+ UCI_THROW(ctx, ctx->err);
}
}
@@
-474,6
+489,9
@@
static char **uci_list_config_files(struct uci_context *ctx)
if (!p)
continue;
if (!p)
continue;
+ if (!uci_validate_name(p))
+ continue;
+
configs[i] = buf;
strcpy(buf, p);
buf += strlen(buf) + 1;
configs[i] = buf;
strcpy(buf, p);
buf += strlen(buf) + 1;
@@
-509,7
+527,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);
}
file = uci_open_stream(ctx, filename, SEEK_SET, false, false);
- ctx->err
no
= 0;
+ ctx->err = 0;
UCI_TRAP_SAVE(ctx, done);
UCI_INTERNAL(uci_import, ctx, file, name, &package, true);
UCI_TRAP_RESTORE(ctx);
UCI_TRAP_SAVE(ctx, done);
UCI_INTERNAL(uci_import, ctx, file, name, &package, true);
UCI_TRAP_RESTORE(ctx);
@@
-522,8
+540,8
@@
static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
done:
uci_close_stream(file);
done:
uci_close_stream(file);
- if (ctx->err
no
)
- UCI_THROW(ctx, ctx->err
no
);
+ if (ctx->err)
+ UCI_THROW(ctx, ctx->err);
return package;
}
return package;
}