Annotation of embedaddon/nginx/src/os/unix/ngx_errno.c, revision 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>