| #include "../../git-compat-util.h" | 
 |  | 
 | static HANDLE ms_eventlog; | 
 |  | 
 | void openlog(const char *ident, int logopt UNUSED, int facility UNUSED) | 
 | { | 
 | 	if (ms_eventlog) | 
 | 		return; | 
 |  | 
 | 	ms_eventlog = RegisterEventSourceA(NULL, ident); | 
 |  | 
 | 	if (!ms_eventlog) | 
 | 		warning("RegisterEventSource() failed: %lu", GetLastError()); | 
 | } | 
 |  | 
 | void syslog(int priority, const char *fmt, ...) | 
 | { | 
 | 	WORD logtype; | 
 | 	char *str, *pos; | 
 | 	int str_len; | 
 | 	va_list ap; | 
 |  | 
 | 	if (!ms_eventlog) | 
 | 		return; | 
 |  | 
 | 	va_start(ap, fmt); | 
 | 	str_len = vsnprintf(NULL, 0, fmt, ap); | 
 | 	va_end(ap); | 
 |  | 
 | 	if (str_len < 0) { | 
 | 		warning_errno("vsnprintf failed"); | 
 | 		return; | 
 | 	} | 
 |  | 
 | 	str = malloc(st_add(str_len, 1)); | 
 | 	if (!str) { | 
 | 		warning_errno("malloc failed"); | 
 | 		return; | 
 | 	} | 
 |  | 
 | 	va_start(ap, fmt); | 
 | 	vsnprintf(str, str_len + 1, fmt, ap); | 
 | 	va_end(ap); | 
 |  | 
 | 	while ((pos = strstr(str, "%1")) != NULL) { | 
 | 		size_t offset = pos - str; | 
 | 		char *new_pos; | 
 | 		char *oldstr = str; | 
 | 		str = realloc(str, st_add(++str_len, 1)); | 
 | 		if (!str) { | 
 | 			free(oldstr); | 
 | 			warning_errno("realloc failed"); | 
 | 			return; | 
 | 		} | 
 | 		new_pos = str + offset; | 
 | 		memmove(new_pos + 2, new_pos + 1, strlen(new_pos)); | 
 | 		new_pos[1] = ' '; | 
 | 	} | 
 |  | 
 | 	switch (priority) { | 
 | 	case LOG_EMERG: | 
 | 	case LOG_ALERT: | 
 | 	case LOG_CRIT: | 
 | 	case LOG_ERR: | 
 | 		logtype = EVENTLOG_ERROR_TYPE; | 
 | 		break; | 
 |  | 
 | 	case LOG_WARNING: | 
 | 		logtype = EVENTLOG_WARNING_TYPE; | 
 | 		break; | 
 |  | 
 | 	case LOG_NOTICE: | 
 | 	case LOG_INFO: | 
 | 	case LOG_DEBUG: | 
 | 	default: | 
 | 		logtype = EVENTLOG_INFORMATION_TYPE; | 
 | 		break; | 
 | 	} | 
 |  | 
 | 	ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0, | 
 | 	    (const char **)&str, NULL); | 
 | 	free(str); | 
 | } |