X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=libuci.c;h=bc68462fad19036288ba609a01fb20f580cc6810;hp=5b5db54718a5bb6dc20fc52ade8404397aa6a9f3;hb=00d91c8ca4a5d35d5c3706d0042f0e57cefa3d12;hpb=51b60a322aff3fd1045fb6c9eb289ade2de54e71 diff --git a/libuci.c b/libuci.c index 5b5db54..bc68462 100644 --- a/libuci.c +++ b/libuci.c @@ -56,7 +56,7 @@ struct uci_context *uci_alloc_context(void) uci_list_init(&ctx->root); uci_list_init(&ctx->history_path); uci_list_init(&ctx->backends); - ctx->flags = UCI_FLAG_STRICT; + ctx->flags = UCI_FLAG_STRICT | UCI_FLAG_SAVED_HISTORY; ctx->confdir = (char *) uci_confdir; ctx->savedir = (char *) uci_savedir; @@ -85,8 +85,8 @@ void uci_free_context(struct uci_context *ctx) uci_foreach_element_safe(&ctx->history_path, tmp, e) { uci_free_element(e); } - free(ctx); UCI_TRAP_RESTORE(ctx); + free(ctx); ignore: return; @@ -130,9 +130,24 @@ static void uci_cleanup(struct uci_context *ctx) free(pctx); } -void uci_perror(struct uci_context *ctx, const char *prefix) +void +uci_perror(struct uci_context *ctx, const char *str) +{ + uci_get_errorstr(ctx, NULL, str); +} + +void +uci_get_errorstr(struct uci_context *ctx, char **dest, const char *prefix) { + static char error_info[128]; int err; + const char *format = + "%s%s" /* prefix */ + "%s%s" /* function */ + "%s" /* error */ + "%s"; /* details */ + + error_info[0] = 0; if (!ctx) err = UCI_ERR_INVAL; @@ -142,22 +157,30 @@ void uci_perror(struct uci_context *ctx, const char *prefix) if ((err < 0) || (err >= UCI_ERR_LAST)) err = UCI_ERR_UNKNOWN; - if (prefix) - fprintf(stderr, "%s: ", prefix); - if (ctx->func) - fprintf(stderr, "%s: ", ctx->func); - switch (err) { case UCI_ERR_PARSE: if (ctx->pctx) { - fprintf(stderr, "%s (%s) at line %d, byte %d\n", uci_errstr[err], (ctx->pctx->reason ? ctx->pctx->reason : "unknown"), ctx->pctx->line, ctx->pctx->byte); + snprintf(error_info, sizeof(error_info) - 1, " (%s) at line %d, byte %d", (ctx->pctx->reason ? ctx->pctx->reason : "unknown"), ctx->pctx->line, ctx->pctx->byte); break; } - /* fall through */ + break; default: - fprintf(stderr, "%s\n", uci_errstr[err]); break; } + if (dest) + asprintf(dest, format, + (prefix ? prefix : ""), (prefix ? ": " : ""), + (ctx->func ? ctx->func : ""), (ctx->func ? ": " : ""), + uci_errstr[err], + error_info); + else { + strcat(error_info, "\n"); + fprintf(stderr, format, + (prefix ? prefix : ""), (prefix ? ": " : ""), + (ctx->func ? ctx->func : ""), (ctx->func ? ": " : ""), + uci_errstr[err], + error_info); + } } int uci_list_configs(struct uci_context *ctx, char ***list)