X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Flogger.c;fp=src%2Flogger.c;h=9bbd8fe712059bbd0f40306b9ca2f9f5e670cad2;hb=ff03bb9b0a744530e1145fef656644987a10d62d;hp=0000000000000000000000000000000000000000;hpb=56c51e94a620dd91eeb510176b9c970af9a9a372;p=tinc diff --git a/src/logger.c b/src/logger.c new file mode 100644 index 00000000..9bbd8fe7 --- /dev/null +++ b/src/logger.c @@ -0,0 +1,141 @@ +/* + logger.c -- logging + + Copyright (C) 2003-2004 Guus Sliepen + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#include "system.h" + +#include "logger/logger.h" + +logger_level_t logger_level = LOGGER_LEVEL_NONE; + +static logger_mode_t logger_mode = LOGGER_MODE_STDERR; +static pid_t logger_pid; +char *logger_filename; +static FILE *logger_file = NULL; +#ifdef HAVE_MINGW +static HANDLE logger_handle = NULL; +#endif +static const char *logger_ident = NULL; + +bool logger_init(const char *ident, logger_mode_t mode) { + logger_ident = ident; + logger_mode = mode; + + switch(mode) { + case LOGGER_MODE_STDERR: + logger_pid = getpid(); + break; + case LOGGER_MODE_FILE: + logger_pid = getpid(); + logger_file = fopen(logger_filename, "a"); + if(!logger_file) + logger_mode = LOGGER_MODE_NULL; + break; + case LOGGER_MODE_SYSLOG: +#ifdef HAVE_MINGW + logger_handle = RegisterEventSource(NULL, logger_ident); + if(!logger_handle) + logger_mode = LOGGER_MODE_NULL; + break; +#else +#ifdef HAVE_SYSLOG_H + openlog(logger_ident, LOG_CONS | LOG_PID, LOG_DAEMON); + break; +#endif +#endif + case LOGGER_MODE_NULL: + break; + } + + return true; +} + +bool logger_exit(void) { + switch(logger_mode) { + case LOGGER_MODE_FILE: + fclose(logger_file); + break; + case LOGGER_MODE_SYSLOG: +#ifdef HAVE_MINGW + DeregisterEventSource(logger_handle); + break; +#else +#ifdef HAVE_SYSLOG_H + closelog(); + break; +#endif +#endif + case LOGGER_MODE_NULL: + case LOGGER_MODE_STDERR: + break; + break; + } + + return true; +} + +void logger(int priority, const char *format, ...) { + va_list ap; + + va_start(ap, format); + + switch(logger_mode) { + case LOGGER_MODE_STDERR: + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); + fflush(stderr); + break; + case LOGGER_MODE_FILE: + fprintf(logger_file, "%ld %s[%ld]: ", time(NULL), logger_ident, (long)logger_pid); + vfprintf(logger_file, format, ap); + fprintf(logger_file, "\n"); + fflush(logger_file); + break; + case LOGGER_MODE_SYSLOG: +#ifdef HAVE_MINGW + { + char message[4096]; + char *messages[] = {message}; + vsnprintf(message, sizeof(message), format, ap); + ReportEvent(logger_handle, priority, 0, 0, NULL, 1, 0, messages, NULL); + } +#else +#ifdef HAVE_SYSLOG_H +#ifdef HAVE_VSYSLOG + vsyslog(priority, format, ap); +#else + { + char message[4096]; + vsnprintf(message, sizeof(message), format, ap); + syslog(priority, "%s", message); + } +#endif + break; +#endif +#endif + case LOGGER_MODE_NULL: + break; + } + + va_end(ap); +} + +