3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
12 #define NGX_SYS_NERR 128
16 * The strerror() messages are copied because:
18 * 1) strerror() and strerror_r() functions are not Async-Signal-Safe,
19 * therefore, they cannot be used in signal handlers;
21 * 2) a direct sys_errlist[] array may be used instead of these functions,
22 * but Linux linker warns about its usage:
24 * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
25 * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
27 * causing false bug reports.
31 static ngx_str_t
*ngx_sys_errlist
;
32 static ngx_str_t ngx_unknown_error
= ngx_string("Unknown error");
36 ngx_strerror(ngx_err_t err
, u_char
*errstr
, size_t size
)
40 msg
= ((ngx_uint_t
) err
< NGX_SYS_NERR
) ? &ngx_sys_errlist
[err
]:
42 size
= ngx_min(size
, msg
->len
);
44 return ngx_cpymem(errstr
, msg
->data
, size
);
49 ngx_strerror_init(void)
57 * ngx_strerror() is not ready to work at this stage, therefore,
58 * malloc() is used and possible errors are logged using strerror().
61 len
= NGX_SYS_NERR
* sizeof(ngx_str_t
);
63 ngx_sys_errlist
= malloc(len
);
64 if (ngx_sys_errlist
== NULL
) {
68 for (err
= 0; err
< NGX_SYS_NERR
; err
++) {
70 len
= ngx_strlen(msg
);
77 ngx_memcpy(p
, msg
, len
);
78 ngx_sys_errlist
[err
].len
= len
;
79 ngx_sys_errlist
[err
].data
= p
;
87 ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len
, err
, strerror(err
));