diff options
author | Igor Sysoev <igor@sysoev.ru> | 2010-11-25 11:04:03 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2010-11-25 11:04:03 +0000 |
commit | 7f31a2098dcbd39ca60467f118e3f38c4e67ce5b (patch) | |
tree | a9b36c13880291aa2ffb007ad966e783b000ecc0 /src | |
parent | 40747ad861d1645febf4c3a43f5f0c3489decbf0 (diff) | |
download | nginx-7f31a2098dcbd39ca60467f118e3f38c4e67ce5b.tar.gz nginx-7f31a2098dcbd39ca60467f118e3f38c4e67ce5b.zip |
use copied strerror() messages and autoconfigured sys_nerr value
Diffstat (limited to 'src')
-rw-r--r-- | src/core/nginx.c | 4 | ||||
-rw-r--r-- | src/core/ngx_log.c | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_errno.c | 91 | ||||
-rw-r--r-- | src/os/unix/ngx_errno.h | 26 | ||||
-rw-r--r-- | src/os/unix/ngx_process.c | 10 | ||||
-rw-r--r-- | src/os/win32/ngx_errno.c | 9 | ||||
-rw-r--r-- | src/os/win32/ngx_errno.h | 4 |
7 files changed, 80 insertions, 66 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c index 0f19371e6..ffd63cf59 100644 --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -270,6 +270,10 @@ main(int argc, char *const *argv) ngx_pid = ngx_getpid(); + if (ngx_strerror_init() != NGX_OK) { + return 1; + } + log = ngx_log_init(ngx_prefix); if (log == NULL) { return 1; diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c index c0485c61b..156d3567f 100644 --- a/src/core/ngx_log.c +++ b/src/core/ngx_log.c @@ -248,7 +248,7 @@ ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err) buf = ngx_slprintf(buf, last, " (%d: ", err); #endif - buf = ngx_strerror_r(err, buf, last - buf); + buf = ngx_strerror(err, buf, last - buf); if (buf < last) { *buf++ = ')'; diff --git a/src/os/unix/ngx_errno.c b/src/os/unix/ngx_errno.c index a250f496d..02994b808 100644 --- a/src/os/unix/ngx_errno.c +++ b/src/os/unix/ngx_errno.c @@ -8,54 +8,79 @@ #include <ngx_core.h> -#if (NGX_HAVE_STRERROR_R) +/* + * The strerror() messages are copied because: + * + * 1) strerror() and strerror_r() functions are not Async-Signal-Safe, + * therefore, they can not be used in signal handlers; + * + * 2) a direct sys_errlist[] array may be used instead of these functions, + * but Linux linker warns about its usage: + * + * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead + * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead + * + * causing false bug reports. + */ -u_char * -ngx_strerror_r(int err, u_char *errstr, size_t size) -{ - if (size == 0) { - return errstr; - } - errstr[0] = '\0'; +static ngx_str_t *ngx_sys_errlist; +static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); - strerror_r(err, (char *) errstr, size); - while (*errstr && size) { - errstr++; - size--; - } +u_char * +ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) +{ + ngx_str_t *msg; - return errstr; -} + msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: + &ngx_unknown_error; + size = ngx_min(size, msg->len); -#elif (NGX_HAVE_GNU_STRERROR_R) + return ngx_cpymem(errstr, msg->data, size); +} -/* Linux strerror_r() */ -u_char * -ngx_strerror_r(int err, u_char *errstr, size_t size) +ngx_uint_t +ngx_strerror_init(void) { - char *str; + char *msg; + u_char *p; + size_t len; + ngx_err_t err; + + /* + * ngx_strerror() is not ready to work at this stage, therefore, + * malloc() is used and possible errors are logged using strerror(). + */ + + len = NGX_SYS_NERR * sizeof(ngx_str_t); - if (size == 0) { - return errstr; + ngx_sys_errlist = malloc(len); + if (ngx_sys_errlist == NULL) { + goto failed; } - errstr[0] = '\0'; + for (err = 0; err < NGX_SYS_NERR; err++) { + msg = strerror(err); + len = ngx_strlen(msg); - str = strerror_r(err, (char *) errstr, size); + p = malloc(len); + if (p == NULL) { + goto failed; + } - if (str != (char *) errstr) { - return ngx_cpystrn(errstr, (u_char *) str, size); + ngx_memcpy(p, msg, len); + ngx_sys_errlist[err].len = len; + ngx_sys_errlist[err].data = p; } - while (*errstr && size) { - errstr++; - size--; - } + return NGX_OK; - return errstr; -} +failed: -#endif + err = errno; + ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); + + return NGX_ERROR; +} diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index e1891e74b..3d51f3cfc 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -60,30 +60,8 @@ typedef int ngx_err_t; #define ngx_set_socket_errno(err) errno = err -#if (NGX_HAVE_STRERROR_R || NGX_HAVE_GNU_STRERROR_R) - -u_char *ngx_strerror_r(int err, u_char *errstr, size_t size); - -#else - -/* Solaris and Tru64 UNIX have thread-safe strerror() */ - -#define ngx_strerror_r(err, errstr, size) \ - ngx_cpystrn(errstr, (u_char *) strerror(err), size) - -#endif - - -#if (NGX_HAVE_SYS_ERRLIST) - -#define ngx_sigsafe_strerror(err) \ - (err > 0 && err < sys_nerr) ? sys_errlist[err] : "Unknown error" - -#else - -#define ngx_sigsafe_strerror(err) "" - -#endif +u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); +ngx_uint_t ngx_strerror_init(void); #endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 4574dfaf3..605558786 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -479,17 +479,15 @@ ngx_process_get_status(void) */ if (err == NGX_ECHILD) { - ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, - "waitpid() failed (%d: %s)", - err, ngx_sigsafe_strerror(err)); + ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, err, + "waitpid() failed"); return; } #endif - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "waitpid() failed (%d: %s)", - err, ngx_sigsafe_strerror(err)); + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err, + "waitpid() failed"); return; } diff --git a/src/os/win32/ngx_errno.c b/src/os/win32/ngx_errno.c index 525dcff4c..e1866be2f 100644 --- a/src/os/win32/ngx_errno.c +++ b/src/os/win32/ngx_errno.c @@ -9,7 +9,7 @@ u_char * -ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size) +ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) { u_int len; static u_long lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); @@ -50,3 +50,10 @@ ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size) return &errstr[++len]; } + + +ngx_uint_t +ngx_strerror_init(void) +{ + return NGX_OK; +} diff --git a/src/os/win32/ngx_errno.h b/src/os/win32/ngx_errno.h index e5e1a3744..5944f1ca8 100644 --- a/src/os/win32/ngx_errno.h +++ b/src/os/win32/ngx_errno.h @@ -54,7 +54,9 @@ typedef DWORD ngx_err_t; #define NGX_EALREADY WSAEALREADY #define NGX_EINVAL WSAEINVAL -u_char *ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size); + +u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); +ngx_uint_t ngx_strerror_init(void); #endif /* _NGX_ERRNO_H_INCLUDED_ */ |