X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Ferror.c;h=6d23c6bcf68b8e32661e7c49943ccb0c19d9b8b0;hp=5b9b448deefc4737c7e812e828d3a9fdd041f5a2;hb=61c35f1909b2496c7edac288a59f75604c7c179e;hpb=ddb933096618a6bceded29e4dc2b37cb72134366 diff --git a/src/utils/error.c b/src/utils/error.c index 5b9b448..6d23c6b 100644 --- a/src/utils/error.c +++ b/src/utils/error.c @@ -25,17 +25,21 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "core/plugin.h" +#if HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + #include "utils/error.h" #include "utils/strbuf.h" #include #include +#include #include -#include - #include +#include +#include /* * private data types @@ -44,7 +48,7 @@ typedef struct { int prio; sdb_strbuf_t *msg; - _Bool logged; + bool logged; } sdb_error_ctx_t; #define SDB_ERROR_INIT { -1, NULL, 1 } @@ -55,7 +59,9 @@ typedef struct { static sdb_error_ctx_t default_error_ctx = SDB_ERROR_INIT; static pthread_key_t error_ctx_key; -static _Bool error_ctx_key_initialized = 0; +static bool error_ctx_key_initialized = 0; + +static int (*logger)(int prio, const char *msg) = NULL; /* * private helper functions @@ -163,7 +169,12 @@ sdb_do_log(int prio) if (ctx->logged) return 0; - ret = sdb_plugin_log(prio, sdb_strbuf_string(ctx->msg)); + if (logger) + ret = logger(prio, sdb_strbuf_string(ctx->msg)); + else + ret = fprintf(stderr, "[%s] %s\n", SDB_LOG_PRIO_TO_STRING(prio), + sdb_strbuf_string(ctx->msg)); + ctx->logged = 1; return ret; } /* sdb_do_log */ @@ -172,6 +183,12 @@ sdb_do_log(int prio) * public API */ +void +sdb_error_set_logger(int (*f)(int, const char *)) +{ + logger = f; +} /* sdb_error_set_logger */ + int sdb_log(int prio, const char *fmt, ...) { @@ -179,13 +196,19 @@ sdb_log(int prio, const char *fmt, ...) int ret; va_start(ap, fmt); - ret = sdb_error_vprintf(fmt, ap); + ret = sdb_vlog(prio, fmt, ap); va_end(ap); + return ret; +} /* sdb_log */ +int +sdb_vlog(int prio, const char *fmt, va_list ap) +{ + int ret = sdb_error_vprintf(fmt, ap); if (ret > 0) sdb_do_log(prio); return ret; -} /* sdb_log */ +} /* sdb_vlog */ int sdb_error_set(const char *fmt, ...) @@ -254,13 +277,33 @@ sdb_error_get_prio(void) return ctx->prio; } /* sdb_error_get_prio */ +int +sdb_error_parse_priority(char *prio) +{ + if (! strcasecmp(prio, "EMERG")) + return SDB_LOG_EMERG; + else if (! strcasecmp(prio, "ERROR")) + return SDB_LOG_ERR; + else if (! strcasecmp(prio, "WARNING")) + return SDB_LOG_WARNING; + else if (! strcasecmp(prio, "NOTICE")) + return SDB_LOG_NOTICE; + else if (! strcasecmp(prio, "INFO")) + return SDB_LOG_INFO; + else if (! strcasecmp(prio, "DEBUG")) + return SDB_LOG_DEBUG; + return -1; +} /* sdb_error_parse_priority */ + char * sdb_strerror(int errnum, char *strerrbuf, size_t buflen) { + *strerrbuf = '\0'; + #if STRERROR_R_CHAR_P { char *tmp = strerror_r(errnum, strerrbuf, buflen); - if (*strerrbuf = '\0') { + if (*strerrbuf == '\0') { if (tmp && (tmp != strerrbuf) && (*tmp != '\0')) strncpy(strerrbuf, tmp, buflen); else