Git fork
at reftables-rust 83 lines 1.5 kB view raw
1#include "../../git-compat-util.h" 2 3static HANDLE ms_eventlog; 4 5void openlog(const char *ident, int logopt UNUSED, int facility UNUSED) 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 16void syslog(int priority, const char *fmt, ...) 17{ 18 WORD logtype; 19 char *str, *pos; 20 int str_len; 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 size_t offset = pos - str; 47 char *new_pos; 48 char *oldstr = str; 49 str = realloc(str, st_add(++str_len, 1)); 50 if (!str) { 51 free(oldstr); 52 warning_errno("realloc failed"); 53 return; 54 } 55 new_pos = str + offset; 56 memmove(new_pos + 2, new_pos + 1, strlen(new_pos)); 57 new_pos[1] = ' '; 58 } 59 60 switch (priority) { 61 case LOG_EMERG: 62 case LOG_ALERT: 63 case LOG_CRIT: 64 case LOG_ERR: 65 logtype = EVENTLOG_ERROR_TYPE; 66 break; 67 68 case LOG_WARNING: 69 logtype = EVENTLOG_WARNING_TYPE; 70 break; 71 72 case LOG_NOTICE: 73 case LOG_INFO: 74 case LOG_DEBUG: 75 default: 76 logtype = EVENTLOG_INFORMATION_TYPE; 77 break; 78 } 79 80 ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0, 81 (const char **)&str, NULL); 82 free(str); 83}