From c50781a2b7d0ab56acb31b8f79df2e69f9f74b8b Mon Sep 17 00:00:00 2001 From: Maxim Biro Date: Thu, 31 Dec 2015 01:24:31 -0500 Subject: Make logger a global object instead of an instance Passing Logger object into every function isn't fun. See for yourself: something as simple as a public key printing function turns from >void print_public_key(const uint8_t *public_key) to >void print_public_key(Logger *logger, const uint8_t *public_key) --- other/bootstrap_daemon/src/log.c | 115 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 other/bootstrap_daemon/src/log.c (limited to 'other/bootstrap_daemon/src/log.c') diff --git a/other/bootstrap_daemon/src/log.c b/other/bootstrap_daemon/src/log.c new file mode 100644 index 00000000..dff2dbad --- /dev/null +++ b/other/bootstrap_daemon/src/log.c @@ -0,0 +1,115 @@ +/* logger.c + * + * Tox DHT bootstrap daemon. + * + * Copyright (C) 2015 Tox project All Rights Reserved. + * + * This file is part of Tox. + * + * Tox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tox. If not, see . + * + */ + +#include "log.h" + +#include "global.h" + +#include + +#include +#include + +LOGGER_BACKEND current_backend = -1; + +bool open_log(LOGGER_BACKEND backend) +{ + if (current_backend != -1) { + return false; + } + + if (backend == LOGGER_BACKEND_SYSLOG) { + openlog(DAEMON_NAME, LOG_NOWAIT | LOG_PID, LOG_DAEMON); + } + + current_backend = backend; + + return true; +} + +bool close_log() +{ + if (current_backend == -1) { + return false; + } + + if (current_backend == LOGGER_BACKEND_SYSLOG) { + closelog(); + } + + current_backend = -1; + + return true; +} + +int level_syslog(LOG_LEVEL level) +{ + switch (level) { + case LOG_LEVEL_INFO: + return LOG_INFO; + case LOG_LEVEL_WARNING: + return LOG_WARNING; + case LOG_LEVEL_ERROR: + return LOG_ERR; + } +} + +void log_syslog(LOG_LEVEL level, const char *format, va_list args) +{ + vsyslog(level_syslog(level), format, args); +} + +FILE* level_stdout(LOG_LEVEL level) +{ + switch (level) { + case LOG_LEVEL_INFO: + return stdout; + case LOG_LEVEL_WARNING: // intentional fallthrough + case LOG_LEVEL_ERROR: + return stderr; + } +} + +void log_stdout(LOG_LEVEL level, const char *format, va_list args) +{ + vfprintf(level_stdout(level), format, args); +} + +bool log(LOG_LEVEL level, const char *format, ...) +{ + va_list args; + va_start(args, format); + + switch (current_backend) { + case LOGGER_BACKEND_SYSLOG: + log_syslog(level, format, args); + break; + case LOGGER_BACKEND_STDOUT: + log_stdout(level, format, args); + break; + } + + va_end(args); + + return current_backend != -1; +} -- cgit v1.2.3