aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-11-25 11:04:03 +0000
committerIgor Sysoev <igor@sysoev.ru>2010-11-25 11:04:03 +0000
commit7f31a2098dcbd39ca60467f118e3f38c4e67ce5b (patch)
treea9b36c13880291aa2ffb007ad966e783b000ecc0 /src
parent40747ad861d1645febf4c3a43f5f0c3489decbf0 (diff)
downloadnginx-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.c4
-rw-r--r--src/core/ngx_log.c2
-rw-r--r--src/os/unix/ngx_errno.c91
-rw-r--r--src/os/unix/ngx_errno.h26
-rw-r--r--src/os/unix/ngx_process.c10
-rw-r--r--src/os/win32/ngx_errno.c9
-rw-r--r--src/os/win32/ngx_errno.h4
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_ */