
/*
 * Copyright (C) Igor Sysoev
 */


/*
 * TODO:
 *   add WSA error messages for NT and 98
 *   test for English only messages
 */

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


static ngx_str_t  wsa_errors[] = {
    ngx_string("An invalid argument was supplied"),      /* WSAEINVAL 10022 */
    ngx_string("Too many open sockets"),                 /* WSAEMFILE 10023 */

    ngx_null_string,                                               /* 10024 */
    ngx_null_string,                                               /* 10025 */
    ngx_null_string,                                               /* 10026 */
    ngx_null_string,                                               /* 10027 */
    ngx_null_string,                                               /* 10028 */
    ngx_null_string,                                               /* 10029 */
    ngx_null_string,                                               /* 10030 */
    ngx_null_string,                                               /* 10031 */
    ngx_null_string,                                               /* 10032 */
    ngx_null_string,                                               /* 10033 */
    ngx_null_string,                                               /* 10034 */

    /* WSAEWOULDBLOCK 10035 */
    ngx_string("A non-blocking socket operation could not be completed "
               "immediately"),

    ngx_null_string,                                               /* 10036 */
    ngx_null_string,                                               /* 10037 */

    /* WSAENOTSOCK 10038 */
    ngx_string("An operation was attempted on something that is not a socket"),

    ngx_null_string,                                               /* 10039 */
    ngx_null_string,                                               /* 10040 */
    ngx_null_string,                                               /* 10041 */

    /* WSAENOPROTOOPT 10042 */
    ngx_string("An unknown, invalid, or unsupported option or level was "
               "specified in a getsockopt or setsockopt call"),

    ngx_null_string,                                               /* 10043 */
    ngx_null_string,                                               /* 10044 */
    ngx_null_string,                                               /* 10045 */
    ngx_null_string,                                               /* 10046 */
    ngx_null_string,                                               /* 10047 */
    ngx_null_string,                                               /* 10048 */
    ngx_null_string,                                               /* 10049 */
    ngx_null_string,                                               /* 10050 */
    ngx_null_string,                                               /* 10051 */
    ngx_null_string,                                               /* 10052 */
    ngx_null_string,                                               /* 10053 */

    /* WSAECONNRESET 10054 */
    ngx_string("An existing connection was forcibly closed by the remote host"),

    /* WSAENOBUFS 10055 */
    ngx_string("An operation on a socket could not be performed because "
               "the system lacked sufficient buffer space or "
               "because a queue was full"),

    /* WSAEISCONN 10056 */
    ngx_string("A connect request was made on an already connected socket"),

    /* WSAENOTCONN 10057 */
    ngx_string("A request to send or receive data was disallowed because"
               "the socket is not connected and (when sending on a datagram "
               "socket using a sendto call) no address was supplied"),

    ngx_null_string,                                               /* 10058 */
    ngx_null_string,                                               /* 10059 */

    /* WSAETIMEDOUT 10060 */
    ngx_string("A connection attempt failed because the connected party "
               "did not properly respond after a period of time, "
               "or established connection failed because connected host "
               "has failed to respond"),

    /* WSAECONNREFUSED 10061 */
    ngx_string("No connection could be made because the target machine "
               "actively refused it")
};


u_char *
ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size)
{
    int        n;
    u_int      len;
    ngx_err_t  format_error;

    if (size == 0) {
        return errstr;
    }

    len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
                        |FORMAT_MESSAGE_IGNORE_INSERTS,
                        NULL, err,
                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                        (char *) errstr, size, NULL);

    if (len == 0) {
        format_error = GetLastError();

        if (format_error == ERROR_MR_MID_NOT_FOUND) {
            n = err - WSAEINVAL;

            if (n >= 0 && n <= WSAECONNREFUSED - WSAEINVAL) {
                len = wsa_errors[n].len;

                if (len) {
                    if (len > size) {
                        len = size;
                    }

                    ngx_memcpy(errstr, wsa_errors[n].data, len);

                    return errstr + len;
                }
            }
        }

        return ngx_snprintf(errstr, size,
                            "FormatMessage() error:(%d)", format_error);
    }

    /* remove ".\r\n\0" */
    while (errstr[len] == '\0' || errstr[len] == CR
           || errstr[len] == LF || errstr[len] == '.')
    {
        --len;
    }

    return &errstr[++len];
}
