0
|
1
|
|
2 /*
|
|
3 * Copyright (C) Igor Sysoev
|
|
4 */
|
|
5
|
|
6
|
|
7 #include <ngx_config.h>
|
|
8 #include <ngx_core.h>
|
|
9
|
|
10
|
617
|
11 /*
|
|
12 * The strerror() messages are copied because:
|
|
13 *
|
|
14 * 1) strerror() and strerror_r() functions are not Async-Signal-Safe,
|
|
15 * therefore, they can not be used in signal handlers;
|
|
16 *
|
|
17 * 2) a direct sys_errlist[] array may be used instead of these functions,
|
|
18 * but Linux linker warns about its usage:
|
|
19 *
|
|
20 * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
|
|
21 * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
|
|
22 *
|
|
23 * causing false bug reports.
|
|
24 */
|
0
|
25
|
|
26
|
617
|
27 static ngx_str_t *ngx_sys_errlist;
|
|
28 static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
|
0
|
29
|
|
30
|
431
|
31 u_char *
|
617
|
32 ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
|
|
33 {
|
|
34 ngx_str_t *msg;
|
|
35
|
|
36 msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:
|
|
37 &ngx_unknown_error;
|
|
38 size = ngx_min(size, msg->len);
|
|
39
|
|
40 return ngx_cpymem(errstr, msg->data, size);
|
|
41 }
|
|
42
|
|
43
|
|
44 ngx_uint_t
|
|
45 ngx_strerror_init(void)
|
0
|
46 {
|
617
|
47 char *msg;
|
|
48 u_char *p;
|
|
49 size_t len;
|
|
50 ngx_err_t err;
|
0
|
51
|
617
|
52 /*
|
|
53 * ngx_strerror() is not ready to work at this stage, therefore,
|
|
54 * malloc() is used and possible errors are logged using strerror().
|
|
55 */
|
|
56
|
|
57 len = NGX_SYS_NERR * sizeof(ngx_str_t);
|
|
58
|
|
59 ngx_sys_errlist = malloc(len);
|
|
60 if (ngx_sys_errlist == NULL) {
|
|
61 goto failed;
|
0
|
62 }
|
|
63
|
617
|
64 for (err = 0; err < NGX_SYS_NERR; err++) {
|
|
65 msg = strerror(err);
|
|
66 len = ngx_strlen(msg);
|
0
|
67
|
617
|
68 p = malloc(len);
|
|
69 if (p == NULL) {
|
|
70 goto failed;
|
|
71 }
|
0
|
72
|
617
|
73 ngx_memcpy(p, msg, len);
|
|
74 ngx_sys_errlist[err].len = len;
|
|
75 ngx_sys_errlist[err].data = p;
|
0
|
76 }
|
|
77
|
617
|
78 return NGX_OK;
|
|
79
|
|
80 failed:
|
0
|
81
|
617
|
82 err = errno;
|
|
83 ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));
|
|
84
|
|
85 return NGX_ERROR;
|
0
|
86 }
|