nginx-0.0.2-2004-02-11-20:08:49 import
diff --git a/src/os/unix/ngx_aio_read.c b/src/os/unix/ngx_aio_read.c
index c5fb4a5..1fc020d 100644
--- a/src/os/unix/ngx_aio_read.c
+++ b/src/os/unix/ngx_aio_read.c
@@ -29,8 +29,10 @@
         return NGX_AGAIN;
     }
 
-    ngx_log_debug(c->log, "rev->complete: %d" _ rev->complete);
-    ngx_log_debug(c->log, "aio size: %d" _ size);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "rev->complete: %d", rev->complete);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "aio size: %d", size);
 
     if (!rev->complete) {
         ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
@@ -52,7 +54,8 @@
             return NGX_ERROR;
         }
 
-        ngx_log_debug(c->log, "aio_read: #%d OK" _ c->fd);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                       "aio_read: #%d OK", c->fd);
 
         rev->active = 1;
         rev->ready = 0;
@@ -93,7 +96,8 @@
         return NGX_ERROR;
     }
 
-    ngx_log_debug(rev->log, "aio_read: #%d %d" _ c->fd _ n);
+    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
+                   "aio_read: #%d %d", c->fd, n);
 
     if (n == 0) {
         rev->eof = 1;
diff --git a/src/os/unix/ngx_aio_read_chain.c b/src/os/unix/ngx_aio_read_chain.c
index 9af48dd..8fc8870 100644
--- a/src/os/unix/ngx_aio_read_chain.c
+++ b/src/os/unix/ngx_aio_read_chain.c
@@ -41,7 +41,7 @@
 
         n = ngx_aio_read(c, buf, size);
 
-        ngx_log_debug(c->log, "aio_read: %d" _ n);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n);
 
         if (n == NGX_AGAIN) {
             return total ? total : NGX_AGAIN;
@@ -64,7 +64,8 @@
             total += n;
         }
 
-        ngx_log_debug(c->log, "aio_read total: %d" _ total);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                       "aio_read total: %d", total);
     }
 
     return total ? total : NGX_AGAIN;
diff --git a/src/os/unix/ngx_aio_write.c b/src/os/unix/ngx_aio_write.c
index dc2c876..1131961 100644
--- a/src/os/unix/ngx_aio_write.c
+++ b/src/os/unix/ngx_aio_write.c
@@ -28,7 +28,8 @@
         return NGX_AGAIN;
     }
 
-ngx_log_debug(wev->log, "aio: wev->complete: %d" _ wev->complete);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0,
+                   "aio: wev->complete: %d", wev->complete);
 
     if (!wev->complete) {
         ngx_memzero(&wev->aiocb, sizeof(struct aiocb));
@@ -49,7 +50,7 @@
             return NGX_ERROR;
         }
 
-        ngx_log_debug(wev->log, "aio_write: OK");
+        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: OK");
 
         wev->active = 1;
         wev->ready = 0;
@@ -102,7 +103,7 @@
     }
 
 
-    ngx_log_debug(wev->log, "aio_write: %d" _ n);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, wev->log, 0, "aio_write: %d", n);
 
     wev->active = 0;
     wev->ready = 1;
diff --git a/src/os/unix/ngx_aio_write_chain.c b/src/os/unix/ngx_aio_write_chain.c
index 4146d4f..c8108f3 100644
--- a/src/os/unix/ngx_aio_write_chain.c
+++ b/src/os/unix/ngx_aio_write_chain.c
@@ -44,9 +44,7 @@
 
         n = ngx_aio_write(c, buf, size);
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-        ngx_log_debug(c->log, "aio_write: %d" _ n);
-#endif
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_write: %d", n);
 
         if (n == NGX_ERROR) {
             return NGX_CHAIN_ERROR;
@@ -57,9 +55,8 @@
             c->sent += n;
         }
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-        ngx_log_debug(c->log, "aio_write sent: " OFF_T_FMT _ c->sent);
-#endif
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                       "aio_write sent: " OFF_T_FMT, c->sent);
 
         for (cl = in; cl; cl = cl->next) {
 
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index 5d0cd38..c2a2c8f 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -11,15 +11,16 @@
 {
     ssize_t n;
 
-    ngx_log_debug(file->log, "read: %d, %x, %d, " OFF_T_FMT _
-                  file->fd _ buf _ size _ offset);
+    ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
+                   "read: %d, %X, %d, " OFF_T_FMT, file->fd, buf, size, offset);
 
 #if (HAVE_PREAD)
 
     n = pread(file->fd, buf, size, offset);
 
     if (n == -1) {
-        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pread() failed");
+        ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
+                      "pread() failed, file \"%s\"", file->name.data);
         return NGX_ERROR;
     }
 
diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h
index 76b0dd0..1ca1c1f 100644
--- a/src/os/unix/ngx_linux_config.h
+++ b/src/os/unix/ngx_linux_config.h
@@ -36,9 +36,6 @@
 #include <dirent.h>
 
 
-/* Linux has a broken strerror_r() */
-#define HAVE_STRERROR_R  0
-
 #include <ngx_auto_config.h>
 
 
diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c
index a2fedcf..a1b9837 100644
--- a/src/os/unix/ngx_readv_chain.c
+++ b/src/os/unix/ngx_readv_chain.c
@@ -4,8 +4,6 @@
 #include <ngx_event.h>
 
 
-static int ngx_readv_error(ngx_event_t *rev, ngx_err_t err);
-
 #if (HAVE_KQUEUE)
 
 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
@@ -20,18 +18,22 @@
     rev = c->read; 
 
     if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
-        ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _
-                      rev->kq_eof _ rev->available _ rev->kq_errno);
+        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                       "readv: eof:%d, avail:%d, err:%d",
+                       rev->kq_eof, rev->available, rev->kq_errno);
 
         if (rev->available == 0) {
             if (rev->kq_eof) {
                 rev->ready = 0;
                 rev->eof = 1;
 
+                ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,
+                              "kevent() reported about an closed connection");
+
                 if (rev->kq_errno) {
                     rev->error = 1;
                     ngx_set_socket_errno(rev->kq_errno);
-                    return ngx_readv_error(rev, rev->kq_errno);
+                    return NGX_ERROR;
                 }
 
                 return 0;
@@ -65,7 +67,8 @@
         chain = chain->next;
     }
 
-ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len);
+    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "readv: %d:%d", io.nelts, iov->iov_len);
 
     rev = c->read;
 
@@ -105,11 +108,19 @@
             return n;
         }
 
-        n = ngx_readv_error(rev, ngx_socket_errno);
+        err = ngx_socket_errno;
 
-    } while (n == NGX_EINTR);
+        if (err == NGX_EAGAIN || err == NGX_EINTR) {
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+                           "readv() not ready");
+            n = NGX_AGAIN;
 
-    /* NGX_ERROR || NGX_AGAIN */
+        } else {
+            n = ngx_connection_error(c, err, "readv() failed");
+            break;
+        }
+
+    } while (err == NGX_EINTR);
 
     rev->ready = 0;
 
@@ -154,7 +165,8 @@
         chain = chain->next;
     }
 
-ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len);
+    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "readv: %d:%d", io.nelts, iov->iov_len);
 
     rev = c->read;
 
@@ -173,11 +185,19 @@
             return n;
         }
 
-        n = ngx_readv_error(rev, ngx_socket_errno);
+        err = ngx_socket_errno;
 
-    } while (n == NGX_EINTR);
+        if (err == NGX_EAGAIN || err == NGX_EINTR) {
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+                           "readv() not ready");
+            n = NGX_AGAIN;
 
-    /* NGX_ERROR || NGX_AGAIN */
+        } else {
+            n = ngx_connection_error(c, err, "readv() failed");
+            break;
+        }
+
+    } while (err == NGX_EINTR);
 
     rev->ready = 0;
 
@@ -189,21 +209,3 @@
 }
 
 #endif /* NAVE_KQUEUE */
-
-
-static int ngx_readv_error(ngx_event_t *rev, ngx_err_t err)
-{
-    if (err == NGX_EAGAIN) {
-        ngx_log_error(NGX_LOG_INFO, rev->log, err, "readv() returned EAGAIN");
-        return NGX_AGAIN;
-    }
-
-    if (err == NGX_EINTR) {
-        ngx_log_error(NGX_LOG_INFO, rev->log, err, "readv() returned EINTR");
-        return NGX_EINTR;
-    }
-
-    ngx_log_error(NGX_LOG_ERR, rev->log, err, "readv() failed");
-
-    return NGX_ERROR;
-}
diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c
index 3c454e9..b8a9659 100644
--- a/src/os/unix/ngx_recv.c
+++ b/src/os/unix/ngx_recv.c
@@ -90,7 +90,7 @@
         err = ngx_socket_errno;
 
         if (err == NGX_EAGAIN || err == NGX_EINTR) {
-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, err,
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
                            "recv() not ready");
             n = NGX_AGAIN;
 
