1 #include "../../git-compat-util.h"
2 
3 static HANDLE ms_eventlog;
4 
5 void openlog(const char *ident, int logopt, int facility)
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 
16 void syslog(int priority, const char *fmt, ...)
17 {
18 	WORD logtype;
19 	char *str, *pos;
20 	int str_len;
return_0(int i)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 		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;
52 		}
53 		memmove(pos + 2, pos + 1, strlen(pos));
54 		pos[1] = ' ';
55 	}
56 
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;
64 
65 	case LOG_WARNING:
66 		logtype = EVENTLOG_WARNING_TYPE;
pthread_exit(void * ret)67 		break;
68 
69 	case LOG_NOTICE:
70 	case LOG_INFO:
71 	case LOG_DEBUG:
72 	default:
pthread_key_create(pthread_key_t * keyp,void (* destructor)(void * value))73 		logtype = EVENTLOG_INFORMATION_TYPE;
74 		break;
75 	}
76 
77 	ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0,
pthread_key_delete(pthread_key_t key)78 	    (const char **)&str, NULL);
79 	free(str);
80 }
81