Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
| 3 | TODO: |
Igor Sysoev | aa3436c | 2003-05-30 14:27:59 +0000 | [diff] [blame] | 4 | add WSA error messages for NT and 98 |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 5 | test for English only messages |
| 6 | */ |
| 7 | |
| 8 | #include <ngx_config.h> |
Igor Sysoev | aa3436c | 2003-05-30 14:27:59 +0000 | [diff] [blame] | 9 | #include <ngx_core.h> |
| 10 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 11 | |
Igor Sysoev | 239baac | 2003-06-11 15:28:34 +0000 | [diff] [blame^] | 12 | ngx_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 Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 30 | int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size) |
| 31 | { |
Igor Sysoev | 239baac | 2003-06-11 15:28:34 +0000 | [diff] [blame^] | 32 | int n; |
| 33 | u_int len; |
| 34 | ngx_err_t format_error; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 35 | |
| 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 Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 42 | if (len == 0) { |
Igor Sysoev | 239baac | 2003-06-11 15:28:34 +0000 | [diff] [blame^] | 43 | 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 Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 61 | |
| 62 | len = ngx_snprintf(errstr, size, |
Igor Sysoev | 239baac | 2003-06-11 15:28:34 +0000 | [diff] [blame^] | 63 | "FormatMessage() error:(%d)", format_error); |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 64 | 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 | } |