[Groonga-commit] groonga/groonga at 342fdda [master] windows: try to use Windows Event Log API

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Jul 27 21:57:53 JST 2015


Kouhei Sutou	2015-07-27 21:57:53 +0900 (Mon, 27 Jul 2015)

  New Revision: 342fdda24892313b9b8eaefcb66af3ada578af19
  https://github.com/groonga/groonga/commit/342fdda24892313b9b8eaefcb66af3ada578af19

  Message:
    windows: try to use Windows Event Log API

  Added files:
    data/windows_event_log/provider.man
  Modified files:
    lib/grn.h
    lib/windows_event_logger.c

  Added: data/windows_event_log/provider.man (+24 -0) 100644
===================================================================
--- /dev/null
+++ data/windows_event_log/provider.man    2015-07-27 21:57:53 +0900 (e3b717c)
@@ -0,0 +1,24 @@
+<?xml version="1.0"?><!-- -*- mode: xml -*- -->
+<instrumentationManifest
+    xmlns="http://schemas.microsoft.com/win/2004/08/events"
+    xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <instrumentation>
+    <events>
+      <provider name="Groonga"
+                guid="{851d655e-1970-400b-99a3-1c6fac5cbe18}">
+        <levels>
+          <level name="Emergency" value="1"/>
+          <level name="Alert"     value="2"/>
+          <level name="Critical"  value="3"/>
+          <level name="Error"     value="4"/>
+          <level name="Warning"   value="5"/>
+          <level name="Notice"    value="6"/>
+          <level name="Info"      value="7"/>
+          <level name="Debug"     value="8"/>
+          <level name="Dump"      value="9"/>
+        </levels>
+      </provider>
+    </events>
+  </instrumentation>
+</instrumentationManifest>

  Modified: lib/grn.h (+1 -1)
===================================================================
--- lib/grn.h    2015-07-27 19:25:42 +0900 (c5adb99)
+++ lib/grn.h    2015-07-27 21:57:53 +0900 (a15c855)
@@ -68,7 +68,7 @@
 
 # if defined(__GNUC__) && !defined(WINVER)
 #  include <w32api.h>
-#  define WINVER WindowsXP
+#  define WINVER WindowsVista
 # endif /* defined(__GNUC__) && !defined(WINVER) */
 
 # include <basetsd.h>

  Modified: lib/windows_event_logger.c (+75 -109)
===================================================================
--- lib/windows_event_logger.c    2015-07-27 19:25:42 +0900 (a0c7b27)
+++ lib/windows_event_logger.c    2015-07-27 21:57:53 +0900 (81d6ed6)
@@ -23,8 +23,11 @@
 #include <string.h>
 
 #ifdef WIN32
+
+# include <evntprov.h>
+
 typedef struct _grn_windows_event_logger_data {
-  HANDLE event_log;
+  REGHANDLE registration_handle;
 } grn_windows_event_logger_data;
 
 static void
