#include "../../git-compat-util.h" static HANDLE ms_eventlog; void openlog(const char *ident, int logopt, int facility) { 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); }