[Groonga-commit] groonga/groonga at 9bd0c0f [master] Support Windows Event log by old API :<

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Aug 17 23:41:16 JST 2015


Kouhei Sutou	2015-08-17 23:41:16 +0900 (Mon, 17 Aug 2015)

  New Revision: 9bd0c0f74a5e3df8af1f8f0f3c39f3f788349913
  https://github.com/groonga/groonga/commit/9bd0c0f74a5e3df8af1f8f0f3c39f3f788349913

  Message:
    Support Windows Event log by old API :<
    
    It breaks backward compatibility. grn_windows_event_logger_set()
    requires two arguments.
    
    It's OK because the function is used only from PGroonga.

  Modified files:
    include/groonga/windows_event_logger.h
    lib/windows_event_logger.c
    src/groonga.c

  Modified: include/groonga/windows_event_logger.h (+2 -1)
===================================================================
--- include/groonga/windows_event_logger.h    2015-08-17 19:23:02 +0900 (1bc5710)
+++ include/groonga/windows_event_logger.h    2015-08-17 23:41:16 +0900 (c5fd80a)
@@ -23,7 +23,8 @@
 extern "C" {
 #endif
 
-GRN_API grn_rc grn_windows_event_logger_set(grn_ctx *ctx);
+GRN_API grn_rc grn_windows_event_logger_set(grn_ctx *ctx,
+                                            const char *event_source_name);
 
 #ifdef __cplusplus
 }

  Modified: lib/windows_event_logger.c (+38 -58)
===================================================================
--- lib/windows_event_logger.c    2015-08-17 19:23:02 +0900 (4e1589b)
+++ lib/windows_event_logger.c    2015-08-17 23:41:16 +0900 (ebe025e)
@@ -24,11 +24,9 @@
 
 #ifdef WIN32
 
-# include <evntprov.h>
-# include <evntrace.h>
-
 typedef struct _grn_windows_event_logger_data {
-  REGHANDLE registration_handle;
+  char *event_source_name;
+  HANDLE event_source;
 } grn_windows_event_logger_data;
 
 static void
@@ -38,47 +36,50 @@ 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 event_data_size = 0;
+  const WCHAR *strings[1];
+  LPVOID event_data = NULL;
   const char level_marks[] = " EACewnid-";
   grn_obj formatted_buffer;
   UINT code_page;
   DWORD convert_flags = 0;
   int n_converted_chars;
-  EVENT_DESCRIPTOR event;
 
   switch (level) {
   case GRN_LOG_NONE :
-    event.Level = TRACE_LEVEL_NONE;
+    return;
     break;
   case GRN_LOG_EMERG :
   case GRN_LOG_ALERT :
   case GRN_LOG_CRIT :
-    event.Level = TRACE_LEVEL_CRITICAL;
-    break;
   case GRN_LOG_ERROR :
-    event.Level = TRACE_LEVEL_ERROR;
+    type = EVENTLOG_ERROR_TYPE;
     break;
   case GRN_LOG_WARNING :
-    event.Level = TRACE_LEVEL_WARNING;
+    type = EVENTLOG_WARNING_TYPE;
     break;
   case GRN_LOG_NOTICE :
   case GRN_LOG_INFO :
   case GRN_LOG_DEBUG :
   case GRN_LOG_DUMP :
-    event.Level = TRACE_LEVEL_INFORMATION;
+    type = EVENTLOG_INFORMATION_TYPE;
     break;
   default :
-    event.Level = TRACE_LEVEL_INFORMATION;
+    type = EVENTLOG_ERROR_TYPE;
     break;
   }
 
