annotate src/os/win32/ngx_event_log.c @ 2764:d4a717592877

use ngx_vslprintf(), ngx_slprintf()
author Igor Sysoev <igor@sysoev.ru>
date Mon, 27 Apr 2009 13:06:20 +0000
parents d43d73277c5c
children 6d358aeaa989
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 * Copyright (C) Igor Sysoev
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6 #include <ngx_config.h>
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_core.h>
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #define NGX_MAX_ERROR_STR 2048
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 void ngx_cdecl
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 ngx_event_log(ngx_err_t err, const char *fmt, ...)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 u_char *p, *last;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17 long types;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 HKEY key;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 HANDLE ev;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 va_list args;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 u_char text[NGX_MAX_ERROR_STR];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 const char *msgarg[9];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 static u_char netmsg[] = "%SystemRoot%\\System32\\netmsg.dll";
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
2764
d4a717592877 use ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
25 last = text + NGX_MAX_ERROR_STR;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 p = text + GetModuleFileName(NULL, (char *) text, NGX_MAX_ERROR_STR - 50);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 *p++ = ':';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29 ngx_linefeed(p);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 va_start(args, fmt);
2764
d4a717592877 use ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
32 p = ngx_vslprintf(p, last, fmt, args);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 va_end(args);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
35 if (err) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 if (p > last - 50) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 /* leave a space for an error code */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 p = last - 50;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 *p++ = '.';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 *p++ = '.';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 *p++ = '.';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
2764
d4a717592877 use ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
47 p = ngx_slprintf(p, last, ((unsigned) err < 0x80000000)
d4a717592877 use ngx_vslprintf(), ngx_slprintf()
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
48 ? " (%d: " : " (%Xd: ", err);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 p = ngx_strerror_r(err, p, last - p);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51 if (p < last) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 *p++ = ')';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 if (p > last - NGX_LINEFEED_SIZE - 1) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 p = last - NGX_LINEFEED_SIZE - 1;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 ngx_linefeed(p);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 *p = '\0';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 * we do not log errors here since we use
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 * Event Log only to log our own logs open errors
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\nginx",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &key, NULL)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 != 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 return;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 if (RegSetValueEx(key, "EventMessageFile", 0, REG_EXPAND_SZ,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 netmsg, sizeof(netmsg) - 1)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 != 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 return;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 types = EVENTLOG_ERROR_TYPE;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 if (RegSetValueEx(key, "TypesSupported", 0, REG_DWORD,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 (u_char *) &types, sizeof(long))
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 != 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 return;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 RegCloseKey(key);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 ev = RegisterEventSource(NULL, "nginx");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 msgarg[0] = (char *) text;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 msgarg[1] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 msgarg[2] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 msgarg[3] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 msgarg[4] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 msgarg[5] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 msgarg[6] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 msgarg[7] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 msgarg[8] = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 /*
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 * the 3299 event id in netmsg.dll has the generic message format:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109 * "%1 %2 %3 %4 %5 %6 %7 %8 %9"
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 */
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112 ReportEvent(ev, EVENTLOG_ERROR_TYPE, 0, 3299, NULL, 9, 0, msgarg, NULL);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 DeregisterEventSource(ev);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 }