compat / win32 / syslog.con commit Merge branch 'as/read-tree-prefix-doc-fix' (3e25b6c)
   1#include "../../git-compat-util.h"
   2
   3static HANDLE ms_eventlog;
   4
   5void 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
  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                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;
  67                break;
  68
  69        case LOG_NOTICE:
  70        case LOG_INFO:
  71        case LOG_DEBUG:
  72        default:
  73                logtype = EVENTLOG_INFORMATION_TYPE;
  74                break;
  75        }
  76
  77        ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0,
  78            (const char **)&str, NULL);
  79        free(str);
  80}