Update and clean Tomato RAF files
[tomato.git] / release / src / router / nginx / src / os / unix / ngx_errno.c
blob8d555c5155fcca3e72013b4d999aeb9dcb14cac4
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
8 #include <ngx_config.h>
9 #include <ngx_core.h>
11 #ifndef NGX_SYS_NERR
12 #define NGX_SYS_NERR 128
13 #endif
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");
35 u_char *
36 ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
38 ngx_str_t *msg;
40 msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:
41 &ngx_unknown_error;
42 size = ngx_min(size, msg->len);
44 return ngx_cpymem(errstr, msg->data, size);
48 ngx_int_t
49 ngx_strerror_init(void)
51 char *msg;
52 u_char *p;
53 size_t len;
54 ngx_err_t err;
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) {
65 goto failed;
68 for (err = 0; err < NGX_SYS_NERR; err++) {
69 msg = strerror(err);
70 len = ngx_strlen(msg);
72 p = malloc(len);
73 if (p == NULL) {
74 goto failed;
77 ngx_memcpy(p, msg, len);
78 ngx_sys_errlist[err].len = len;
79 ngx_sys_errlist[err].data = p;
82 return NGX_OK;
84 failed:
86 err = errno;
87 ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err));
89 return NGX_ERROR;