Annotation of embedaddon/nginx/src/os/unix/ngx_errno.c, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>