From: Sebastian Harl Date: Mon, 1 Apr 2013 17:56:55 +0000 (+0200) Subject: Moved error / time from utils to core. X-Git-Tag: sysdb-0.1.0~410^2~1 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=fa5c130fbd0c75f3c47f1b28feb8d76a4791a93e;p=sysdb.git Moved error / time from utils to core. This is more appropriate. --- diff --git a/src/Makefile.am b/src/Makefile.am index 9876de6..38154a8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,10 +23,10 @@ libsysdb_la_SOURCES = \ core/plugin.c include/core/plugin.h \ core/store.c include/core/store.h \ include/utils/data.h \ - utils/error.c include/utils/error.h \ + core/error.c include/core/error.h \ utils/llist.c include/utils/llist.h \ utils/strbuf.c include/utils/strbuf.h \ - utils/time.c include/utils/time.h \ + core/time.c include/core/time.h \ utils/unixsock.c include/utils/unixsock.h libsysdb_la_CFLAGS = $(AM_CFLAGS) libsysdb_la_CPPFLAGS = $(AM_CPPFLAGS) $(LTDLINCL) diff --git a/src/backend/collectd/unixsock.c b/src/backend/collectd/unixsock.c index 78c238d..9457739 100644 --- a/src/backend/collectd/unixsock.c +++ b/src/backend/collectd/unixsock.c @@ -28,7 +28,7 @@ #include "sysdb.h" #include "core/plugin.h" #include "core/store.h" -#include "utils/error.h" +#include "core/error.h" #include "utils/unixsock.h" #include "liboconfig/utils.h" diff --git a/src/backend/mk-livestatus.c b/src/backend/mk-livestatus.c index 200edc2..e151b52 100644 --- a/src/backend/mk-livestatus.c +++ b/src/backend/mk-livestatus.c @@ -28,7 +28,7 @@ #include "sysdb.h" #include "core/plugin.h" #include "core/store.h" -#include "utils/error.h" +#include "core/error.h" #include "utils/unixsock.h" #include "liboconfig/utils.h" diff --git a/src/backend/puppet/store-configs.c b/src/backend/puppet/store-configs.c index 84855c6..8b3804b 100644 --- a/src/backend/puppet/store-configs.c +++ b/src/backend/puppet/store-configs.c @@ -28,7 +28,7 @@ #include "sysdb.h" #include "core/plugin.h" #include "core/store.h" -#include "utils/error.h" +#include "core/error.h" #include "utils/dbi.h" #include "liboconfig/utils.h" diff --git a/src/core/error.c b/src/core/error.c new file mode 100644 index 0000000..cdd5d04 --- /dev/null +++ b/src/core/error.c @@ -0,0 +1,284 @@ +/* + * SysDB - src/core/error.c + * Copyright (C) 2013 Sebastian 'tokkee' Harl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "core/error.h" +#include "utils/strbuf.h" + +#include + +#include +#include +#include + +#include + +/* + * private data types + */ + +typedef struct { + int prio; + sdb_strbuf_t *msg; + _Bool logged; +} sdb_error_ctx_t; +#define SDB_ERROR_INIT { -1, NULL, 1 } + +/* + * private variables + */ + +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; + +/* + * private helper functions + */ + +static void +sdb_error_ctx_destructor(void *p) +{ + sdb_error_ctx_t *ctx = p; + + if (! ctx) + return; + + sdb_strbuf_destroy(ctx->msg); + free(ctx); +} /* sdb_error_ctx_destructor */ + +static void +sdb_error_ctx_init(void) +{ + if (error_ctx_key_initialized) + return; + + pthread_key_create(&error_ctx_key, sdb_error_ctx_destructor); + error_ctx_key_initialized = 1; +} /* sdb_error_init */ + +static sdb_error_ctx_t * +sdb_error_ctx_create(void) +{ + sdb_error_ctx_t *ctx; + + ctx = malloc(sizeof(*ctx)); + if (! ctx) + return NULL; + + *ctx = default_error_ctx; + ctx->msg = sdb_strbuf_create(64); + if (! ctx->msg) { + free(ctx); + return NULL; + } + + if (! error_ctx_key_initialized) + sdb_error_ctx_init(); + pthread_setspecific(error_ctx_key, ctx); + return ctx; +} /* sdb_error_ctx_create */ + +static sdb_error_ctx_t * +sdb_error_get_ctx(void) +{ + sdb_error_ctx_t *ctx; + + if (! error_ctx_key_initialized) + sdb_error_ctx_init(); + ctx = pthread_getspecific(error_ctx_key); + + if (! ctx) + ctx = sdb_error_ctx_create(); + if (! ctx) + return NULL; + return ctx; +} /* sdb_error_get_ctx */ + +static int +sdb_error_vprintf(const char *fmt, va_list ap) +{ + sdb_error_ctx_t *ctx; + + ctx = sdb_error_get_ctx(); + if (! ctx) + return -1; + + ctx->logged = 0; + return (int)sdb_strbuf_vsprintf(ctx->msg, fmt, ap); +} /* sdb_error_vprintf */ + +static int +sdb_error_vappend(const char *fmt, va_list ap) +{ + sdb_error_ctx_t *ctx; + + ctx = sdb_error_get_ctx(); + if (! ctx) + return -1; + + ctx->logged = 0; + return (int)sdb_strbuf_vappend(ctx->msg, fmt, ap); +} /* sdb_error_vappend */ + +static int +sdb_do_log(int prio) +{ + sdb_error_ctx_t *ctx; + int ret; + + ctx = sdb_error_get_ctx(); + if (! ctx) + return -1; + + if (prio >= 0) + ctx->prio = prio; + + if (ctx->logged) + return 0; + + 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 */ + +/* + * public API + */ + +int +sdb_log(int prio, const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = sdb_error_vprintf(fmt, ap); + va_end(ap); + + if (ret > 0) + sdb_do_log(prio); + return ret; +} /* sdb_log */ + +int +sdb_error_set(const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = sdb_error_vprintf(fmt, ap); + va_end(ap); + + return ret; +} /* sdb_error_set */ + +int +sdb_error_append(const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = sdb_error_vappend(fmt, ap); + va_end(ap); + + return ret; +} /* sdb_error_append */ + +int +sdb_error_chomp(void) +{ + sdb_error_ctx_t *ctx; + + ctx = sdb_error_get_ctx(); + if (! ctx) + return -1; + + sdb_strbuf_chomp(ctx->msg); + return 0; +} /* sdb_error_chomp */ + +int +sdb_error_log(int prio) +{ + return sdb_do_log(prio); +} /* sdb_error_log */ + +const char * +sdb_error_get(void) +{ + sdb_error_ctx_t *ctx; + + ctx = sdb_error_get_ctx(); + if (! ctx) + return "success"; + return sdb_strbuf_string(ctx->msg); +} /* sdb_error_get */ + +int +sdb_error_get_prio(void) +{ + sdb_error_ctx_t *ctx; + + ctx = sdb_error_get_ctx(); + if (! ctx) + return -1; + return ctx->prio; +} /* sdb_error_get_prio */ + +char * +sdb_strerror(int errnum, char *strerrbuf, size_t buflen) +{ +#if STRERROR_R_CHAR_P + { + char *tmp = strerror_r(errnum, strerrbuf, buflen); + if (*strerrbuf = '\0') { + if (tmp && (tmp != strerrbuf) && (*tmp != '\0')) + strncpy(strerrbuf, tmp, buflen); + else + snprintf(strerrbuf, buflen, "unknown error #%i " + "(strerror_r(3) did not return an error message)", + errnum); + } + } +#else + if (strerror_r(errnum, strerrbuf, buflen)) + snprintf(strerrbuf, buflen, "unknown error #%i " + "(strerror_r(3) failed)", errnum); +#endif + + strerrbuf[buflen - 1] = '\0'; + return strerrbuf; +} /* sdb_strerror */ + +/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ + diff --git a/src/core/plugin.c b/src/core/plugin.c index 5df7059..5fdaca0 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -27,9 +27,9 @@ #include "sysdb.h" #include "core/plugin.h" -#include "utils/error.h" +#include "core/error.h" +#include "core/time.h" #include "utils/llist.h" -#include "utils/time.h" #include diff --git a/src/core/store.c b/src/core/store.c index 4e841ba..714a0b3 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -27,7 +27,7 @@ #include "sysdb.h" #include "core/store.h" -#include "utils/error.h" +#include "core/error.h" #include "utils/llist.h" #include diff --git a/src/core/time.c b/src/core/time.c new file mode 100644 index 0000000..3baf224 --- /dev/null +++ b/src/core/time.c @@ -0,0 +1,79 @@ +/* + * SysDB - src/core/time.c + * Copyright (C) 2012 Sebastian 'tokkee' Harl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "core/time.h" + +#include + +#include + +/* + * public API + */ + +sdb_time_t +sdb_gettime(void) +{ + struct timespec ts_now = { 0, 0 }; + + if (clock_gettime(CLOCK_REALTIME, &ts_now)) + return 0; + return TIMESPEC_TO_SDB_TIME(ts_now); +} /* sdb_gettime */ + +int +sdb_sleep(sdb_time_t reg, sdb_time_t *rem) +{ + struct timespec ts_reg, ts_rem = { 0, 0 }; + int status; + + ts_reg.tv_sec = (time_t)SDB_TIME_TO_SECS(reg); + ts_reg.tv_nsec = (long int)(reg % (sdb_time_t)1000000000); + + status = nanosleep(&ts_reg, &ts_rem); + if (rem) + *rem = TIMESPEC_TO_SDB_TIME(ts_rem); + return status; +} /* sdb_sleep */ + +size_t +sdb_strftime(char *s, size_t len, const char *format, sdb_time_t t) +{ + time_t tstamp; + struct tm tm; + + memset(&tm, 0, sizeof(tm)); + + tstamp = (time_t)SDB_TIME_TO_SECS(t); + if (! localtime_r (&tstamp, &tm)) + return 0; + + return strftime(s, len, format, &tm); +} /* sdb_strftime */ + +/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ + diff --git a/src/daemon/config.c b/src/daemon/config.c index ac95b6c..03bc2b8 100644 --- a/src/daemon/config.c +++ b/src/daemon/config.c @@ -27,8 +27,8 @@ #include "sysdb.h" #include "core/plugin.h" -#include "utils/error.h" -#include "utils/time.h" +#include "core/error.h" +#include "core/time.h" #include "daemon/config.h" diff --git a/src/daemon/sysdbd.c b/src/daemon/sysdbd.c index 99c1296..f199261 100644 --- a/src/daemon/sysdbd.c +++ b/src/daemon/sysdbd.c @@ -32,7 +32,7 @@ #include "sysdb.h" #include "core/plugin.h" #include "core/store.h" -#include "utils/error.h" +#include "core/error.h" #include "daemon/config.h" diff --git a/src/include/core/error.h b/src/include/core/error.h new file mode 100644 index 0000000..d2ee9f7 --- /dev/null +++ b/src/include/core/error.h @@ -0,0 +1,141 @@ +/* + * SysDB - src/include/core/error.h + * Copyright (C) 2013 Sebastian 'tokkee' Harl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * SysDB error handling: + * Error handling in SysDB is done on a by-thread basis, that is, each thread + * will use its own memory region to store information about the last reported + * error. + * Once the error message has been passed to SysDB, it will log the entire + * message at once. XXX: currently, SysDB only supports printing the error to + * the standard error channel; support for other logging backends will be + * added later in a modular fashion. + */ + +#ifndef SDB_CORE_ERROR_H +#define SDB_CORE_ERROR_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* max length of any error message */ +#ifndef SDB_MAX_ERROR +# define SDB_MAX_ERROR 4096 +#endif /* ! SDB_MAX_ERROR */ + +/* On Linux systems and possibly others, this should be the same as the LOG_ + * constants defined by syslog. */ +enum { + SDB_LOG_EMERG = 0, + SDB_LOG_ERR = 3, + SDB_LOG_WARNING = 4, + SDB_LOG_NOTICE = 5, + SDB_LOG_INFO = 6, + SDB_LOG_DEBUG = 7, +}; +#define SDB_LOG_PRIO_TO_STRING(prio) \ + (((prio) == SDB_LOG_EMERG) ? "EMERG" \ + : ((prio) == SDB_LOG_ERR) ? "ERROR" \ + : ((prio) == SDB_LOG_WARNING) ? "WARNING" \ + : ((prio) == SDB_LOG_NOTICE) ? "NOTICE" \ + : ((prio) == SDB_LOG_INFO) ? "INFO" \ + : ((prio) == SDB_LOG_DEBUG) ? "DEBUG" : "UNKNOWN") + +/* + * sdb_log: + * Log the specified message. The string will be formatted in printf-style + * using the specified format and arguments and logged with the specified + * priority. In addition, the error message will be stored as the current + * error message. This function is basically the same as calling sdb_error_set + * and sdb_error_log. XXX: SDB_LOG_EMERG might, at some point and/or depending + * on configuration, try a clean shut-down of the process. + */ +int +sdb_log(int prio, const char *fmt, ...); + +/* + * sdb_error_set, sdb_error_append: + * Compose the current error message. The string will be formatted in printf- + * style using the specified format and arguments. No automatic logging will + * be done. + */ +int +sdb_error_set(const char *fmt, ...); +int +sdb_error_append(const char *fmt, ...); + +/* + * sdb_error_chomp: + * Remove all consecutive newline characters at the end of the error message. + */ +int +sdb_error_chomp(void); + +/* + * sdb_error_log: + * Log the current error message with the specified priority. See sdb_log for + * more information. + */ +int +sdb_error_log(int prio); + +/* + * sdb_error_get: + * Get the current error message. The string returned by this function is + * owned by SysDB and might point to static memory -- do not modify or free + * it. + */ +const char * +sdb_error_get(void); + +/* + * sdb_error_get_prio: + * Get the priority of the last logged error message -- see the SDB_LOG_ + * constants for details. + */ +int +sdb_error_get_prio(void); + +/* + * sdb_strerror: + * This is a wrapper around the system's strerror function which ensures that + * a pointer to the formatted error message is returned. + */ +char * +sdb_strerror(int errnum, char *strerrbuf, size_t buflen); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ! SDB_CORE_ERROR_H */ + +/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ + diff --git a/src/include/core/plugin.h b/src/include/core/plugin.h index 1ac243a..ac8656a 100644 --- a/src/include/core/plugin.h +++ b/src/include/core/plugin.h @@ -30,7 +30,7 @@ #include "sysdb.h" #include "core/object.h" -#include "utils/time.h" +#include "core/time.h" #include "liboconfig/oconfig.h" diff --git a/src/include/core/store.h b/src/include/core/store.h index 46cd536..6bda967 100644 --- a/src/include/core/store.h +++ b/src/include/core/store.h @@ -30,7 +30,7 @@ #include "sysdb.h" #include "core/object.h" -#include "utils/time.h" +#include "core/time.h" #include "utils/llist.h" #include diff --git a/src/include/core/time.h b/src/include/core/time.h new file mode 100644 index 0000000..30e920b --- /dev/null +++ b/src/include/core/time.h @@ -0,0 +1,73 @@ +/* + * SysDB - src/include/core/time.h + * Copyright (C) 2012 Sebastian 'tokkee' Harl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SDB_CORE_TIME_H +#define SDB_CORE_TIME_H 1 + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * sdb_time_t: + * The time, in nano-seconds, since the epoch. + */ +typedef uint64_t sdb_time_t; +#define PRIscTIME PRIu64 + +#define SECS_TO_SDB_TIME(s) ((sdb_time_t)(s) * (sdb_time_t)1000000000) +#define SDB_TIME_TO_SECS(t) ((t) / (sdb_time_t)1000000000) + +#define NSECS_TO_SDB_TIME(ns) ((sdb_time_t)ns) + +#define DOUBLE_TO_SDB_TIME(d) ((sdb_time_t)((d) * 1000000000.0)) +#define SDB_TIME_TO_DOUBLE(t) ((double)(t) / 1000000000.0) + +#define TIMESPEC_TO_SDB_TIME(ts) (SECS_TO_SDB_TIME((ts).tv_sec) \ + + NSECS_TO_SDB_TIME((ts).tv_nsec)) + +sdb_time_t +sdb_gettime(void); + +int +sdb_sleep(sdb_time_t reg, sdb_time_t *rem); + +size_t +sdb_strftime(char *s, size_t len, const char *format, sdb_time_t); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ! SDB_CORE_TIME_H */ + +/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ + diff --git a/src/include/utils/data.h b/src/include/utils/data.h index 0f38a11..fc6afca 100644 --- a/src/include/utils/data.h +++ b/src/include/utils/data.h @@ -28,7 +28,7 @@ #ifndef SDB_UTILS_DATA_H #define SDB_UTILS_DATA_H 1 -#include "utils/time.h" +#include "core/time.h" #include #include diff --git a/src/include/utils/error.h b/src/include/utils/error.h deleted file mode 100644 index 33731e1..0000000 --- a/src/include/utils/error.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * SysDB - src/include/utils/error.h - * Copyright (C) 2013 Sebastian 'tokkee' Harl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * SysDB error handling: - * Error handling in SysDB is done on a by-thread basis, that is, each thread - * will use its own memory region to store information about the last reported - * error. - * Once the error message has been passed to SysDB, it will log the entire - * message at once. XXX: currently, SysDB only supports printing the error to - * the standard error channel; support for other logging backends will be - * added later in a modular fashion. - */ - -#ifndef SDB_UTILS_ERROR_H -#define SDB_UTILS_ERROR_H 1 - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* max length of any error message */ -#ifndef SDB_MAX_ERROR -# define SDB_MAX_ERROR 4096 -#endif /* ! SDB_MAX_ERROR */ - -/* On Linux systems and possibly others, this should be the same as the LOG_ - * constants defined by syslog. */ -enum { - SDB_LOG_EMERG = 0, - SDB_LOG_ERR = 3, - SDB_LOG_WARNING = 4, - SDB_LOG_NOTICE = 5, - SDB_LOG_INFO = 6, - SDB_LOG_DEBUG = 7, -}; -#define SDB_LOG_PRIO_TO_STRING(prio) \ - (((prio) == SDB_LOG_EMERG) ? "EMERG" \ - : ((prio) == SDB_LOG_ERR) ? "ERROR" \ - : ((prio) == SDB_LOG_WARNING) ? "WARNING" \ - : ((prio) == SDB_LOG_NOTICE) ? "NOTICE" \ - : ((prio) == SDB_LOG_INFO) ? "INFO" \ - : ((prio) == SDB_LOG_DEBUG) ? "DEBUG" : "UNKNOWN") - -/* - * sdb_log: - * Log the specified message. The string will be formatted in printf-style - * using the specified format and arguments and logged with the specified - * priority. In addition, the error message will be stored as the current - * error message. This function is basically the same as calling sdb_error_set - * and sdb_error_log. XXX: SDB_LOG_EMERG might, at some point and/or depending - * on configuration, try a clean shut-down of the process. - */ -int -sdb_log(int prio, const char *fmt, ...); - -/* - * sdb_error_set, sdb_error_append: - * Compose the current error message. The string will be formatted in printf- - * style using the specified format and arguments. No automatic logging will - * be done. - */ -int -sdb_error_set(const char *fmt, ...); -int -sdb_error_append(const char *fmt, ...); - -/* - * sdb_error_chomp: - * Remove all consecutive newline characters at the end of the error message. - */ -int -sdb_error_chomp(void); - -/* - * sdb_error_log: - * Log the current error message with the specified priority. See sdb_log for - * more information. - */ -int -sdb_error_log(int prio); - -/* - * sdb_error_get: - * Get the current error message. The string returned by this function is - * owned by SysDB and might point to static memory -- do not modify or free - * it. - */ -const char * -sdb_error_get(void); - -/* - * sdb_error_get_prio: - * Get the priority of the last logged error message -- see the SDB_LOG_ - * constants for details. - */ -int -sdb_error_get_prio(void); - -/* - * sdb_strerror: - * This is a wrapper around the system's strerror function which ensures that - * a pointer to the formatted error message is returned. - */ -char * -sdb_strerror(int errnum, char *strerrbuf, size_t buflen); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ! SDB_UTILS_ERROR_H */ - -/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ - diff --git a/src/include/utils/time.h b/src/include/utils/time.h deleted file mode 100644 index cd781e3..0000000 --- a/src/include/utils/time.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SysDB - src/include/utils/time.h - * Copyright (C) 2012 Sebastian 'tokkee' Harl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef SDB_UTILS_TIME_H -#define SDB_UTILS_TIME_H 1 - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * sdb_time_t: - * The time, in nano-seconds, since the epoch. - */ -typedef uint64_t sdb_time_t; -#define PRIscTIME PRIu64 - -#define SECS_TO_SDB_TIME(s) ((sdb_time_t)(s) * (sdb_time_t)1000000000) -#define SDB_TIME_TO_SECS(t) ((t) / (sdb_time_t)1000000000) - -#define NSECS_TO_SDB_TIME(ns) ((sdb_time_t)ns) - -#define DOUBLE_TO_SDB_TIME(d) ((sdb_time_t)((d) * 1000000000.0)) -#define SDB_TIME_TO_DOUBLE(t) ((double)(t) / 1000000000.0) - -#define TIMESPEC_TO_SDB_TIME(ts) (SECS_TO_SDB_TIME((ts).tv_sec) \ - + NSECS_TO_SDB_TIME((ts).tv_nsec)) - -sdb_time_t -sdb_gettime(void); - -int -sdb_sleep(sdb_time_t reg, sdb_time_t *rem); - -size_t -sdb_strftime(char *s, size_t len, const char *format, sdb_time_t); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ! SDB_UTILS_TIME_H */ - -/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ - diff --git a/src/utils/dbi.c b/src/utils/dbi.c index f89e463..db93857 100644 --- a/src/utils/dbi.c +++ b/src/utils/dbi.c @@ -25,7 +25,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "utils/error.h" +#include "core/error.h" #include "utils/dbi.h" #include diff --git a/src/utils/error.c b/src/utils/error.c deleted file mode 100644 index c62b20d..0000000 --- a/src/utils/error.c +++ /dev/null @@ -1,284 +0,0 @@ -/* - * SysDB - src/utils/error.c - * Copyright (C) 2013 Sebastian 'tokkee' Harl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "utils/error.h" -#include "utils/strbuf.h" - -#include - -#include -#include -#include - -#include - -/* - * private data types - */ - -typedef struct { - int prio; - sdb_strbuf_t *msg; - _Bool logged; -} sdb_error_ctx_t; -#define SDB_ERROR_INIT { -1, NULL, 1 } - -/* - * private variables - */ - -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; - -/* - * private helper functions - */ - -static void -sdb_error_ctx_destructor(void *p) -{ - sdb_error_ctx_t *ctx = p; - - if (! ctx) - return; - - sdb_strbuf_destroy(ctx->msg); - free(ctx); -} /* sdb_error_ctx_destructor */ - -static void -sdb_error_ctx_init(void) -{ - if (error_ctx_key_initialized) - return; - - pthread_key_create(&error_ctx_key, sdb_error_ctx_destructor); - error_ctx_key_initialized = 1; -} /* sdb_error_init */ - -static sdb_error_ctx_t * -sdb_error_ctx_create(void) -{ - sdb_error_ctx_t *ctx; - - ctx = malloc(sizeof(*ctx)); - if (! ctx) - return NULL; - - *ctx = default_error_ctx; - ctx->msg = sdb_strbuf_create(64); - if (! ctx->msg) { - free(ctx); - return NULL; - } - - if (! error_ctx_key_initialized) - sdb_error_ctx_init(); - pthread_setspecific(error_ctx_key, ctx); - return ctx; -} /* sdb_error_ctx_create */ - -static sdb_error_ctx_t * -sdb_error_get_ctx(void) -{ - sdb_error_ctx_t *ctx; - - if (! error_ctx_key_initialized) - sdb_error_ctx_init(); - ctx = pthread_getspecific(error_ctx_key); - - if (! ctx) - ctx = sdb_error_ctx_create(); - if (! ctx) - return NULL; - return ctx; -} /* sdb_error_get_ctx */ - -static int -sdb_error_vprintf(const char *fmt, va_list ap) -{ - sdb_error_ctx_t *ctx; - - ctx = sdb_error_get_ctx(); - if (! ctx) - return -1; - - ctx->logged = 0; - return (int)sdb_strbuf_vsprintf(ctx->msg, fmt, ap); -} /* sdb_error_vprintf */ - -static int -sdb_error_vappend(const char *fmt, va_list ap) -{ - sdb_error_ctx_t *ctx; - - ctx = sdb_error_get_ctx(); - if (! ctx) - return -1; - - ctx->logged = 0; - return (int)sdb_strbuf_vappend(ctx->msg, fmt, ap); -} /* sdb_error_vappend */ - -static int -sdb_do_log(int prio) -{ - sdb_error_ctx_t *ctx; - int ret; - - ctx = sdb_error_get_ctx(); - if (! ctx) - return -1; - - if (prio >= 0) - ctx->prio = prio; - - if (ctx->logged) - return 0; - - 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 */ - -/* - * public API - */ - -int -sdb_log(int prio, const char *fmt, ...) -{ - va_list ap; - int ret; - - va_start(ap, fmt); - ret = sdb_error_vprintf(fmt, ap); - va_end(ap); - - if (ret > 0) - sdb_do_log(prio); - return ret; -} /* sdb_log */ - -int -sdb_error_set(const char *fmt, ...) -{ - va_list ap; - int ret; - - va_start(ap, fmt); - ret = sdb_error_vprintf(fmt, ap); - va_end(ap); - - return ret; -} /* sdb_error_set */ - -int -sdb_error_append(const char *fmt, ...) -{ - va_list ap; - int ret; - - va_start(ap, fmt); - ret = sdb_error_vappend(fmt, ap); - va_end(ap); - - return ret; -} /* sdb_error_append */ - -int -sdb_error_chomp(void) -{ - sdb_error_ctx_t *ctx; - - ctx = sdb_error_get_ctx(); - if (! ctx) - return -1; - - sdb_strbuf_chomp(ctx->msg); - return 0; -} /* sdb_error_chomp */ - -int -sdb_error_log(int prio) -{ - return sdb_do_log(prio); -} /* sdb_error_log */ - -const char * -sdb_error_get(void) -{ - sdb_error_ctx_t *ctx; - - ctx = sdb_error_get_ctx(); - if (! ctx) - return "success"; - return sdb_strbuf_string(ctx->msg); -} /* sdb_error_get */ - -int -sdb_error_get_prio(void) -{ - sdb_error_ctx_t *ctx; - - ctx = sdb_error_get_ctx(); - if (! ctx) - return -1; - return ctx->prio; -} /* sdb_error_get_prio */ - -char * -sdb_strerror(int errnum, char *strerrbuf, size_t buflen) -{ -#if STRERROR_R_CHAR_P - { - char *tmp = strerror_r(errnum, strerrbuf, buflen); - if (*strerrbuf = '\0') { - if (tmp && (tmp != strerrbuf) && (*tmp != '\0')) - strncpy(strerrbuf, tmp, buflen); - else - snprintf(strerrbuf, buflen, "unknown error #%i " - "(strerror_r(3) did not return an error message)", - errnum); - } - } -#else - if (strerror_r(errnum, strerrbuf, buflen)) - snprintf(strerrbuf, buflen, "unknown error #%i " - "(strerror_r(3) failed)", errnum); -#endif - - strerrbuf[buflen - 1] = '\0'; - return strerrbuf; -} /* sdb_strerror */ - -/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ - diff --git a/src/utils/time.c b/src/utils/time.c deleted file mode 100644 index 4823205..0000000 --- a/src/utils/time.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * SysDB - src/utils/time.c - * Copyright (C) 2012 Sebastian 'tokkee' Harl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "utils/time.h" - -#include - -#include - -/* - * public API - */ - -sdb_time_t -sdb_gettime(void) -{ - struct timespec ts_now = { 0, 0 }; - - if (clock_gettime(CLOCK_REALTIME, &ts_now)) - return 0; - return TIMESPEC_TO_SDB_TIME(ts_now); -} /* sdb_gettime */ - -int -sdb_sleep(sdb_time_t reg, sdb_time_t *rem) -{ - struct timespec ts_reg, ts_rem = { 0, 0 }; - int status; - - ts_reg.tv_sec = (time_t)SDB_TIME_TO_SECS(reg); - ts_reg.tv_nsec = (long int)(reg % (sdb_time_t)1000000000); - - status = nanosleep(&ts_reg, &ts_rem); - if (rem) - *rem = TIMESPEC_TO_SDB_TIME(ts_rem); - return status; -} /* sdb_sleep */ - -size_t -sdb_strftime(char *s, size_t len, const char *format, sdb_time_t t) -{ - time_t tstamp; - struct tm tm; - - memset(&tm, 0, sizeof(tm)); - - tstamp = (time_t)SDB_TIME_TO_SECS(t); - if (! localtime_r (&tstamp, &tm)) - return 0; - - return strftime(s, len, format, &tm); -} /* sdb_strftime */ - -/* vim: set tw=78 sw=4 ts=4 noexpandtab : */ - diff --git a/src/utils/unixsock.c b/src/utils/unixsock.c index 8c0abb2..138205d 100644 --- a/src/utils/unixsock.c +++ b/src/utils/unixsock.c @@ -26,7 +26,7 @@ */ #include "utils/unixsock.h" -#include "utils/error.h" +#include "core/error.h" #include #include