From 7a321d63d41b3456fd7962a49f4f07e31ea4ec41 Mon Sep 17 00:00:00 2001 From: Jonathan Dieter Date: Tue, 24 Jul 2018 12:43:11 +0100 Subject: [PATCH] Revamp error handling to handle variable arguments Signed-off-by: Jonathan Dieter --- src/lib/error.c | 29 ++++++++++++++++------------- src/lib/zck.c | 5 +---- src/lib/zck_private.h | 9 ++++++--- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/lib/error.c b/src/lib/error.c index b320736..baa4fc5 100644 --- a/src/lib/error.c +++ b/src/lib/error.c @@ -27,39 +27,42 @@ #include #include #include +#include #include #include "zck_private.h" -void set_fatal_error(zckCtx *zck, const char *msg) { - assert(zck != NULL && zck->msg == NULL && msg != NULL); +char *snprintf_error = "String conversion error"; - zck->fatal_msg = zmalloc(strlen(msg)+1); - strncpy(zck->fatal_msg, msg, strlen(msg)); -} - -void set_error(zckCtx *zck, const char *msg) { - assert(zck != NULL && zck->msg == NULL && msg != NULL); +void set_error_wf(zckCtx *zck, int fatal, const char *format, ...) { + va_list args; + int size = 0; + assert(zck != NULL && zck->msg == NULL && format != NULL); + zck->error_state = 1 + (fatal > 0 ? 1 : 0); - zck->msg = zmalloc(strlen(msg)+1); - strncpy(zck->msg, msg, strlen(msg)); + va_start(args, format); + size = vsnprintf(NULL, 0, format, args); + if(size < 0) + return; + zck->msg = zmalloc(size+1); + vsnprintf(zck->msg, size+1, format, args); + va_end(args); } char PUBLIC *zck_get_error(zckCtx *zck) { assert(zck != NULL); - if(zck->fatal_msg) - return zck->fatal_msg; return zck->msg; } int PUBLIC zck_clear_error(zckCtx *zck) { assert(zck != NULL); - if(zck->fatal_msg) + if(zck->error_state > 1) return False; free(zck->msg); zck->msg = NULL; + zck->error_state = 0; return True; } diff --git a/src/lib/zck.c b/src/lib/zck.c index 2fab7f2..3e9b1ed 100644 --- a/src/lib/zck.c +++ b/src/lib/zck.c @@ -92,10 +92,7 @@ static void zck_clear(zckCtx *zck) { free(zck->msg); zck->msg = NULL; } - if(zck->fatal_msg) { - free(zck->fatal_msg); - zck->fatal_msg = NULL; - } + zck->error_state = 0; zck->fd = -1; } diff --git a/src/lib/zck_private.h b/src/lib/zck_private.h index cf1ac5a..cf15bf2 100644 --- a/src/lib/zck_private.h +++ b/src/lib/zck_private.h @@ -22,6 +22,10 @@ #define zck_log(...) zck_log_wf(__func__, __VA_ARGS__) +#define set_error(zck, ...) set_error_wf(zck, 0, __VA_ARGS__); \ + zck_log(__VA_ARGS__) +#define set_fatal_error(zck, ...) set_error_wf(zck, 1, __VA_ARGS__); \ + zck_log(__VA_ARGS__) struct zckComp; typedef int (*finit)(struct zckComp *comp); @@ -216,7 +220,7 @@ typedef struct zckCtx { int manual_chunk; char *msg; - char *fatal_msg; + int error_state; } zckCtx; int get_tmp_fd() @@ -341,7 +345,6 @@ int compint_to_size(size_t *val, const char *compint, size_t *length, void zck_log_wf(const char *function, zck_log_type lt, const char *format, ...); /* error.c */ -void set_fatal_error(zckCtx *zck, const char *msg); -void set_error(zckCtx *zck, const char *msg); +void set_error_wf(zckCtx *zck, int fatal, const char *format, ...); #endif -- 2.30.2