nginx-0.0.1-2002-08-26-19:18:19 import
diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c
index 38bf7c0..b18d492 100644
--- a/src/event/modules/ngx_aio_module.c
+++ b/src/event/modules/ngx_aio_module.c
@@ -1,4 +1,14 @@
 
+/* 1 */
+int ngx_posix_aio_process_events(ngx_log_t *log)
+{
+    listen via SIGIO;
+    aio_* via SIGxxx;
+
+    sigsuspend()/sigwaitinfo()/sigtimedwait();
+}
+
+/* 2 */
 int ngx_posix_aio_process_events(ngx_log_t *log)
 {
     unmask signal
@@ -18,6 +28,7 @@
         aio
 }
 
+/* 3 */
 int ngx_posix_aio_process_events(ngx_log_t *log)
 {
     unmask signal
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 54e9474..f7dee18 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -18,7 +18,7 @@
 #error "kqueue is not supported on this platform"
 #endif
 
-static void ngx_add_timer(ngx_event_t *ev, u_int timer);
+static void ngx_add_timer_core(ngx_event_t *ev, u_int timer);
 static void ngx_inline ngx_del_timer(ngx_event_t *ev);
 
 
@@ -35,9 +35,11 @@
     nchanges = 0;
     nevents = 512;
 
-    if ((kq = kqueue()) == -1)
+    if ((kq = kqueue()) == -1) {
         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                      "ngx_kqueue_init: kqueue failed");
+                      "kqueue() failed");
+        exit(1);
+    }
 
     change_list = ngx_alloc(size, log);
     event_list = ngx_alloc(size, log);
@@ -56,7 +58,7 @@
 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags)
 {
     if (event == NGX_TIMER_EVENT) {
-        ngx_add_timer(ev, flags);
+        ngx_add_timer_core(ev, flags);
         return 0;
     }
 
@@ -154,8 +156,14 @@
                 delta -= ev->timer_delta;
                 nx = ev->timer_next;
                 ngx_del_timer(ev);
+#if 1
+                ev->timedout = 1;
+                if (ev->event_handler(ev) == -1)
+                    ev->close_handler(ev);
+#else
                 if (ev->timer_handler(ev) == -1)
                     ev->close_handler(ev);
+#endif
                 ev = nx;
             }
 
@@ -207,7 +215,7 @@
     return 0;
 }
 
-static void ngx_add_timer(ngx_event_t *ev, u_int timer)
+static void ngx_add_timer_core(ngx_event_t *ev, u_int timer)
 {
     ngx_event_t *e;
 
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 6c9e8f3..bde14a1 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -23,7 +23,7 @@
 static ngx_event_t  timer_queue;
 
 
-static void ngx_add_timer(ngx_event_t *ev, u_int timer);
+static void ngx_add_timer_core(ngx_event_t *ev, u_int timer);
 static void ngx_inline ngx_del_timer(ngx_event_t *ev);
 
 static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event,
@@ -31,19 +31,17 @@
 
 void ngx_select_init(int max_connections, ngx_log_t *log)
 {
+    if (max_connections > FD_SETSIZE) {
+        ngx_log_error(NGX_LOG_EMERG, log, 0,
 #if (WIN32)
-    if (max_connections > FD_SETSIZE)
-        ngx_log_error(NGX_LOG_EMERG, log, 0,
-                      "ngx_select_init: maximum number of descriptors "
-                      "supported by select() is %d",
-                      FD_SETSIZE);
+                      "maximum number of descriptors "
+                      "supported by select() is %d", FD_SETSIZE);
 #else
-    if (max_connections >= FD_SETSIZE)
-        ngx_log_error(NGX_LOG_EMERG, log, 0,
-                      "ngx_select_init: maximum descriptor number"
-                      "supported by select() is %d",
-                      FD_SETSIZE - 1);
+                      "maximum descriptor number"
+                      "supported by select() is %d", FD_SETSIZE - 1);
 #endif
+        exit(1);
+    }
 
     FD_ZERO(&master_read_fds);
     FD_ZERO(&master_write_fds);
@@ -71,7 +69,7 @@
     ngx_connection_t *cn = (ngx_connection_t *) ev->data;
 
     if (event == NGX_TIMER_EVENT) {
-        ngx_add_timer(ev, flags);
+        ngx_add_timer_core(ev, flags);
         return 0;
     }
 
@@ -271,8 +269,14 @@
                 delta -= ev->timer_delta;
                 nx = ev->timer_next;
                 ngx_del_timer(ev);
+#if 1
+                ev->timedout = 1;
+                if (ev->event_handler(ev) == -1)
+                    ev->close_handler(ev);
+#else
                 if (ev->timer_handler(ev) == -1)
                     ev->close_handler(ev);
+#endif
                 ev = nx;
             }
 
