#include "../../git-compat-util.h" #include "../../strbuf.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, ...) { struct strbuf sb = STRBUF_INIT; struct strbuf_expand_dict_entry dict[] = { {"1", "% 1"}, {NULL, NULL} }; WORD logtype; char *str; 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("vsnprintf failed: '%s'", strerror(errno)); return; } str = malloc(str_len + 1); va_start(ap, fmt); vsnprintf(str, str_len + 1, fmt, ap); va_end(ap); strbuf_expand(&sb, str, strbuf_expand_dict_cb, &dict); free(str); 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 **)&sb.buf, NULL); strbuf_release(&sb); }