@@ -141,7 +141,7 @@
         err = ngx_socket_errno;
 
         if (err == NGX_EAGAIN || err == NGX_EINTR) {
-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, err,
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
                            "recv() not ready");
             n = NGX_AGAIN;
 
diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c
index c7d69fe..a5b741f 100644
--- a/src/os/unix/ngx_solaris_sendfilev_chain.c
+++ b/src/os/unix/ngx_solaris_sendfilev_chain.c
@@ -82,24 +82,24 @@
         if (n == -1) {
             err = ngx_errno;
 
-            if (err == NGX_EINTR) {
-                eintr = 1;
-            }
-
             if (err == NGX_EAGAIN || err == NGX_EINTR) {
-                ngx_log_error(NGX_LOG_INFO, c->log, err,
+                if (err == NGX_EINTR) {
+                    eintr = 1;
+                }
+
+                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err,
                               "sendfilev() sent only " SIZE_T_FMT " bytes",
                               sent);
+
             } else {
                 wev->error = 1;
-                ngx_log_error(NGX_LOG_CRIT, c->log, err, "sendfilev() failed");
+                ngx_connection_error(c, err, "sendfilev() failed");
                 return NGX_CHAIN_ERROR;
             }
         }
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-        ngx_log_debug(c->log, "sendfilev: %d " SIZE_T_FMT _ n _ sent);
-#endif
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                       "sendfilev: %d " SIZE_T_FMT, n, sent);
 
         c->sent += sent;
 
diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c
index a9cac1d..43d5c12 100644
--- a/src/os/unix/ngx_writev_chain.c
+++ b/src/os/unix/ngx_writev_chain.c
@@ -22,6 +22,18 @@
         return in;
     }
 
+#if (HAVE_KQUEUE)
+
+    if ((ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) && wev->kq_eof) {
+        ngx_log_error(NGX_LOG_INFO, c->log, wev->kq_errno,
+                      "kevent() reported about an closed connection");
+
+        wev->error = 1;
+        return NGX_CHAIN_ERROR;
+    }
+
+#endif
+
     ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_CHAIN_ERROR);
 
     do {
@@ -49,25 +61,26 @@
 
         if (n == -1) {
             err = ngx_errno;
-            if (err == NGX_EAGAIN) {
-                ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EAGAIN");
 
-            } else if (err == NGX_EINTR) {
-                eintr = 1;
-                ngx_log_error(NGX_LOG_INFO, c->log, err, "writev() EINTR");
+            if (err == NGX_EAGAIN || err == NGX_EINTR) {
+                if (err == NGX_EINTR) {
+                    eintr = 1;
+                }
+
+                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+                               "writev() not ready");
 
             } else {
                 wev->error = 1;
-                ngx_log_error(NGX_LOG_CRIT, c->log, err, "writev() failed");
+                ngx_connection_error(c, err, "writev() failed");
                 return NGX_CHAIN_ERROR;
             }
         }
 
         sent = n > 0 ? n : 0;
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-        ngx_log_debug(c->log, "writev: " OFF_T_FMT  _ sent);
-#endif
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                       "writev: " OFF_T_FMT, sent);
 
         c->sent += sent;
 
@@ -75,8 +88,6 @@
 
             size = cl->hunk->last - cl->hunk->pos;
 
-ngx_log_debug(c->log, "SIZE: %d" _ size);
-
             if (sent >= size) {
                 sent -= size;
 
diff --git a/src/os/win32/ngx_wsasend_chain.c b/src/os/win32/ngx_wsasend_chain.c
index f0b5fe2..438f3db 100644
--- a/src/os/win32/ngx_wsasend_chain.c
+++ b/src/os/win32/ngx_wsasend_chain.c
@@ -64,9 +64,7 @@
         }
     }
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-    ngx_log_debug(c->log, "WSASend(): %d" _ sent);
-#endif
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend(): %d", sent);
 
     c->sent += sent;
 
@@ -207,9 +205,7 @@
         }
     }
 
-#if (NGX_DEBUG_WRITE_CHAIN)
-    ngx_log_debug(c->log, "WSASend(): %d" _ sent);
-#endif
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend(): %d", sent);
 
     c->sent += sent;
 
@@ -391,9 +387,7 @@
         }
     }
 
-#if (NGX_DEBUG_WRITE_CHAIN)
     ngx_log_debug(c->log, "WSASend(): %d" _ sent);
-#endif
 
     c->sent += sent;