From d04b5eb6dab7b545f2e01c005dff2288d39f582e Mon Sep 17 00:00:00 2001 From: Alex 'AdUser' Z Date: Fri, 11 Mar 2016 18:40:52 +1000 Subject: [PATCH] * log.[ch]: add f2b_log_set_dest(), f2b_log_setup() --- src/log.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++----- src/log.h | 2 ++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/log.c b/src/log.c index 5260170..8f463a1 100644 --- a/src/log.c +++ b/src/log.c @@ -1,7 +1,11 @@ #include "common.h" #include "log.h" +#include "syslog.h" + static log_msgtype_t minlevel = log_info; +static enum { log_stderr = 0, log_file = 1, log_syslog = 2 } dest = log_stderr; +static FILE *logfile = NULL; static const char *loglevels[] = { "debug", @@ -11,9 +15,21 @@ static const char *loglevels[] = { "fatal", }; +static inline int +get_facility(log_msgtype_t l) { + switch (l) { + case log_debug: return LOG_DEBUG; + case log_info: return LOG_INFO; + case log_warn: return LOG_WARNING; + case log_error: return LOG_ERR; + case log_fatal: return LOG_CRIT; + break; + } + return LOG_INFO; +} + void f2b_log_msg(log_msgtype_t l, const char *fmt, ...) { va_list args; - char line[LOGLINE_MAX] = ""; char msg[LOGLINE_MAX] = ""; if (l < minlevel) @@ -22,10 +38,20 @@ void f2b_log_msg(log_msgtype_t l, const char *fmt, ...) { va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); - snprintf(line, LOGLINE_MAX, "[%s] %s", loglevels[l], msg); - /* TODO */ - fputs(line, stderr); - fputc('\n', stderr); + + if (!logfile) + logfile = stderr; + + switch (dest) { + case log_syslog: + syslog(get_facility(l), "%s", msg); + break; + case log_stderr: + case log_file: + default: + fprintf(logfile, "[%s] %s\n", loglevels[l], msg); + break; + } return; } @@ -37,3 +63,30 @@ void f2b_log_set_level(const char *level) { if (strcmp(level, "error") == 0) { minlevel = log_error; return; } if (strcmp(level, "fatal") == 0) { minlevel = log_fatal; return; } } + +void f2b_log_set_dest(const char *target) { + if (strcmp(target, "syslog") == 0) { dest = log_syslog; return; } + if (strcmp(target, "stderr") == 0) { dest = log_stderr; return; } + if (strcmp(target, "file") == 0) { dest = log_file; return; } +} + +void f2b_log_setup(const char *path) { + switch (dest) { + case log_file: + if (logfile) + fclose(logfile); + if ((logfile = fopen(path, "a")) == NULL) + dest = log_stderr, logfile = stderr; + f2b_log_msg(log_error, "can't open logfile: %s -- %s", path, strerror(errno)); + break; + case log_syslog: + openlog("f2b", LOG_CONS, LOG_DAEMON); + break; + case log_stderr: + default: + logfile = stderr; + break; + } + + return; +} diff --git a/src/log.h b/src/log.h index 2d009f2..b6e7830 100644 --- a/src/log.h +++ b/src/log.h @@ -13,5 +13,7 @@ typedef enum { void f2b_log_msg(log_msgtype_t l, const char *fmt, ...); void f2b_log_set_level(const char *level); +void f2b_log_set_dest (const char *dest); +void f2b_log_setup (const char *path); #endif /* F2B_LOG_H_ */