Move all source code to src/.
[tinc] / src / logger.c
diff --git a/src/logger.c b/src/logger.c
new file mode 100644 (file)
index 0000000..9bbd8fe
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+    logger.c -- logging
+
+    Copyright (C) 2003-2004 Guus Sliepen <guus@tinc-vpn.org>
+
+    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);
+}
+
+