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