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