|  | #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); | 
|  | } |