Git fork
1#include "../../git-compat-util.h"
2
3static HANDLE ms_eventlog;
4
5void openlog(const char *ident, int logopt UNUSED, int facility UNUSED)
6{
7 if (ms_eventlog)
8 return;
9
10 ms_eventlog = RegisterEventSourceA(NULL, ident);
11
12 if (!ms_eventlog)
13 warning("RegisterEventSource() failed: %lu", GetLastError());
14}
15
16void syslog(int priority, const char *fmt, ...)
17{
18 WORD logtype;
19 char *str, *pos;
20 int str_len;
21 va_list ap;
22
23 if (!ms_eventlog)
24 return;
25
26 va_start(ap, fmt);
27 str_len = vsnprintf(NULL, 0, fmt, ap);
28 va_end(ap);
29
30 if (str_len < 0) {
31 warning_errno("vsnprintf failed");
32 return;
33 }
34
35 str = malloc(st_add(str_len, 1));
36 if (!str) {
37 warning_errno("malloc failed");
38 return;
39 }
40
41 va_start(ap, fmt);
42 vsnprintf(str, str_len + 1, fmt, ap);
43 va_end(ap);
44
45 while ((pos = strstr(str, "%1")) != NULL) {
46 size_t offset = pos - str;
47 char *new_pos;
48 char *oldstr = str;
49 str = realloc(str, st_add(++str_len, 1));
50 if (!str) {
51 free(oldstr);
52 warning_errno("realloc failed");
53 return;
54 }
55 new_pos = str + offset;
56 memmove(new_pos + 2, new_pos + 1, strlen(new_pos));
57 new_pos[1] = ' ';
58 }
59
60 switch (priority) {
61 case LOG_EMERG:
62 case LOG_ALERT:
63 case LOG_CRIT:
64 case LOG_ERR:
65 logtype = EVENTLOG_ERROR_TYPE;
66 break;
67
68 case LOG_WARNING:
69 logtype = EVENTLOG_WARNING_TYPE;
70 break;
71
72 case LOG_NOTICE:
73 case LOG_INFO:
74 case LOG_DEBUG:
75 default:
76 logtype = EVENTLOG_INFORMATION_TYPE;
77 break;
78 }
79
80 ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0,
81 (const char **)&str, NULL);
82 free(str);
83}