@@ -316,7 +320,7 @@
     return 0;
 }
 
-static void ngx_add_timer(ngx_event_t *ev, u_int timer)
+static void ngx_add_timer_core(ngx_event_t *ev, u_int timer)
 {
     ngx_event_t *e;
 
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 57c3c1c..a5cdb11 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -46,15 +46,15 @@
     int  i, fd;
     ngx_listen_t *s;
 
-    /* per group */
+    /* STUB */
     int max_connections = 512;
 
     ngx_init_events(max_connections, log);
 
+    ngx_connections = ngx_alloc(sizeof(ngx_connection_t)
+                                                       * max_connections, log);
     ngx_read_events = ngx_alloc(sizeof(ngx_event_t) * max_connections, log);
     ngx_write_events = ngx_alloc(sizeof(ngx_event_t) * max_connections, log);
-    ngx_connections = ngx_alloc(sizeof(ngx_connection_t)
-                                                     * max_connections, log);
 
     /* for each listening socket */
     s = (ngx_listen_t *) ls->elts;
@@ -62,16 +62,23 @@
 
         fd = s[i].fd;
 
-        ngx_memzero(&ngx_read_events[fd], sizeof(ngx_event_t));
-        ngx_memzero(&ngx_write_events[fd], sizeof(ngx_event_t));
         ngx_memzero(&ngx_connections[fd], sizeof(ngx_connection_t));
+        ngx_memzero(&ngx_read_events[fd], sizeof(ngx_event_t));
 
         ngx_connections[fd].fd = fd;
+        ngx_connections[fd].family = s[i].family;
+        ngx_connections[fd].socklen = s[i].socklen;
+        ngx_connections[fd].sockaddr = ngx_palloc(pool, s[i].socklen);
+        ngx_connections[fd].addr = s[i].addr;
+        ngx_connections[fd].addr_text = s[i].addr_text;
+        ngx_connections[fd].addr_textlen = s[i].addr_textlen;
+        ngx_connections[fd].post_accept_timeout = s[i].post_accept_timeout;
+
         ngx_connections[fd].server = s[i].server;
-        ngx_connections[fd].read = (void *) &ngx_read_events[fd].data;
         ngx_connections[fd].handler = s[i].handler;
-        ngx_read_events[fd].data = &ngx_connections[fd];
-        ngx_read_events[fd].log = ngx_connections[fd].log = s[i].log;
+        ngx_connections[fd].log = s[i].log;
+
+        ngx_read_events[fd].log = ngx_connections[fd].log;
         ngx_read_events[fd].data = &ngx_connections[fd];
         ngx_read_events[fd].event_handler = &ngx_event_accept;
         ngx_read_events[fd].listening = 1;
@@ -79,7 +86,7 @@
         ngx_read_events[fd].available = 0;
 
 #if (HAVE_DEFERRED_ACCEPT)
-        ngx_read_events[fd].accept_filter = s[i].accept_filter;
+        ngx_read_events[fd].deferred_accept = s[i].deferred_accept;
 #endif
         ngx_add_event(&ngx_read_events[fd], NGX_READ_EVENT, 0);
     }
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 7daaa86..d2e6c1f 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -51,7 +51,7 @@
     unsigned         unexpected_eof:1;
 
 #if (HAVE_DEFERRED_ACCEPT)
