From: Jonathan Dieter Date: Tue, 24 Jul 2018 11:43:11 +0000 (+0100) Subject: Revamp error handling to handle variable arguments X-Git-Tag: archive/raspbian/1.1.9+ds1-1+rpi1~1^2~187 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7a321d63d41b3456fd7962a49f4f07e31ea4ec41;p=zchunk.git Revamp error handling to handle variable arguments Signed-off-by: Jonathan Dieter --- 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