summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2009-04-01 15:47:12 +0000
committerIgor Sysoev <igor@sysoev.ru>2009-04-01 15:47:12 +0000
commit8ec919d16f63aeed10e71a49b1dc2fbbdb244d73 (patch)
tree07e0d09898a5bd476d4f395902a7d4721ba6be68
parent9f958f5b9b071db4a69d7a02db4c4bbe5fd374b9 (diff)
downloadnginx-8ec919d16f63aeed10e71a49b1dc2fbbdb244d73.tar.gz
r2336, r2337, r2339, r2390 merge:
bugfixes in error logging: *) ngx_strerror_r() style and size == 0 bug fix *) increase ngx_conf_log_error() buffer *) always log an error code *) fix segfault on close error *) compact win32 errno logging
-rw-r--r--src/core/ngx_conf_file.c42
-rw-r--r--src/core/ngx_conf_file.h2
-rw-r--r--src/core/ngx_log.c12
-rw-r--r--src/os/unix/ngx_errno.c10
-rw-r--r--src/os/win32/ngx_errno.c3
-rw-r--r--src/os/win32/ngx_gui.c9
6 files changed, 42 insertions, 36 deletions
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
index 54ae237f3..cab32975d 100644
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -201,14 +201,14 @@ done:
if (filename) {
ngx_free(cf->conf_file->buffer->start);
- cf->conf_file = prev;
-
if (ngx_close_file(fd) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,
ngx_close_file_n " %s failed",
cf->conf_file->file.name.data);
return NGX_CONF_ERROR;
}
+
+ cf->conf_file = prev;
}
if (rc == NGX_ERROR) {
@@ -853,31 +853,47 @@ void ngx_cdecl
ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err,
char *fmt, ...)
{
- u_char errstr[NGX_MAX_CONF_ERRSTR], *buf, *last;
+ u_char errstr[NGX_MAX_CONF_ERRSTR], *p, *last;
va_list args;
last = errstr + NGX_MAX_CONF_ERRSTR;
va_start(args, fmt);
- buf = ngx_vsnprintf(errstr, last - errstr, fmt, args);
+ p = ngx_vsnprintf(errstr, last - errstr, fmt, args);
va_end(args);
- *buf = '\0';
-
if (err) {
- buf = ngx_snprintf(buf, last - buf - 1, " (%d: ", err);
- buf = ngx_strerror_r(err, buf, last - buf - 1);
- *buf++ = ')';
- *buf = '\0';
+
+ if (p > last - 50) {
+
+ /* leave a space for an error code */
+
+ p = last - 50;
+ *p++ = '.';
+ *p++ = '.';
+ *p++ = '.';
+ }
+
+#if (NGX_WIN32)
+ p = ngx_snprintf(p, last - p, ((unsigned) err < 0x80000000)
+ ? " (%d: " : " (%Xd: ", err);
+#else
+ p = ngx_snprintf(p, last - p, " (%d: ", err);
+#endif
+
+ p = ngx_strerror_r(err, p, last - p);
+
+ *p++ = ')';
}
if (cf->conf_file == NULL) {
- ngx_log_error(level, cf->log, 0, "%s", errstr);
+ ngx_log_error(level, cf->log, 0, "%*s", p - errstr, errstr);
return;
}
- ngx_log_error(level, cf->log, 0, "%s in %s:%ui",
- errstr, cf->conf_file->file.name.data, cf->conf_file->line);
+ ngx_log_error(level, cf->log, 0, "%*s in %s:%ui",
+ p - errstr, errstr,
+ cf->conf_file->file.name.data, cf->conf_file->line);
}
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index c3e3e9a91..9ea9c75bb 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -71,7 +71,7 @@
#define NGX_CONF_MODULE 0x464E4F43 /* "CONF" */
-#define NGX_MAX_CONF_ERRSTR 256
+#define NGX_MAX_CONF_ERRSTR 1024
struct ngx_command_s {
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index e3abcd780..cc38b02da 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -127,18 +127,10 @@ ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
}
#if (NGX_WIN32)
-
- if ((unsigned) err >= 0x80000000) {
- p = ngx_snprintf(p, last - p, " (%Xd: ", err);
-
- } else {
- p = ngx_snprintf(p, last - p, " (%d: ", err);
- }
-
+ p = ngx_snprintf(p, last - p, ((unsigned) err < 0x80000000)
+ ? " (%d: " : " (%Xd: ", err);
#else
-
p = ngx_snprintf(p, last - p, " (%d: ", err);
-
#endif
p = ngx_strerror_r(err, p, last - p);
diff --git a/src/os/unix/ngx_errno.c b/src/os/unix/ngx_errno.c
index a3addf00c..a250f496d 100644
--- a/src/os/unix/ngx_errno.c
+++ b/src/os/unix/ngx_errno.c
@@ -10,10 +10,11 @@
#if (NGX_HAVE_STRERROR_R)
-u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
+u_char *
+ngx_strerror_r(int err, u_char *errstr, size_t size)
{
if (size == 0) {
- return 0;
+ return errstr;
}
errstr[0] = '\0';
@@ -32,12 +33,13 @@ u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
/* Linux strerror_r() */
-u_char *ngx_strerror_r(int err, u_char *errstr, size_t size)
+u_char *
+ngx_strerror_r(int err, u_char *errstr, size_t size)
{
char *str;
if (size == 0) {
- return 0;
+ return errstr;
}
errstr[0] = '\0';
diff --git a/src/os/win32/ngx_errno.c b/src/os/win32/ngx_errno.c
index 268ed5261..12af325c7 100644
--- a/src/os/win32/ngx_errno.c
+++ b/src/os/win32/ngx_errno.c
@@ -91,7 +91,8 @@ static ngx_str_t wsa_errors[] = {
};
-u_char *ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size)
+u_char *
+ngx_strerror_r(ngx_err_t err, u_char *errstr, size_t size)
{
int n;
u_int len;
diff --git a/src/os/win32/ngx_gui.c b/src/os/win32/ngx_gui.c
index 138d44a6b..ba6564560 100644
--- a/src/os/win32/ngx_gui.c
+++ b/src/os/win32/ngx_gui.c
@@ -36,13 +36,8 @@ ngx_message_box(char *title, ngx_uint_t type, ngx_err_t err,
*p++ = '.';
}
- if ((unsigned) err >= 0x80000000) {
- p = ngx_snprintf(p, last - p, " (%Xd: ", err);
-
- } else {
- p = ngx_snprintf(p, last - p, " (%d: ", err);
- }
-
+ p = ngx_snprintf(p, last - p, ((unsigned) err < 0x80000000)
+ ? " (%d: " : " (%Xd: ", err);
p = ngx_strerror_r(err, p, last - p);
if (p < last) {