view src/os/win32/ngx_event_log.c @ 4367:9c4acdf9b276 stable-1.0

Merge of r4315: Allowed add_header for proxied 206 replies. It was working for nginx's own 206 replies as they are seen as 200 in the headers filter module (range filter goes later in the headers filter chain), but not for proxied replies.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 14 Dec 2011 18:06:21 +0000
parents 6d358aeaa989
children d620f497c50f
line wrap: on
line source

/*
 * 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";

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

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

    va_start(args, fmt);
    p = ngx_vslprintf(p, last, fmt, args);
    va_end(args);

    if (err) {
        p = ngx_log_errno(p, last, err);
    }

    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);
}