annotate src/os/unix/ngx_errno.c @ 7785:c43a2e8fdf7e

Introduced strerrordesc_np() support. The strerrordesc_np() function, introduced in glibc 2.32, provides an async-signal-safe way to obtain error messages. This makes it possible to avoid copying error messages.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 01 Mar 2021 20:00:45 +0300
parents 8cc5b0365ee5
children
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
7785
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
12 static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
13
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
14
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
15 #if (NGX_HAVE_STRERRORDESC_NP)
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
16
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
17 /*
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
18 * The strerrordesc_np() function, introduced in glibc 2.32, is
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
19 * async-signal-safe. This makes it possible to use it directly,
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
20 * without copying error messages.
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
21 */
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
22
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
23
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
24 u_char *
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
25 ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
26 {
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
27 size_t len;
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
28 const char *msg;
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
29
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
30 msg = strerrordesc_np(err);
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
31
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
32 if (msg == NULL) {
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
33 msg = (char *) ngx_unknown_error.data;
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
34 len = ngx_unknown_error.len;
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
35
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
36 } else {
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
37 len = ngx_strlen(msg);
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
38 }
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
39
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
40 size = ngx_min(size, len);
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
41
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
42 return ngx_cpymem(errstr, msg, size);
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
43 }
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
44
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
45
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
46 ngx_int_t
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
47 ngx_strerror_init(void)
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
48 {
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
49 return NGX_OK;
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
50 }
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
51
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
52
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
53 #else
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
54
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
55 /*
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
56 * 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
57 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
58 * 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
59 * 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
60 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
61 * 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
62 * 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
63 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
64 * 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
65 * 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
66 *
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
67 * causing false bug reports.
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
68 */
210
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69
00cafae0bdf1 nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
71 static ngx_str_t *ngx_sys_errlist;
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
72 static ngx_err_t ngx_first_error;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
73 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
74
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
75
2335
3d8ab5957202 ngx_strerror_r() style and size == 0 bug fix
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
76 u_char *
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
77 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
78 {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
79 ngx_str_t *msg;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
80
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
81 if (err >= ngx_first_error && err < ngx_last_error) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
82 msg = &ngx_sys_errlist[err - ngx_first_error];
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 } else {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
85 msg = &ngx_unknown_error;
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
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
88 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
89
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
90 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
91 }
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
92
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
93
4693
f1a0de6eb505 Fixed return type of ngx_strerror_init().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
94 ngx_int_t
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
95 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
96 {
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
97 char *msg;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
98 u_char *p;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
99 size_t len;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
100 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
101
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
102 #if (NGX_SYS_NERR)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
103 ngx_first_error = 0;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
104 ngx_last_error = NGX_SYS_NERR;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
105
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
106 #elif (EPERM > 1000 && EPERM < 0x7fffffff - 1000)
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 /*
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
109 * 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
110 * 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
111 * messages returned by strerror(), starting from EPERM. Notably,
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
112 * this covers GNU/Hurd, where errors start at 0x40000001.
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
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
115 for (err = EPERM; err > EPERM - 1000; err--) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
116 ngx_set_errno(0);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
117 msg = strerror(err);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
118
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
119 if (errno == EINVAL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
120 || msg == NULL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
121 || strncmp(msg, "Unknown error", 13) == 0)
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 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
124 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
125
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
126 ngx_first_error = err;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
127 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
128
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
129 for (err = EPERM; err < EPERM + 1000; err++) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
130 ngx_set_errno(0);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
131 msg = strerror(err);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
132
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
133 if (errno == EINVAL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
134 || msg == NULL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
135 || strncmp(msg, "Unknown error", 13) == 0)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
136 {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
137 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
138 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
139
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
140 ngx_last_error = err + 1;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
141 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
142
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
143 #else
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 /*
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
146 * 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
147 * messages returned by strerror().
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
148 */
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
149
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
150 ngx_first_error = 0;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
151
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
152 for (err = 0; err < 1000; err++) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
153 ngx_set_errno(0);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
154 msg = strerror(err);
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
155
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
156 if (errno == EINVAL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
157 || msg == NULL
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
158 || strncmp(msg, "Unknown error", 13) == 0)
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
159 {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
160 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
161 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
162
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
163 ngx_last_error = err + 1;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
164 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
165
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
166 #endif
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
167
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
168 /*
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
169 * 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
170 * 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
171 */
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
172
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
173 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
174
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
175 ngx_sys_errlist = malloc(len);
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
176 if (ngx_sys_errlist == NULL) {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
177 goto failed;
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
178 }
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
179
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
180 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
181 msg = strerror(err);
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
182
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
183 if (msg == NULL) {
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
184 ngx_sys_errlist[err - ngx_first_error] = ngx_unknown_error;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
185 continue;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
186 }
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
187
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
188 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
189
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
190 p = malloc(len);
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
191 if (p == NULL) {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
192 goto failed;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
193 }
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
194
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
195 ngx_memcpy(p, msg, len);
7784
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
196 ngx_sys_errlist[err - ngx_first_error].len = len;
8cc5b0365ee5 Improved maximum errno detection.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
197 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
198 }
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
199
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
200 return NGX_OK;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
201
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
202 failed:
256
8e39cab6abd5 nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents: 211
diff changeset
203
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
204 err = errno;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
205 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
206
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2335
diff changeset
207 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
208 }
7785
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
209
c43a2e8fdf7e Introduced strerrordesc_np() support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7784
diff changeset
210 #endif