-    unsigned         accept_filter:1;
+    unsigned         deferred_accept:1;
 #endif
 #if (HAVE_KQUEUE)
     unsigned         eof:1;
@@ -81,10 +81,12 @@
 
 
 /*
-NGX_LEVEL_EVENT (default)  select, poll, kqueue
+NGX_LEVEL_EVENT (default)  select, poll, /dev/poll, kqueue
                                 requires to read whole data
-NGX_ONESHOT_EVENT          kqueue
+NGX_ONESHOT_EVENT          select, poll, kqueue
 NGX_CLEAR_EVENT            kqueue
+NGX_AIO_EVENT              overlapped, aio_read, aioread
+                                no need to add or delete events
 */
 
 #if (HAVE_KQUEUE)
@@ -93,6 +95,7 @@
 #define NGX_WRITE_EVENT    EVFILT_WRITE
 #define NGX_TIMER_EVENT    (-EVFILT_SYSCOUNT - 1)
 
+#define NGX_LEVEL_EVENT    0
 #define NGX_ONESHOT_EVENT  EV_ONESHOT
 #define NGX_CLEAR_EVENT    EV_CLEAR
 
@@ -102,6 +105,7 @@
 #define NGX_WRITE_EVENT    1
 #define NGX_TIMER_EVENT    2
 
+#define NGX_LEVEL_EVENT    0
 #define NGX_ONESHOT_EVENT  1
 #define NGX_CLEAR_EVENT    2
 
@@ -127,6 +131,8 @@
 #endif
 
 
+#define ngx_add_timer(ev, time)  ngx_add_event(ev, NGX_TIMER_EVENT, time)
+
 extern ngx_event_t          *ngx_read_events;
 extern ngx_event_t          *ngx_write_events;
 extern ngx_connection_t     *ngx_connections;
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index e7edddb..9db1bbd 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -1,5 +1,6 @@
 
 #include <ngx_config.h>
+#include <ngx_core.h>
 #include <ngx_types.h>
 #include <ngx_log.h>
 #include <ngx_connection.h>
@@ -22,21 +23,22 @@
     ev->ready = 0;
   
     do {
-        if ((s = accept(cn->fd, (struct sockaddr *) &addr, &addrlen)) == -1) {
+        if ((s = accept(cn->fd, cn->sockaddr, &cn->socklen)) == -1) {
             err = ngx_socket_errno;
             if (err == NGX_EAGAIN) {
                 ngx_log_error(NGX_LOG_INFO, ev->log, err,
-                             "ngx_event_accept: EAGAIN while accept");
-                return 0;
+                             "ngx_event_accept: EAGAIN while accept %s",
+                             cn->addr_text);
+                return NGX_OK;
             }
-            
+
             ngx_log_error(NGX_LOG_ERR, ev->log, err,
-                         "ngx_event_accept: accept failed");
-            /* if we return -1 listen socket would be closed */
-            return 0;
+                         "ngx_event_accept: accept %s failed", cn->addr_text);
+            /* if we return NGX_ERROR listen socket would be closed */
+            return NGX_OK;
         }
- 
-        ngx_log_debug(ev->log, "ngx_event_accept: accepted socket: %d" _ s);
+
+        ngx_log_debug(ev->log, "ngx_event_accept: accept: %d" _ s);
 
 #if !(HAVE_INHERITED_NONBLOCK)
         if (ngx_nonblocking(s) == -1)
@@ -48,6 +50,13 @@
         ngx_memzero(&ngx_write_events[s], sizeof(ngx_event_t));
         ngx_memzero(&ngx_connections[s], sizeof(ngx_connection_t));
 
+        ngx_connections[s].sockaddr = cn->sockaddr;
+        ngx_connections[s].family = cn->family;
+        ngx_connections[s].socklen = cn->socklen;
+        ngx_connections[s].addr = cn->addr;
+        ngx_connections[s].addr_textlen = cn->addr_textlen;
+        ngx_connections[s].post_accept_timeout = cn->post_accept_timeout;
+
         ngx_read_events[s].data = ngx_write_events[s].data
                                                          = &ngx_connections[s];
         ngx_connections[s].read = &ngx_read_events[s];
