X-Git-Url: https://git.librecmc.org/?p=oweals%2Ftinc.git;a=blobdiff_plain;f=src%2Flogger.c;h=e0e6bcad4714350bbcff38b3d45ae7631e386f52;hp=032349d1e0eaeaeffa886741f22e3800417a23da;hb=d49a336658d772821bee2dbe97df3d4f748c8c4c;hpb=eefa28059ab989c915a7d95fb4ae728abd7ce713 diff --git a/src/logger.c b/src/logger.c index 032349d..e0e6bca 100644 --- a/src/logger.c +++ b/src/logger.c @@ -1,7 +1,7 @@ /* logger.c -- logging code - Copyright (C) 2003 Guus Sliepen - 2003 Ivo Timmermans + Copyright (C) 2004-2006 Guus Sliepen + 2004-2005 Ivo Timmermans 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 @@ -13,11 +13,9 @@ 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: logger.c,v 1.1.2.5 2003/07/22 20:55:19 guus Exp $ + 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., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "system.h" @@ -30,6 +28,9 @@ static logmode_t logmode = LOGMODE_STDERR; static pid_t logpid; extern char *logfilename; static FILE *logfile = NULL; +#ifdef HAVE_MINGW +static HANDLE loghandle = NULL; +#endif static const char *logident = NULL; void openlogger(const char *ident, logmode_t mode) { @@ -37,41 +38,82 @@ void openlogger(const char *ident, logmode_t mode) { logmode = mode; switch(mode) { - case LOGMODE_NULL: - break; case LOGMODE_STDERR: logpid = getpid(); break; case LOGMODE_FILE: logpid = getpid(); logfile = fopen(logfilename, "a"); - if(!logfile) + if(!logfile) { + fprintf(stderr, "Could not open log file %s: %s\n", logfilename, strerror(errno)); logmode = LOGMODE_NULL; + } break; case LOGMODE_SYSLOG: +#ifdef HAVE_MINGW + loghandle = RegisterEventSource(NULL, logident); + if(!loghandle) { + fprintf(stderr, "Could not open log handle!"); + logmode = LOGMODE_NULL; + } + break; +#else +#ifdef HAVE_SYSLOG_H openlog(logident, LOG_CONS | LOG_PID, LOG_DAEMON); break; +#endif +#endif + case LOGMODE_NULL: + break; + } +} + +void reopenlogger() { + if(logmode != LOGMODE_FILE) + return; + + fflush(logfile); + FILE *newfile = fopen(logfilename, "a"); + if(!newfile) { + logger(LOG_ERR, "Unable to reopen log file %s: %s", logfilename, strerror(errno)); + return; } + fclose(logfile); + logfile = newfile; } void logger(int priority, const char *format, ...) { va_list ap; + char timestr[32] = ""; + time_t now; va_start(ap, format); switch(logmode) { - case LOGMODE_NULL: - break; case LOGMODE_STDERR: vfprintf(stderr, format, ap); fprintf(stderr, "\n"); + fflush(stderr); break; case LOGMODE_FILE: - fprintf(logfile, "%ld %s[%d]: ", time(NULL), logident, logpid); + now = time(NULL); + strftime(timestr, sizeof timestr, "%Y-%m-%d %H:%M:%S", localtime(&now)); + fprintf(logfile, "%s %s[%ld]: ", timestr, logident, (long)logpid); vfprintf(logfile, format, ap); fprintf(logfile, "\n"); + fflush(logfile); break; case LOGMODE_SYSLOG: +#ifdef HAVE_MINGW + { + char message[4096]; + const char *messages[] = {message}; + vsnprintf(message, sizeof(message), format, ap); + message[sizeof message - 1] = 0; + ReportEvent(loghandle, priority, 0, 0, NULL, 1, 0, messages, NULL); + } +#else +#ifdef HAVE_SYSLOG_H #ifdef HAVE_VSYSLOG vsyslog(priority, format, ap); #else @@ -82,6 +124,10 @@ void logger(int priority, const char *format, ...) { } #endif break; +#endif +#endif + case LOGMODE_NULL: + break; } va_end(ap); @@ -89,14 +135,22 @@ void logger(int priority, const char *format, ...) { void closelogger(void) { switch(logmode) { - case LOGMODE_NULL: - case LOGMODE_STDERR: - break; case LOGMODE_FILE: fclose(logfile); break; case LOGMODE_SYSLOG: +#ifdef HAVE_MINGW + DeregisterEventSource(loghandle); + break; +#else +#ifdef HAVE_SYSLOG_H closelog(); break; +#endif +#endif + case LOGMODE_NULL: + case LOGMODE_STDERR: + break; + break; } }