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