UCI_HANDLE_ERR(ctx);
UCI_ASSERT(ctx, str && package && section && option);
+ last = strchr(str, '=');
+ if (last) {
+ *last = 0;
+ last++;
+ }
+
*package = strtok(str, ".");
if (!*package || !uci_validate_name(*package))
goto error;
- last = *package;
*section = strtok(NULL, ".");
if (!*section)
goto lastval;
- last = *section;
*option = strtok(NULL, ".");
if (!*option)
goto lastval;
- last = *option;
-
lastval:
- last = strchr(last, '=');
if (last) {
if (!value)
goto error;
- *last = 0;
- last++;
if (!*last)
goto error;
*value = last;
struct uci_parse_context *pctx = ctx->pctx;
pctx->reason = reason;
- if ((pos < pctx->buf) || (pos > pctx->buf + pctx->bufsz))
- pctx->byte = 0;
- else
- pctx->byte = pos - pctx->buf;
+ pctx->byte = pos - pctx->buf;
UCI_THROW(ctx, UCI_ERR_PARSE);
}
return val;
}
-int uci_parse_argument(struct uci_context *ctx, char **str, char **result)
+int uci_parse_argument(struct uci_context *ctx, FILE *stream, char **str, char **result)
{
UCI_HANDLE_ERR(ctx);
- UCI_ASSERT(ctx, (str != NULL) && (*str != NULL));
+ UCI_ASSERT(ctx, str != NULL);
UCI_ASSERT(ctx, result != NULL);
+ if (ctx->pctx) {
+ if (ctx->pctx->file != stream) {
+ ctx->internal = true;
+ uci_cleanup(ctx);
+ }
+ } else {
+ uci_alloc_parse_context(ctx);
+ ctx->pctx->file = stream;
+ }
+ if (!*str) {
+ uci_getln(ctx, 0);
+ *str = ctx->pctx->buf;
+ }
+
*result = next_arg(ctx, str, false, false);
+
return 0;
}
}
fd = open(filename, mode, UCI_FILEMODE);
- if (fd <= 0)
+ if (fd < 0)
goto error;
if (flock(fd, (write ? LOCK_EX : LOCK_SH)) < 0)