annotate src/os/unix/ngx_errno.c @ 7784:8cc5b0365ee5

Improved maximum errno detection. Previously, systems without sys_nerr (or _sys_nerr) were handled with an assumption that errors start at 0 and continuous. This is, however, not something POSIX requires, and not true on some platforms. Notably, on Linux, where sys_nerr is no longer available for newly linked binaries starting with glibc 2.32, there are gaps in error list, which used to stop us from properly detecting maximum errno. Further, on GNU/Hurd errors start at 0x40000001. With this change, maximum errno detection is moved to the runtime code, now able to ignore gaps, and also detects the first error if needed. This fixes observed "Unknown error" messages as seen on Linux with glibc 2.32 and on GNU/Hurd.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 01 Mar 2021 20:00:43 +0300
parents f1a0de6eb505
children c43a2e8fdf7e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 305
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 305
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4133
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 305
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 305
diff changeset
6
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 305
diff changeset
7
210
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
12 /*
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
13 * The strerror() messages are copied because:
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
14 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
15 * 1) strerror() and strerror_r() functions are not Async-Signal-Safe,
4133
59b99f217c6d Replaced "can not" with "cannot" and "could not" in a bunch of places.
Ruslan Ermilov <ru@nginx.com>
parents: 3787
diff changeset
16 * therefore, they cannot be used in signal handlers;
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
17 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
18 * 2) a direct sys_errlist[] array may be used instead of these functions,
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
19 * but Linux linker warns about its usage:
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
20 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
21 * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
22 * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
23 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
24 * causing false bug reports.
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
25 */
210
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
28 static ngx_str_t *ngx_sys_errlist;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
29 static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
30 static ngx_err_t ngx_first_error;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
31 static ngx_err_t ngx_last_error;
211
fd9fecc4193f nginx-0.0.1-2003-12-15-16:57:13 import
Igor Sysoev <igor@sysoev.ru>
parents: 210
diff changeset
32
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
33
2335
3d8ab5957202 ngx_strerror_r() style and size == 0 bug fix
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
34 u_char *
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
35 ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
36 {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
37 ngx_str_t *msg;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
38
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
39 if (err >= ngx_first_error && err < ngx_last_error) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
40 msg = &ngx_sys_errlist[err - ngx_first_error];
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
41
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
42 } else {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
43 msg = &ngx_unknown_error;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
44 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
45
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
46 size = ngx_min(size, msg->len);
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
47
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
48 return ngx_cpymem(errstr, msg->data, size);
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
49 }
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
50
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
51
4693
f1a0de6eb505 Fixed return type of ngx_strerror_init().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
52 ngx_int_t
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
53 ngx_strerror_init(void)
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
54 {
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
55 char *msg;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
56 u_char *p;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
57 size_t len;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
58 ngx_err_t err;
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
59
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
60 #if (NGX_SYS_NERR)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
61 ngx_first_error = 0;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
62 ngx_last_error = NGX_SYS_NERR;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
63
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
64 #elif (EPERM > 1000 && EPERM < 0x7fffffff - 1000)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
65
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
66 /*
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
67 * If number of errors is not known, and EPERM error code has large
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
68 * but reasonable value, guess possible error codes based on the error
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
69 * messages returned by strerror(), starting from EPERM. Notably,
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
70 * this covers GNU/Hurd, where errors start at 0x40000001.
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
71 */
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
72
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
73 for (err = EPERM; err > EPERM - 1000; err--) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
74 ngx_set_errno(0);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
75 msg = strerror(err);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
76
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
77 if (errno == EINVAL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
78 || msg == NULL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
79 || strncmp(msg, "Unknown error", 13) == 0)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
80 {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
81 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
82 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
83
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
84 ngx_first_error = err;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
85 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
86
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
87 for (err = EPERM; err < EPERM + 1000; err++) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
88 ngx_set_errno(0);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
89 msg = strerror(err);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
90
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
91 if (errno == EINVAL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
92 || msg == NULL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
93 || strncmp(msg, "Unknown error", 13) == 0)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
94 {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
95 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
96 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
97
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
98 ngx_last_error = err + 1;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
99 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
100
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
101 #else
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
102
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
103 /*
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
104 * If number of errors is not known, guess it based on the error
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
105 * messages returned by strerror().
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
106 */
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
107
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
108 ngx_first_error = 0;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
109
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
110 for (err = 0; err < 1000; err++) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
111 ngx_set_errno(0);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
112 msg = strerror(err);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
113
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
114 if (errno == EINVAL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
115 || msg == NULL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
116 || strncmp(msg, "Unknown error", 13) == 0)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
117 {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
118 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
119 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
120
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
121 ngx_last_error = err + 1;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
122 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
123
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
124 #endif
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
125
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
126 /*
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
127 * ngx_strerror() is not ready to work at this stage, therefore,
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
128 * malloc() is used and possible errors are logged using strerror().
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
129 */
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
130
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
131 len = (ngx_last_error - ngx_first_error) * sizeof(ngx_str_t);
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
132
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
133 ngx_sys_errlist = malloc(len);
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
134 if (ngx_sys_errlist == NULL) {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
135 goto failed;
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
136 }
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
137
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
138 for (err = ngx_first_error; err < ngx_last_error; err++) {
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
139 msg = strerror(err);
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
140
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
141 if (msg == NULL) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
142 ngx_sys_errlist[err - ngx_first_error] = ngx_unknown_error;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
143 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
144 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
145
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
146 len = ngx_strlen(msg);
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
147
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
148 p = malloc(len);
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
149 if (p == NULL) {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
150 goto failed;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
151 }
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
152
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
153 ngx_memcpy(p, msg, len);
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
154 ngx_sys_errlist[err - ngx_first_error].len = len;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
155 ngx_sys_errlist[err - ngx_first_error].data = p;
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
156 }
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
157
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
158 return NGX_OK;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
159
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
160 failed:
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
161
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
162 err = errno;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
163 ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
164
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
165 return NGX_ERROR;
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
166 }