diff options
author | Felix Fietkau <nbd@openwrt.org> | 2008-08-27 21:43:08 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2008-08-27 21:43:08 +0200 |
commit | 7d69106b37851e90bd8660c91d906492f6d7d148 (patch) | |
tree | 340d6a5426c8c4995c11566a9d6f60fc0c8322e5 | |
parent | aa5b36c343894dc01ab857f0c7ab3aa1a792fc05 (diff) | |
download | uci-7d69106b37851e90bd8660c91d906492f6d7d148.tar.gz |
extend api to be able to get a full error string instead of printing it
-rw-r--r-- | libuci.c | 39 | ||||
-rw-r--r-- | uci.h | 10 |
2 files changed, 40 insertions, 9 deletions
@@ -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\n"; /* details */ + + error_info[0] = 0; if (!ctx) err = UCI_ERR_INVAL; @@ -142,22 +157,28 @@ 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), " (%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 + 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) @@ -84,6 +84,16 @@ extern void uci_free_context(struct uci_context *ctx); extern void uci_perror(struct uci_context *ctx, const char *str); /** + * uci_geterror: Get an error string for the last uci error + * @ctx: uci context + * @dest: target pointer for the string + * @str: prefix for the error message + * + * Note: string must be freed by the caller + */ +extern void uci_get_errorstr(struct uci_context *ctx, char **dest, const char *str); + +/** * uci_import: Import uci config data from a stream * @ctx: uci context * @stream: file stream to import from |