-  event.Id = event.Level;
-  event.Version = 0;
-  /* 16 is the value of //channel[@value] in
-     data/windows_event_log/provider.man. */
-  event.Channel = 16;
-  event.Opcode = 0;
-  event.Task = 0;
-  event.Keyword = 0x00;
+  if (data->event_source == INVALID_HANDLE_VALUE) {
+    data->event_source = RegisterEventSourceA(NULL, data->event_source_name);
+    if (data->event_source == INVALID_HANDLE_VALUE) {
+      return;
+    }
+  }
 
   GRN_TEXT_INIT(&formatted_buffer, 0);
   if (location && location[0]) {
@@ -100,7 +101,6 @@ windows_event_logger_log(grn_ctx *ctx, grn_log_level level,
 #define CONVERTED_BUFFER_SIZE 512
   if (n_converted_chars < CONVERTED_BUFFER_SIZE) {
     WCHAR converted_buffer[CONVERTED_BUFFER_SIZE];
-    EVENT_DATA_DESCRIPTOR descriptor;
     n_converted_chars = MultiByteToWideChar(code_page,
                                             convert_flags,
                                             GRN_TEXT_VALUE(&formatted_buffer),
@@ -108,16 +108,13 @@ windows_event_logger_log(grn_ctx *ctx, grn_log_level level,
                                             converted_buffer,
                                             CONVERTED_BUFFER_SIZE);
     converted_buffer[n_converted_chars] = L'\0';
-    EventDataDescCreate(&descriptor, converted_buffer,
-                        sizeof(WCHAR) * n_converted_chars);
-    EventWrite(data->registration_handle,
-               &event,
-               1,
-               &descriptor);
+    strings[0] = converted_buffer;
+    ReportEventW(data->event_source, type, category, event_id, user_sid,
+                 n_strings, event_data_size,
+                 strings, event_data);
 #undef CONVERTED_BUFFER_SIZE
   } else {
     WCHAR *converted;
-    EVENT_DATA_DESCRIPTOR descriptor;
     converted = GRN_MALLOCN(WCHAR, n_converted_chars);
     n_converted_chars = MultiByteToWideChar(code_page,
                                             convert_flags,
@@ -126,12 +123,10 @@ windows_event_logger_log(grn_ctx *ctx, grn_log_level level,
                                             converted,
                                             n_converted_chars);
     converted[n_converted_chars] = L'\0';
-    EventDataDescCreate(&descriptor, converted,
-                        sizeof(WCHAR) * n_converted_chars);
-    EventWrite(data->registration_handle,
-               &event,
-               1,
-               &descriptor);
+    strings[0] = converted;
+    ReportEventW(data->event_source, type, category, event_id, user_sid,
+                 n_strings, event_data_size,
+                 strings, event_data);
     GRN_FREE(converted);
   }
   GRN_OBJ_FIN(ctx, &formatted_buffer);
@@ -147,15 +142,16 @@ windows_event_logger_fin(grn_ctx *ctx, void *user_data)
 {
   grn_windows_event_logger_data *data = user_data;
 
-  if (data->registration_handle) {
-    EventUnregister(data->registration_handle);
+  free(data->name);
+  if (data->event_source != INVALID_HANDLE_VALUE) {
+    DeregisterEventSource(data->event_source);
   }
   free(data);
 }
 #endif /* WIN32 */
 
 grn_rc
-grn_windows_event_logger_set(grn_ctx *ctx)
+grn_windows_event_logger_set(grn_ctx *ctx, const char *event_source_name)
 {
 #ifdef WIN32
   grn_rc rc;
@@ -177,28 +173,12 @@ grn_windows_event_logger_set(grn_ctx *ctx)
     }
   }
 
-  {
-    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());
-      }
-    }
+  if (event_source_name) {
+    data->event_source_name = grn_strdup_raw(event_source_name);
+  } else {
+    data->event_source_name = grn_strdup_raw("libgroonga");
   }
+  data->event_source = INVALID_HANDLE_VALUE;
 
   windows_event_logger.max_level = GRN_LOG_DEFAULT_LEVEL;
   windows_event_logger.flags     = GRN_LOG_TIME | GRN_LOG_MESSAGE;

  Modified: src/groonga.c (+8 -7)
===================================================================
--- src/groonga.c    2015-08-17 19:23:02 +0900 (dc7d805)
+++ src/groonga.c    2015-08-17 23:41:16 +0900 (aa045c8)
@@ -105,6 +105,7 @@ static int ready_notify_pipe[2];
 static grn_encoding encoding;
 static grn_command_version default_command_version;
 static int64_t default_match_escalation_threshold;
+static char *windows_event_source_name = "Groonga";
 static grn_bool use_windows_event_log = GRN_FALSE;
 
 static int
@@ -360,7 +361,7 @@ do_alone(int argc, char **argv)
   grn_ctx ctx_, *ctx = &ctx_;
   grn_ctx_init(ctx, 0);
   if (use_windows_event_log) {
-    grn_windows_event_logger_set(ctx);
+    grn_windows_event_logger_set(ctx, windows_event_source_name);
   }
   if (argc > 0 && argv) { path = *argv++; argc--; }
   db = (newdb || !path) ? grn_db_create(ctx, path, NULL) : grn_db_open(ctx, path);
@@ -440,7 +441,7 @@ g_client(int argc, char **argv)
   if (argc > 0 && argv) { hostname = *argv++; argc--; }
   grn_ctx_init(ctx, 0);
   if (use_windows_event_log) {
-    grn_windows_event_logger_set(ctx);
+    grn_windows_event_logger_set(ctx, windows_event_source_name);
   }
   if (!grn_ctx_connect(ctx, hostname, port, 0)) {
     if (!argc) {
@@ -1943,7 +1944,7 @@ h_worker(void *arg)
   grn_ctx ctx_, *ctx = &ctx_;
   grn_ctx_init(ctx, 0);
   if (use_windows_event_log) {
-    grn_windows_event_logger_set(ctx);
+    grn_windows_event_logger_set(ctx, windows_event_source_name);
   }
   grn_ctx_use(ctx, (grn_obj *)arg);
   grn_ctx_recv_handler_set(ctx, h_output, &hc);
@@ -2011,7 +2012,7 @@ h_server(char *path)
   grn_ctx ctx_, *ctx = &ctx_;
   grn_ctx_init(ctx, 0);
   if (use_windows_event_log) {
-    grn_windows_event_logger_set(ctx);
+    grn_windows_event_logger_set(ctx, windows_event_source_name);
   }
   MUTEX_INIT(q_mutex);
   COND_INIT(q_cond);
@@ -2153,7 +2154,7 @@ g_handler(grn_ctx *ctx, grn_obj *msg)
     if (added) {
       grn_ctx_init(&edge->ctx, 0);
       if (use_windows_event_log) {
-        grn_windows_event_logger_set(&edge->ctx);
+        grn_windows_event_logger_set(&edge->ctx, windows_event_source_name);
       }
       GRN_COM_QUEUE_INIT(&edge->recv_new);
       GRN_COM_QUEUE_INIT(&edge->send_old);
@@ -2182,7 +2183,7 @@ g_server(char *path)
   grn_ctx ctx_, *ctx = &ctx_;
   grn_ctx_init(ctx, 0);
   if (use_windows_event_log) {
-    grn_windows_event_logger_set(ctx);
+    grn_windows_event_logger_set(ctx, windows_event_source_name);
   }
   MUTEX_INIT(q_mutex);
   COND_INIT(q_cond);
@@ -2953,7 +2954,7 @@ main(int argc, char **argv)
 #endif /* WIN32 */
 
   if (use_windows_event_log) {
-    grn_windows_event_logger_set(NULL);
+    grn_windows_event_logger_set(NULL, windows_event_source_name);
   }
 
   if (log_path_arg) {
-------------- next part --------------
HTML����������������������������...
Download 



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