diff common/logging.c @ 615:2a4f7364ab81

Add first simple event logging functions
author Andre Heinecke <andre.heinecke@intevation.de>
date Thu, 19 Jun 2014 11:53:07 +0200
parents 17e1c8f37d72
children 0172740f5c6e
line wrap: on
line diff
--- a/common/logging.c	Wed Jun 18 16:35:03 2014 +0200
+++ b/common/logging.c	Thu Jun 19 11:53:07 2014 +0200
@@ -9,8 +9,80 @@
 #include "strhelp.h"
 
 #include <stdio.h>
+#include <stdarg.h>
+#include <stdbool.h>
+
+#include <strhelp.h>
 
 #ifdef WIN32
+# include <windows.h>
+#else
+# include <syslog.h>
+#endif
+
+
+#ifdef WIN32
+static void
+win_log(const char *format, va_list ap, bool error)
+{
+  HANDLE log_src = NULL;
+  wchar_t *wmsg = NULL;
+  BOOL failure = TRUE;
+  WORD type = 0,
+       category = 0;
+  char buffer[MAX_LOG+1];
+
+  vsnprintf (buffer, MAX_LOG, format, ap);
+  buffer[MAX_LOG] = '\0';
+
+  log_src = RegisterEventSourceA (NULL, LOG_NAME);
+
+  if (log_src == NULL)
+    {
+      PRINTLASTERROR ("Failed to open log source.");
+      return;
+    }
+
+  if (error)
+    {
+      type = EVENTLOG_ERROR_TYPE;
+    }
+  else
+    {
+      type = EVENTLOG_INFORMATION_TYPE;
+    }
+
+  wmsg = utf8_to_wchar (buffer, strlen(buffer));
+  if (wmsg == NULL)
+    {
+      ERRORPRINTF ("Failed to convert log message to utf-16");
+      goto done;
+    }
+
+  failure = ReportEventW (log_src,
+                          type,
+                          category,
+                          0,
+                          NULL,
+                          1,
+                          0,
+                          (const WCHAR **) &wmsg,
+                          NULL);
+  if (failure)
+    {
+      PRINTLASTERROR ("Failed to report event.");
+    }
+
+done:
+  xfree (wmsg);
+
+  if (!DeregisterEventSource (log_src))
+    {
+      PRINTLASTERROR ("Failed to close log source.");
+    }
+  return;
+}
+
 char *
 getLastErrorMsg()
 {
@@ -44,4 +116,40 @@
   return retval;
 }
 
+#else /* WIN32 */
+
+
+static void
+linux_log (const char *format, va_list ap, bool error)
+{
+  openlog (LOG_NAME, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
+  vsyslog ( error ? LOG_ERR : LOG_INFO, format, ap);
+}
+
+#endif /* WIN32 */
+
+void
+syslog_info_printf(const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+#ifdef WIN32
+  win_log (format, args, false);
+#else
+  linux_log (format, args, false);
 #endif
+  va_end (args);
+}
+
+void
+syslog_error_printf(const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+#ifdef WIN32
+  win_log (format, args, true);
+#else
+  linux_log (format, args, true);
+#endif
+  va_end (args);
+}

http://wald.intevation.org/projects/trustbridge/