nginx-0.1.5-RELEASE import

    *) Bugfix: on Solaris and Linux there may be too many "recvmsg()
       returned not enough data" alerts.

    *) Bugfix: there were the "writev() failed (22: Invalid argument)"
       errors on Solaris in proxy mode without sendfile. On other platforms
       that do not support sendfile at all the process got caught in an
       endless loop.

    *) Bugfix: segmentation fault on Solaris in proxy mode and using
       sendfile.

    *) Bugfix: segmentation fault on Solaris.

    *) Bugfix: on-line upgrade did not work on Linux.

    *) Bugfix: the ngx_http_autoindex_module module did not escape the
       spaces, the quotes, and the percent signs in the directory listing.

    *) Change: the decrease of the copy operations.

    *) Feature: the userid_p3p directive.
diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c
index 483d675..398c571 100644
--- a/src/event/modules/ngx_aio_module.c
+++ b/src/event/modules/ngx_aio_module.c
@@ -110,6 +110,10 @@
         return NGX_OK;
     }
 
+    if (flags & NGX_CLOSE_EVENT) {
+        return NGX_OK;
+    }
+
     rc = aio_cancel(c->fd, NULL);
 
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_cancel: %d", rc);
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index ea1d19b..663e2bf 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -208,7 +208,7 @@
 #if (NGX_DEBUG)
     c = ev->data;
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "devpoll add event: fd:%d ev:%04X", c->fd, event);
+                   "devpoll add event: fd:%d ev:%04Xd", c->fd, event);
 #endif
 
     ev->active = 1;
@@ -229,7 +229,7 @@
 #endif
 
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "devpoll del event: fd:%d ev:%04X", c->fd, event);
+                   "devpoll del event: fd:%d ev:%04Xd", c->fd, event);
 
     if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) {
         return NGX_ERROR;
@@ -268,7 +268,7 @@
     c = ev->data;
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "devpoll fd:%d ev:%04X fl:%04X", c->fd, event, flags);
+                   "devpoll fd:%d ev:%04Xd fl:%04Xd", c->fd, event, flags);
 
     if (nchanges >= max_changes) {
         ngx_log_error(NGX_LOG_WARN, ev->log, 0,
@@ -453,13 +453,13 @@
         }
 
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "devpoll: fd:%d, ev:%04X, rev:%04X",
+                       "devpoll: fd:%d, ev:%04Xd, rev:%04Xd",
                        event_list[i].fd,
                        event_list[i].events, event_list[i].revents);
 
         if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "ioctl(DP_POLL) error fd:%d ev:%04X rev:%04X",
+                          "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd",
                           event_list[i].fd,
                           event_list[i].events, event_list[i].revents);
         }
@@ -468,7 +468,7 @@
         {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                           "strange ioctl(DP_POLL) events "
-                          "fd:%d ev:%04X rev:%04X",
+                          "fd:%d ev:%04Xd rev:%04Xd",
                           event_list[i].fd,
                           event_list[i].events, event_list[i].revents);
         }
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index 45791e9..8096932 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -232,7 +232,7 @@
     ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "epoll add event: fd:%d op:%d ev:%08X",
+                   "epoll add event: fd:%d op:%d ev:%08XD",
                    c->fd, op, ee.events);
 
     if (epoll_ctl(ep, op, c->fd, &ee) == -1) {
@@ -291,7 +291,7 @@
     }
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "epoll del event: fd:%d op:%d ev:%08X",
+                   "epoll del event: fd:%d op:%d ev:%08XD",
                    c->fd, op, ee.events);
 
     if (epoll_ctl(ep, op, c->fd, &ee) == -1) {
@@ -314,7 +314,7 @@
     ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance);
 
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "epoll add connection: fd:%d ev:%08X", c->fd, ee.events);
+                   "epoll add connection: fd:%d ev:%08XD", c->fd, ee.events);
 
     if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ee) == -1) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
@@ -513,7 +513,7 @@
              */
 
             ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "epoll: stale event " PTR_FMT, c);
+                           "epoll: stale event %p", c);
             continue;
         }
 
@@ -522,18 +522,18 @@
 #endif
 
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,
-                       "epoll: fd:%d ev:%04X d:" PTR_FMT,
+                       "epoll: fd:%d ev:%04XD d:%p",
                        c->fd, event_list[i].events, event_list[i].data);
 
         if (event_list[i].events & (EPOLLERR|EPOLLHUP)) {
             ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
-                           "epoll_wait() error on fd:%d ev:%04X",
+                           "epoll_wait() error on fd:%d ev:%04XD",
                            c->fd, event_list[i].events);
         }
 
         if (event_list[i].events & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) {
             ngx_log_error(NGX_LOG_ALERT, log, 0,
-                          "strange epoll_wait() events fd:%d ev:%04X",
+                          "strange epoll_wait() events fd:%d ev:%04XD",
                           c->fd, event_list[i].events);
         }
 
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c
index 1d15c93..4a3cd9f 100644
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -82,7 +82,7 @@
     ngx_overlapped_wsarecv,
     NULL,
     NULL,
