1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyevu_char *
13e18a033bSKonstantin Ananyevngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
14e18a033bSKonstantin Ananyev{
15e18a033bSKonstantin Ananyev    u_int          len;
16e18a033bSKonstantin Ananyev    static u_long  lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev    if (size == 0) {
19e18a033bSKonstantin Ananyev        return errstr;
20e18a033bSKonstantin Ananyev    }
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyev    len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
23e18a033bSKonstantin Ananyev                        NULL, err, lang, (char *) errstr, size, NULL);
24e18a033bSKonstantin Ananyev
25e18a033bSKonstantin Ananyev    if (len == 0 && lang && GetLastError() == ERROR_RESOURCE_LANG_NOT_FOUND) {
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev        /*
28e18a033bSKonstantin Ananyev         * Try to use English messages first and fallback to a language,
29e18a033bSKonstantin Ananyev         * based on locale: non-English Windows have no English messages
30e18a033bSKonstantin Ananyev         * at all.  This way allows to use English messages at least on
31e18a033bSKonstantin Ananyev         * Windows with MUI.
32e18a033bSKonstantin Ananyev         */
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyev        lang = 0;
35e18a033bSKonstantin Ananyev
36e18a033bSKonstantin Ananyev        len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
37e18a033bSKonstantin Ananyev                            NULL, err, lang, (char *) errstr, size, NULL);
38e18a033bSKonstantin Ananyev    }
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev    if (len == 0) {
41e18a033bSKonstantin Ananyev        return ngx_snprintf(errstr, size,
42e18a033bSKonstantin Ananyev                            "FormatMessage() error:(%d)", GetLastError());
43e18a033bSKonstantin Ananyev    }
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev    /* remove ".\r\n\0" */
46e18a033bSKonstantin Ananyev    while (errstr[len] == '\0' || errstr[len] == CR
47e18a033bSKonstantin Ananyev           || errstr[len] == LF || errstr[len] == '.')
48e18a033bSKonstantin Ananyev    {
49e18a033bSKonstantin Ananyev        --len;
50e18a033bSKonstantin Ananyev    }
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev    return &errstr[++len];
53e18a033bSKonstantin Ananyev}
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyev
56e18a033bSKonstantin Ananyevngx_int_t
57e18a033bSKonstantin Ananyevngx_strerror_init(void)
58e18a033bSKonstantin Ananyev{
59e18a033bSKonstantin Ananyev    return NGX_OK;
60e18a033bSKonstantin Ananyev}