blob: 30c1b9315919ff886ba14c3fa5bd3996b4f1b73e [file] [log] [blame]
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00001
2/*
3 TODO:
Igor Sysoevaa3436c2003-05-30 14:27:59 +00004 add WSA error messages for NT and 98
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00005 test for English only messages
6*/
7
8#include <ngx_config.h>
Igor Sysoevaa3436c2003-05-30 14:27:59 +00009#include <ngx_core.h>
10
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000011
Igor Sysoev239baac2003-06-11 15:28:34 +000012ngx_str_t wsa_errors[] = {
13 ngx_string("Invalid argument"), /* 10022 */
14 ngx_null_string, /* 10023 */
15 ngx_null_string, /* 10024 */
16 ngx_null_string, /* 10025 */
17 ngx_null_string, /* 10026 */
18 ngx_null_string, /* 10027 */
19 ngx_null_string, /* 10028 */
20 ngx_null_string, /* 10029 */
21 ngx_null_string, /* 10030 */
22 ngx_null_string, /* 10031 */
23 ngx_null_string, /* 10032 */
24 ngx_null_string, /* 10033 */
25 ngx_null_string, /* 10034 */
26 ngx_string("Resource temporarily unavailable") /* 10035 */
27};
28
29
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000030int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size)
31{
Igor Sysoev239baac2003-06-11 15:28:34 +000032 int n;
33 u_int len;
34 ngx_err_t format_error;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000035
36 len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
37 | FORMAT_MESSAGE_IGNORE_INSERTS,
38 NULL, err,
39 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
40 errstr, size, NULL);
41
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000042 if (len == 0) {
Igor Sysoev239baac2003-06-11 15:28:34 +000043 format_error = GetLastError();
44
45 if (format_error == ERROR_MR_MID_NOT_FOUND) {
46 n = err - WSABASEERR - 22;
47
48 if (n >= 0 && n < 14) {
49 len = wsa_errors[n].len;
50
51 if (len) {
52 if (len > size) {
53 len = size;
54 }
55
56 ngx_memcpy(errstr, wsa_errors[n].data, len);
57 return len;
58 }
59 }
60 }
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000061
62 len = ngx_snprintf(errstr, size,
Igor Sysoev239baac2003-06-11 15:28:34 +000063 "FormatMessage() error:(%d)", format_error);
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000064 return len;
65
66 }
67
68 /* remove ".\r\n\0" */
69 while (errstr[len] == '\0' || errstr[len] == CR
70 || errstr[len] == LF || errstr[len] == '.')
71 --len;
72
73 return ++len;
74}