-    ngx_wsasend_chain,
+    ngx_overlapped_wsasend_chain,
     0
 };
 
@@ -138,7 +138,7 @@
     c->write->active = 1;
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                   "iocp add: fd:%d k:%d ov:" PTR_FMT, c->fd, key, &ev->ovlp);
+                   "iocp add: fd:%d k:%d ov:%p", c->fd, key, &ev->ovlp);
 
     if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
@@ -152,10 +152,16 @@
 
 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags)
 {
+#if 0
+    if (flags & NGX_CLOSE_EVENT) {
+        return NGX_OK;
+    }
+
     if (CancelIo((HANDLE) c->fd) == 0) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");
         return NGX_ERROR;
     }
+#endif
 
     return NGX_OK;
 }
@@ -195,12 +201,19 @@
     ngx_time_update(tv.tv_sec);
 
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp);
+                   "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp);
 
     delta = ngx_elapsed_msec;
     ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000
                                           + tv.tv_usec / 1000 - ngx_start_msec;
 
+    if (timer != INFINITE) {
+        delta = ngx_elapsed_msec - delta;
+
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                       "iocp timer: %d, delta: %d", timer, (int) delta);
+    }
+
     if (err) {
         if (ovlp == NULL) {
             if (err != WAIT_TIMEOUT) {
@@ -210,49 +223,76 @@
                 return NGX_ERROR;
             }
 
-        } else {
-            ovlp->error = err;
-        }
-    }
-
-    if (timer != INFINITE) {
-        delta = ngx_elapsed_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "iocp timer: %d, delta: %d", timer, (int) delta);
-    }
-
-    if (ovlp) {
-        ev = ovlp->event;
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "iocp event:" PTR_FMT, ev);
-
-        switch (key) {
-
-        case NGX_IOCP_ACCEPT:
-            if (bytes) {
-                ev->ready = 1;
+            if (timer != INFINITE && delta) {
+                ngx_event_expire_timers((ngx_msec_t) delta);
             }
-            break;
 
-        case NGX_IOCP_IO:
-            ev->complete = 1;
-            ev->ready = 1;
-            break;
-
-        case NGX_IOCP_CONNECT:
-            ev->ready = 1;
+            return NGX_OK;
         }
 
-        ev->available = bytes;
-
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "iocp event handler: " PTR_FMT, ev->event_handler);
-
-        ev->event_handler(ev);
+        ovlp->error = err;
     }
 
+    if (ovlp == NULL) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "GetQueuedCompletionStatus() returned no operation");
+        return NGX_ERROR;
+    }
+
+
+    ev = ovlp->event;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, "iocp event:%p", ev);
+
+
+    if (err == ERROR_NETNAME_DELETED /* the socket was closed */
+        || err == ERROR_OPERATION_ABORTED /* the operation was canceled */)
+    {
+
+        /*
+         * the WSA_OPERATION_ABORTED completion notification
+         * for a file descriptor that was closed
+         */
+
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,
+                       "iocp: aborted event %p", ev); 
+
+        if (timer != INFINITE && delta) {
+            ngx_event_expire_timers((ngx_msec_t) delta);
+        }
+
+        return NGX_OK;
+    }
+
+    if (err) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
+                      "GetQueuedCompletionStatus() returned operation error");
+    }
+
+    switch (key) {
+
+    case NGX_IOCP_ACCEPT:
+        if (bytes) {
+            ev->ready = 1;
+        }
+        break;
+
+    case NGX_IOCP_IO:
+        ev->complete = 1;
+        ev->ready = 1;
+        break;
+
+    case NGX_IOCP_CONNECT:
+        ev->ready = 1;
+    }
+
+    ev->available = bytes;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "iocp event handler: %p", ev->event_handler);
+
+    ev->event_handler(ev);
+
     if (timer != INFINITE && delta) {
         ngx_event_expire_timers((ngx_msec_t) delta);
     }
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index e6bebb5..e0fae6f 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -367,7 +367,7 @@
     c = ev->data;
 
     ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                   "kevent set event: %d: ft:%d fl:%04X",
+                   "kevent set event: %d: ft:%d fl:%04Xd",
                    c->fd, filter, flags);
 
     if (nchanges >= max_changes) {
@@ -599,7 +599,7 @@
                  */
 
                 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                               "kevent: stale event " PTR_FMT, ev);
+                               "kevent: stale event %p", ev);
                 continue;
             }
 
@@ -776,9 +776,8 @@
 {
     ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,
                    (kev->ident > 0x8000000 && kev->ident != (unsigned) -1) ?
-                    "kevent: " PTR_FMT ": ft:%d fl:%04X ff:%08X d:%d ud:"
-                                                                       PTR_FMT:
-                    "kevent: %d: ft:%d fl:%04X ff:%08X d:%d ud:" PTR_FMT,
+                    "kevent: %p: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p":
+                    "kevent: %d: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p",
                     kev->ident, kev->filter,
                     kev->flags, kev->fflags,
                     kev->data, kev->udata);
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index bf78e8f..18f72c3 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -302,7 +302,7 @@
     if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) {
         for (i = 0; i < nevents; i++) {
             ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "poll: %d: fd:%d ev:%04X",
+                           "poll: %d: fd:%d ev:%04Xd",
                            i, event_list[i].fd, event_list[i].events);
         }
     }