@@ -60,16 +69,16 @@
         ngx_write_events[s].timer = ngx_read_events[s].timer = 10000;
 
         ngx_write_events[s].timer_handler =
-            ngx_read_events[s].timer_handler = ngx_event_close;
+            ngx_read_events[s].timer_handler = ngx_event_close_connection;
 
         ngx_write_events[s].close_handler =
-            ngx_read_events[s].close_handler = ngx_event_close;
+            ngx_read_events[s].close_handler = ngx_event_close_connection;
 
         ngx_connections[s].server = cn->server;
         ngx_connections[s].servers = cn->servers;
         ngx_connections[s].log =
             ngx_read_events[s].log = ngx_write_events[s].log = ev->log;
-    
+
 #if (HAVE_DEFERRED_ACCEPT)
         if (ev->accept_filter)
             ngx_read_events[s].ready = 1;
diff --git a/src/event/ngx_event_close.c b/src/event/ngx_event_close.c
index 270855a..c956891 100644
--- a/src/event/ngx_event_close.c
+++ b/src/event/ngx_event_close.c
@@ -5,7 +5,7 @@
 #include <ngx_event_close.h>
 
 
-int ngx_event_close(ngx_event_t *ev)
+int ngx_event_close_connection(ngx_event_t *ev)
 {
     int rc;
     ngx_connection_t *cn = (ngx_connection_t *) ev->data;
diff --git a/src/event/ngx_event_close.h b/src/event/ngx_event_close.h
index 90c6512..54a048d 100644
--- a/src/event/ngx_event_close.h
+++ b/src/event/ngx_event_close.h
@@ -4,7 +4,7 @@
 
 #include <ngx_event.h>
 
-int ngx_event_close(ngx_event_t *ev);
+int ngx_event_close_connection(ngx_event_t *ev);
 
 
 #endif /* _NGX_EVENT_CLOSE_H_INCLUDED_ */
diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c
index 1874b91..e286aca 100644
--- a/src/event/ngx_event_recv.c
+++ b/src/event/ngx_event_recv.c
@@ -14,6 +14,12 @@
 
     c = (ngx_connection_t *) ev->data;
 
+    if (ev->timedout) {
+        ngx_set_socket_errno(NGX_ETIMEDOUT);
+        ngx_log_error(NGX_LOG_ERR, ev->log, NGX_ETIMEDOUT, "recv() failed");
+        return NGX_ERROR;
+    }
+
 #if (HAVE_KQUEUE)
     ngx_log_debug(ev->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _
                   ev->eof _ ev->available _ ev->error);
@@ -22,10 +28,7 @@
 #endif
         if (ev->eof && ev->available == 0) {
             if (ev->error) {
-                ngx_log_error(NGX_LOG_ERR, ev->log, ev->error,
-                              "ngx_event_recv: recv() failed while %s",
-                              ev->log->action);
-
+                ngx_log_error(NGX_LOG_ERR, ev->log, ev->error, "recv() failed");
                 return NGX_ERROR;
             }
 
@@ -39,16 +42,11 @@
         err = ngx_socket_errno;
 
         if (err == NGX_EAGAIN) {
-            ngx_log_error(NGX_LOG_INFO, ev->log, err,
-                          "ngx_event_recv: recv() returns EAGAIN while %s",
-                          ev->log->action);
+            ngx_log_error(NGX_LOG_INFO, ev->log, err, "recv() returns EAGAIN");
             return NGX_AGAIN;
         }
 
-        ngx_log_error(NGX_LOG_INFO, ev->log, err,
-                      "ngx_event_recv: recv() failed while %s",
-                      ev->log->action);
-
+        ngx_log_error(NGX_LOG_ERR, ev->log, err, "recv() failed");
         return NGX_ERROR;
     }