summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2008-08-27 21:43:08 +0200
committerFelix Fietkau <nbd@openwrt.org>2008-08-27 21:43:08 +0200
commit7d69106b37851e90bd8660c91d906492f6d7d148 (patch)
tree340d6a5426c8c4995c11566a9d6f60fc0c8322e5
parentaa5b36c343894dc01ab857f0c7ab3aa1a792fc05 (diff)
downloaduci-7d69106b37851e90bd8660c91d906492f6d7d148.tar.gz
extend api to be able to get a full error string instead of printing it
-rw-r--r--libuci.c39
-rw-r--r--uci.h10
2 files changed, 40 insertions, 9 deletions
diff --git a/libuci.c b/libuci.c
index 1cfe4ec..29dab12 100644
--- a/libuci.c
+++ b/libuci.c
@@ -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)
diff --git a/uci.h b/uci.h
index 66ad752..d48ea7c 100644
--- a/uci.h
+++ b/uci.h
@@ -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