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