
/*
 * 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 */
    ngx_null_string,                                               /* 10042 */
    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];
}