@@ -380,13 +380,13 @@
 
 #if 0
         ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "poll: %d: fd:%d ev:%04X rev:%04X",
+                       "poll: %d: fd:%d ev:%04Xd rev:%04Xd",
                        i, event_list[i].fd,
                        event_list[i].events, event_list[i].revents);
 #else
         if (event_list[i].revents) {
             ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "poll: %d: fd:%d ev:%04X rev:%04X",
+                           "poll: %d: fd:%d ev:%04Xd rev:%04Xd",
                            i, event_list[i].fd,
                            event_list[i].events, event_list[i].revents);
         }
@@ -394,7 +394,7 @@
 
         if (event_list[i].revents & POLLNVAL) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "poll() error fd:%d ev:%04X rev:%04X",
+                          "poll() error fd:%d ev:%04Xd rev:%04Xd",
                           event_list[i].fd,
                           event_list[i].events, event_list[i].revents);
         }
@@ -402,7 +402,7 @@
         if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL))
         {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "strange poll() events fd:%d ev:%04X rev:%04X",
+                          "strange poll() events fd:%d ev:%04Xd rev:%04Xd",
                           event_list[i].fd,
                           event_list[i].events, event_list[i].revents);
         }
@@ -529,7 +529,7 @@
     for ( ;; ) {
 
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                      "accept event " PTR_FMT, ev);
+                      "accept event %p", ev);
 
         if (ev == NULL) {
             break;
diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c
index 4f2f480..3c0ea95 100644
--- a/src/event/modules/ngx_rtsig_module.c
+++ b/src/event/modules/ngx_rtsig_module.c
@@ -383,7 +383,7 @@
     } else {
         err = 0;
         ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "rtsig signo:%d fd:%d band:%X",
+                       "rtsig signo:%d fd:%d band:%04Xd",
                        signo, si.si_fd, si.si_band);
     }
 
@@ -434,7 +434,7 @@
             ngx_accept_mutex_unlock();
 
             ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "rtsig: stale event " PTR_FMT, c);
+                           "rtsig: stale event %p", c);
 
             return NGX_OK;
         }
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 06ca4b3..14e6f81 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -23,7 +23,7 @@
 static fd_set         work_read_fd_set;
 static fd_set         work_write_fd_set;
 
-#if (WIN32)
+#if (NGX_WIN32)
 static int            max_read;
 static int            max_write;
 #else
@@ -114,7 +114,7 @@
 
     ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_ONESHOT_EVENT;
 
-#if (WIN32)
+#if (NGX_WIN32)
     max_read = max_write = 0;
 #else
     max_fd = -1;
@@ -150,7 +150,7 @@
         return NGX_OK;
     }
 
-#if (WIN32)
+#if (NGX_WIN32)
 
     if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE)
         || (event == NGX_WRITE_EVENT) && (max_write >= FD_SETSIZE))
@@ -211,7 +211,7 @@
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
                    "select del event fd:%d ev:%d", c->fd, event);
 
-#if (WIN32)
+#if (NGX_WIN32)
 
     if (event == NGX_READ_EVENT) {
         FD_CLR(c->fd, &master_read_fd_set);
@@ -280,7 +280,7 @@
 
     expire = 1;
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
     if (ngx_accept_mutex) {
         if (ngx_accept_disabled > 0) {
@@ -324,7 +324,7 @@
                            "select event: fd:%d wr:%d", c->fd, ev->write);
         }
 
-#if !(WIN32)
+#if !(NGX_WIN32)
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "max_fd: %d", max_fd);
 #endif
@@ -348,9 +348,9 @@
     work_write_fd_set = master_write_fd_set;
 
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                   "select read fd_set: %08X", *(int *) &work_read_fd_set);
+                   "select read fd_set: %08Xd", *(int *) &work_read_fd_set);
 
-#if (WIN32)
+#if (NGX_WIN32)
     ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);
 #else
     ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp);
@@ -433,7 +433,7 @@
                    "select ready %d", ready);
 
     if (err) {
-#if (WIN32)
+#if (NGX_WIN32)
         ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed");
 #else
         ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
@@ -534,7 +534,7 @@
     for ( ;; ) {
 
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                      "accept event " PTR_FMT, ev);
+                      "accept event %p", ev);
 
         if (ev == NULL) {
             break;
@@ -597,7 +597,7 @@
 
     /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */
 
-#if !(WIN32)
+#if !(NGX_WIN32)
     if ((unsigned) ecf->connections > FD_SETSIZE) {
         ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
                       "the maximum number of files "
@@ -606,7 +606,7 @@
     }
 #endif
 
-#if (NGX_THREADS)
+#if (NGX_THREADS) && !(NGX_WIN32)
     ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
                   "select() is not supported in the threaded mode");
     return NGX_CONF_ERROR;