Browse Source

extend api to be able to get a full error string instead of printing it

Felix Fietkau 15 years ago
parent
commit
7d69106b37
2 changed files with 40 additions and 9 deletions
  1. 30 9
      libuci.c
  2. 10 0
      uci.h

+ 30 - 9
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)

+ 10 - 0
uci.h

@@ -83,6 +83,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