/*
 * Copyright (C) Igor Sysoev
 */


#include <ngx_config.h>
#include <ngx_core.h>


#define NGX_MAX_ERROR_STR   2048


void ngx_cdecl
ngx_event_log(ngx_err_t err, const char *fmt, ...)
{
    u_char         *p, *last;
    long            types;
    HKEY            key;
    HANDLE          ev;
    va_list         args;
    u_char          text[NGX_MAX_ERROR_STR];
    const char     *msgarg[9];
    static u_char   netmsg[] = "%SystemRoot%\\System32\\netmsg.dll";

    p = text + GetModuleFileName(NULL, (char *) text, NGX_MAX_ERROR_STR - 50);

    *p++ = ':';
    ngx_linefeed(p);

    va_start(args, fmt);
    p = ngx_vsnprintf(p, NGX_MAX_ERROR_STR, fmt, args);
    va_end(args);

    last = text + NGX_MAX_ERROR_STR;

    if (err) {

        if (p > last - 50) {

            /* leave a space for an error code */

            p = last - 50;
            *p++ = '.';
            *p++ = '.';
            *p++ = '.';
        }

        p = ngx_snprintf(p, last - p, ((unsigned) err < 0x80000000)
                                           ? " (%d: " : " (%Xd: ", err);
        p = ngx_strerror_r(err, p, last - p);

        if (p < last) {
            *p++ = ')';
        }
    }

    if (p > last - NGX_LINEFEED_SIZE - 1) {
        p = last - NGX_LINEFEED_SIZE - 1;
    }

    ngx_linefeed(p);

    *p = '\0';

    /*
     * we do not log errors here since we use
     * Event Log only to log our own logs open errors
     */

    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
           "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\nginx",
           0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &key, NULL)
        != 0)
    {
        return;
    }

    if (RegSetValueEx(key, "EventMessageFile", 0, REG_EXPAND_SZ,
                      netmsg, sizeof(netmsg) - 1)
        != 0)
    {
        return;
    }

    types = EVENTLOG_ERROR_TYPE;

    if (RegSetValueEx(key, "TypesSupported", 0, REG_DWORD,
                      (u_char *) &types, sizeof(long))
        != 0)
    {
        return;
    }

    RegCloseKey(key);

    ev = RegisterEventSource(NULL, "nginx");

    msgarg[0] = (char *) text;
    msgarg[1] = NULL;
    msgarg[2] = NULL;
    msgarg[3] = NULL;
    msgarg[4] = NULL;
    msgarg[5] = NULL;
    msgarg[6] = NULL;
    msgarg[7] = NULL;
    msgarg[8] = NULL;

    /*
     * the 3299 event id in netmsg.dll has the generic message format:
     *     "%1 %2 %3 %4 %5 %6 %7 %8 %9"
     */

    ReportEvent(ev, EVENTLOG_ERROR_TYPE, 0, 3299, NULL, 9, 0, msgarg, NULL);

    DeregisterEventSource(ev);
}
