8
9
#include <ngx_core.h>
11
#if (NGX_HAVE_STRERROR_R)
13
u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
21
strerror_r(err, (char *) errstr, size);
23
while (*errstr && size) {
31
#elif (NGX_HAVE_GNU_STRERROR_R)
33
/* Linux strerror_r() */
35
u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
45
str = strerror_r(err, (char *) errstr, size);
47
if (str != (char *) errstr) {
48
return ngx_cpystrn(errstr, (u_char *) str, size);
51
while (*errstr && size) {
13
* The strerror() messages are copied because:
15
* 1) strerror() and strerror_r() functions are not Async-Signal-Safe,
16
* therefore, they cannot be used in signal handlers;
18
* 2) a direct sys_errlist[] array may be used instead of these functions,
19
* but Linux linker warns about its usage:
21
* warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
22
* warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
24
* causing false bug reports.
28
static ngx_str_t *ngx_sys_errlist;
29
static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
33
ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
37
msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:
39
size = ngx_min(size, msg->len);
41
return ngx_cpymem(errstr, msg->data, size);
46
ngx_strerror_init(void)
54
* ngx_strerror() is not ready to work at this stage, therefore,
55
* malloc() is used and possible errors are logged using strerror().
58
len = NGX_SYS_NERR * sizeof(ngx_str_t);
60
ngx_sys_errlist = malloc(len);
61
if (ngx_sys_errlist == NULL) {
65
for (err = 0; err < NGX_SYS_NERR; err++) {
67
len = ngx_strlen(msg);
74
ngx_memcpy(p, msg, len);
75
ngx_sys_errlist[err].len = len;
76
ngx_sys_errlist[err].data = p;
84
ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));