@@ -34,108 +37,62 @@ windows_event_logger_log(grn_ctx *ctx, grn_log_level level,
                          void *user_data)
 {
   grn_windows_event_logger_data *data = user_data;
-  WORD type;
-  WORD category = 0;
-  DWORD event_id = 0;
-  PSID user_sid = NULL;
-  WORD n_strings = 1;
-  DWORD data_size = 0;
-  void *raw_data = NULL;
-
-  switch (level) {
-  case GRN_LOG_NONE :
-    type = EVENTLOG_INFORMATION_TYPE;
-    break;
-  case GRN_LOG_EMERG :
-  case GRN_LOG_ALERT :
-  case GRN_LOG_CRIT :
-  case GRN_LOG_ERROR :
-    type = EVENTLOG_ERROR_TYPE;
-    break;
-  case GRN_LOG_WARNING :
-    type = EVENTLOG_WARNING_TYPE;
-    break;
-  case GRN_LOG_NOTICE :
-  case GRN_LOG_INFO :
-  case GRN_LOG_DEBUG :
-  case GRN_LOG_DUMP :
-    type = EVENTLOG_INFORMATION_TYPE;
-    break;
-  default :
-    type = EVENTLOG_INFORMATION_TYPE;
-    break;
+  const char level_marks[] = " EACewnid-";
+  grn_obj formatted_buffer;
+  UINT code_page;
+  DWORD convert_flags = 0;
+  int n_converted_chars;
+  ULONGLONG keyword = 0;
+
+  GRN_TEXT_INIT(&formatted_buffer, 0);
+  if (location && location[0]) {
+    grn_text_printf(ctx, &formatted_buffer, "%s|%c|%s %s %s",
+                    timestamp, level_marks[level], title, message, location);
+  } else {
+    grn_text_printf(ctx, &formatted_buffer, "%s|%c|%s %s",
+                    timestamp, level_marks[level], title, message);
   }
 
-  {
-    const char level_marks[] = " EACewnid-";
-    grn_obj formatted_buffer;
-    UINT code_page;
-    DWORD convert_flags = 0;
-    int n_converted_chars;
-#define CONVERTED_BUFFER_SIZE 512
-
-    GRN_TEXT_INIT(&formatted_buffer, 0);
-    if (location && location[0]) {
-      grn_text_printf(ctx, &formatted_buffer, "%s|%c|%s %s %s",
-                      timestamp, level_marks[level], title, message, location);
-    } else {
-      grn_text_printf(ctx, &formatted_buffer, "%s|%c|%s %s",
-                      timestamp, level_marks[level], title, message);
-    }
-
-    code_page = grn_windows_encoding_to_code_page(ctx->encoding);
+  code_page = grn_windows_encoding_to_code_page(ctx->encoding);
 
+  n_converted_chars = MultiByteToWideChar(code_page,
+                                          convert_flags,
+                                          GRN_TEXT_VALUE(&formatted_buffer),
+                                          GRN_TEXT_LEN(&formatted_buffer),
+                                          NULL,
+                                          0);
+#define CONVERTED_BUFFER_SIZE 512
+  if (n_converted_chars < CONVERTED_BUFFER_SIZE) {
+    WCHAR converted_buffer[CONVERTED_BUFFER_SIZE];
     n_converted_chars = MultiByteToWideChar(code_page,
                                             convert_flags,
                                             GRN_TEXT_VALUE(&formatted_buffer),
                                             GRN_TEXT_LEN(&formatted_buffer),
-                                            NULL,
-                                            0);
-    if (n_converted_chars < CONVERTED_BUFFER_SIZE) {
-      WCHAR converted_buffer[CONVERTED_BUFFER_SIZE];
-      const WCHAR *strings[1];
-      n_converted_chars = MultiByteToWideChar(code_page,
-                                              convert_flags,
-                                              GRN_TEXT_VALUE(&formatted_buffer),
-                                              GRN_TEXT_LEN(&formatted_buffer),
-                                              converted_buffer,
-                                              CONVERTED_BUFFER_SIZE);
-      converted_buffer[n_converted_chars] = L'\0';
-      strings[0] = converted_buffer;
-      ReportEventW(data->event_log,
-                   type,
-                   category,
-                   event_id,
-                   user_sid,
-                   n_strings,
-                   data_size,
-                   strings,
-                   raw_data);
-    } else {
-      WCHAR *converted;
-      const WCHAR *strings[1];
-      converted = GRN_MALLOCN(WCHAR, n_converted_chars);
-      n_converted_chars = MultiByteToWideChar(code_page,
-                                              convert_flags,
-                                              GRN_TEXT_VALUE(&formatted_buffer),
-                                              GRN_TEXT_LEN(&formatted_buffer),
-                                              converted,
-                                              n_converted_chars);
-      converted[n_converted_chars] = L'\0';
-      strings[0] = converted;
-      ReportEventW(data->event_log,
-                   type,
-                   category,
-                   event_id,
-                   user_sid,
-                   n_strings,
-                   data_size,
-                   strings,
-                   raw_data);
-      GRN_FREE(converted);
-    }
-    GRN_OBJ_FIN(ctx, &formatted_buffer);
+                                            converted_buffer,
+                                            CONVERTED_BUFFER_SIZE);
+    converted_buffer[n_converted_chars] = L'\0';
+    EventWriteString(data->registration_handle,
+                     level,
+                     keyword,
+                     converted_buffer);
+#undef CONVERTED_BUFFER_SIZE
+  } else {
+    WCHAR *converted;
+    converted = GRN_MALLOCN(WCHAR, n_converted_chars);
+    n_converted_chars = MultiByteToWideChar(code_page,
+                                            convert_flags,
+                                            GRN_TEXT_VALUE(&formatted_buffer),
+                                            GRN_TEXT_LEN(&formatted_buffer),
+                                            converted,
+                                            n_converted_chars);
+    converted[n_converted_chars] = L'\0';
+    EventWriteString(data->registration_handle,
+                     level,
+                     keyword,
+                     converted);
+    GRN_FREE(converted);
   }
+  GRN_OBJ_FIN(ctx, &formatted_buffer);
 }
 
 static void
@@ -148,8 +105,8 @@ windows_event_logger_fin(grn_ctx *ctx, void *user_data)
 {
   grn_windows_event_logger_data *data = user_data;
 
-  if (data->event_log) {
-    DeregisterEventSource(data->event_log);
+  if (data->registration_handle) {
+    EventUnregister(data->registration_handle);
   }
   free(data);
 }
@@ -162,7 +119,7 @@ grn_windows_event_logger_set(grn_ctx *ctx)
   grn_rc rc;
   grn_logger windows_event_logger;
   grn_windows_event_logger_data *data;
-  const char *source_name = "Groonga";
+
   if (ctx) {
     GRN_API_ENTER;
   }
@@ -178,17 +135,26 @@ grn_windows_event_logger_set(grn_ctx *ctx)
     }
   }
 
-  data->event_log = RegisterEventSourceA(NULL, source_name);
-  if (!data->event_log) {
-    free(data);
-    if (ctx) {
-      SERR("RegisterEventSource");
-      GRN_LOG(ctx, GRN_LOG_ERROR,
-              "failed to register event source: <%s>",
-              source_name);
-      GRN_API_RETURN(ctx->rc);
-    } else {
-      return grn_windows_error_code_to_rc(GetLastError());
+  {
+    ULONG status;
+    const GUID provide_id = {
+      0x851d655e,
+      0x1970,
+      0x400b,
+      {0x99, 0xa3, 0x1c, 0x6f, 0xac, 0x5c, 0xbe, 0x18}
+    };
+    status = EventRegister(&provide_id,
+                           NULL, NULL,
+                           &(data->registration_handle));
+    if (status != ERROR_SUCCESS) {
+      free(data);
+      if (ctx) {
+        SERR("EventRegister");
+        GRN_LOG(ctx, GRN_LOG_ERROR, "failed to register event: <%lu>", status);
+        GRN_API_RETURN(ctx->rc);
+      } else {
+        return grn_windows_error_code_to_rc(GetLastError());
+      }
     }
   }
 
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index