X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=file.c;h=0a9b180921d3c5ba28170969301197137ed81efe;hp=7a576128c038ef81ffe777e34c80b0b43d2c3d95;hb=78f76bde7306cc9dd501b5325b2e40af8b22ad51;hpb=8e57ddf6b61e9e95e1f319b1def18789f19f9ee1 diff --git a/file.c b/file.c index 7a57612..0a9b180 100644 --- a/file.c +++ b/file.c @@ -502,8 +502,18 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u while (!feof(pctx->file)) { uci_getln(ctx, 0); + + UCI_TRAP_SAVE(ctx, error); if (pctx->buf[0]) uci_parse_line(ctx, single); + UCI_TRAP_RESTORE(ctx); + continue; +error: + if (ctx->flags & UCI_FLAG_PERROR) + uci_perror(ctx, NULL); + if ((ctx->errno != UCI_ERR_PARSE) || + (ctx->flags & UCI_FLAG_STRICT)) + UCI_THROW(ctx, ctx->errno); } if (package) @@ -526,9 +536,15 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u */ static FILE *uci_open_stream(struct uci_context *ctx, const char *filename, int pos, bool write) { + struct stat statbuf; FILE *file = NULL; int fd, ret; + if (!write && ((stat(filename, &statbuf) < 0) || + ((statbuf.st_mode & S_IFMT) != S_IFREG))) { + UCI_THROW(ctx, UCI_ERR_NOTFOUND); + } + fd = open(filename, (write ? O_RDWR | O_CREAT : O_RDONLY)); if (fd <= 0) goto error; @@ -645,7 +661,6 @@ done: int uci_load(struct uci_context *ctx, const char *name, struct uci_package **package) { - struct stat statbuf; char *filename; bool confdir; FILE *file = NULL; @@ -675,11 +690,6 @@ int uci_load(struct uci_context *ctx, const char *name, struct uci_package **pac break; } - if ((stat(filename, &statbuf) < 0) || - ((statbuf.st_mode & S_IFMT) != S_IFREG)) { - UCI_THROW(ctx, UCI_ERR_NOTFOUND); - } - file = uci_open_stream(ctx, filename, SEEK_SET, false); ctx->errno = 0; UCI_TRAP_SAVE(ctx, done); @@ -792,15 +802,17 @@ static inline char *get_filename(char *path) return p; } -char **uci_list_configs(struct uci_context *ctx) +int uci_list_configs(struct uci_context *ctx, char ***list) { char **configs; glob_t globbuf; int size, i; char *buf; + UCI_HANDLE_ERR(ctx); + if (glob(UCI_CONFDIR "/*", GLOB_MARK, NULL, &globbuf) != 0) - return NULL; + UCI_THROW(ctx, UCI_ERR_NOTFOUND); size = sizeof(char *) * (globbuf.gl_pathc + 1); for(i = 0; i < globbuf.gl_pathc; i++) { @@ -826,6 +838,8 @@ char **uci_list_configs(struct uci_context *ctx) strcpy(buf, p); buf += strlen(buf) + 1; } - return configs; + *list = configs; + + return 0; }