root/compat/win32/syslog.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. openlog
  2. syslog

#include "../../git-compat-util.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, ...)
{
        WORD logtype;
        char *str, *pos;
        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);
        if (!str) {
                warning("malloc failed: '%s'", strerror(errno));
                return;
        }

        va_start(ap, fmt);
        vsnprintf(str, str_len + 1, fmt, ap);
        va_end(ap);

        while ((pos = strstr(str, "%1")) != NULL) {
                str = realloc(str, ++str_len + 1);
                if (!str) {
                        warning("realloc failed: '%s'", strerror(errno));
                        return;
                }
                memmove(pos + 2, pos + 1, strlen(pos));
                pos[1] = ' ';
        }

        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 **)&str, NULL);
        free(str);
}

/* [<][>][^][v][top][bottom][index][help] */