rebase --root: fix amending root commit messages
[git.git] / compat / win32 / syslog.c
blob161978d720aed9db5a00c77d1c6bd9a073544f15
1 #include "../../git-compat-util.h"
3 static HANDLE ms_eventlog;
5 void openlog(const char *ident, int logopt, int facility)
7 if (ms_eventlog)
8 return;
10 ms_eventlog = RegisterEventSourceA(NULL, ident);
12 if (!ms_eventlog)
13 warning("RegisterEventSource() failed: %lu", GetLastError());
16 void syslog(int priority, const char *fmt, ...)
18 WORD logtype;
19 char *str, *pos;
20 int str_len;
21 va_list ap;
23 if (!ms_eventlog)
24 return;
26 va_start(ap, fmt);
27 str_len = vsnprintf(NULL, 0, fmt, ap);
28 va_end(ap);
30 if (str_len < 0) {
31 warning_errno("vsnprintf failed");
32 return;
35 str = malloc(st_add(str_len, 1));
36 if (!str) {
37 warning_errno("malloc failed");
38 return;
41 va_start(ap, fmt);
42 vsnprintf(str, str_len + 1, fmt, ap);
43 va_end(ap);
45 while ((pos = strstr(str, "%1")) != NULL) {
46 char *oldstr = str;
47 str = realloc(str, st_add(++str_len, 1));
48 if (!str) {
49 free(oldstr);
50 warning_errno("realloc failed");
51 return;
53 memmove(pos + 2, pos + 1, strlen(pos));
54 pos[1] = ' ';
57 switch (priority) {
58 case LOG_EMERG:
59 case LOG_ALERT:
60 case LOG_CRIT:
61 case LOG_ERR:
62 logtype = EVENTLOG_ERROR_TYPE;
63 break;
65 case LOG_WARNING:
66 logtype = EVENTLOG_WARNING_TYPE;
67 break;
69 case LOG_NOTICE:
70 case LOG_INFO:
71 case LOG_DEBUG:
72 default:
73 logtype = EVENTLOG_INFORMATION_TYPE;
74 break;
77 ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0,
78 (const char **)&str, NULL);
79 free(str);