nginx-0.0.1-2002-08-26-19:18:19 import
diff --git a/src/core/nginx.c b/src/core/nginx.c
index bf73782..748b443 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -85,43 +85,57 @@
         /* for each listening socket */
         ls = (ngx_listen_t *) ngx_listening_sockets->elts;
         for (i = 0; i < ngx_listening_sockets->nelts; i++) {
+
             if (ls[i].done)
                 continue;
 
-#if (WIN32)
-            s = WSASocket(ls[i].family, ls[i].type, ls[i].protocol, NULL, 0, 0);
-#else
-            s = socket(ls[i].family, ls[i].type, ls[i].protocol);
-#endif
-            if (s == -1)
+            if (ls[i].inherited) {
+
+                /* TODO: close on exit */
+                /* TODO: nonblocking */
+                /* TODO: deferred accept */
+
+                ls[i].done = 1;
+                continue;
+            }
+
+            s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol,
+                           ls[i].flags);
+            if (s == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              "nginx: socket %s falied", ls[i].addr_text);
+                              ngx_socket_n " %s falied", ls[i].addr_text);
+                exit(1);
+            }
 
             if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
-                           (const void *) &reuseaddr, sizeof(int)) == -1)
+                           (const void *) &reuseaddr, sizeof(int)) == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              "nginx: setsockopt (SO_REUSEADDR) %s failed",
+                              "setsockopt(SO_REUSEADDR) %s failed",
                               ls[i].addr_text);
+                exit(1);
+            }
 
             /* TODO: close on exit */
 
             if (ls[i].nonblocking) {
-                if (ngx_nonblocking(s) == -1)
+                if (ngx_nonblocking(s) == -1) {
                     ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
                                   ngx_nonblocking_n " %s failed",
                                   ls[i].addr_text);
+                    exit(1);
+                }
             }
 
-            if (bind(s, (struct sockaddr *) ls[i].addr, ls[i].addr_len) == -1) {
+            if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {
                 err = ngx_socket_errno;
-                ngx_log_error(NGX_LOG_ALERT, log, err,
-                              "bind to %s failed", ls[i].addr_text);
+                ngx_log_error(NGX_LOG_EMERG, log, err,
+                              "bind() to %s failed", ls[i].addr_text);
 
                 if (err != NGX_EADDRINUSE)
                     exit(1);
 
                 if (ngx_close_socket(s) == -1)
-                    ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
+                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
                                   ngx_close_socket_n " %s failed",
                                   ls[i].addr_text);
 
@@ -129,9 +143,11 @@
                 continue;
             }
 
-            if (listen(s, ls[i].backlog) == -1)
+            if (listen(s, ls[i].backlog) == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              "listen to %s failed", ls[i].addr_text);
+                              "listen() to %s failed", ls[i].addr_text);
+                exit(1);
+            }
 
             /* TODO: deferred accept */
 
@@ -142,10 +158,13 @@
         if (!failed)
             break;
 
-        ngx_log_error(NGX_LOG_NOTICE, log, 0, "try to bind again after 500ms");
+        ngx_log_error(NGX_LOG_NOTICE, log, 0,
+                      "try again to bind() after 500ms");
         ngx_msleep(500);
     }
 
-    if (failed)
-        ngx_log_error(NGX_LOG_EMERG, log, 0, "can't bind");
+    if (failed) {
+        ngx_log_error(NGX_LOG_EMERG, log, 0, "can not bind(), exiting");
+        exit(1);
+    }
 }
diff --git a/src/core/ngx_alloc.c b/src/core/ngx_alloc.c
index e059e94..1fd058b 100644
--- a/src/core/ngx_alloc.c
+++ b/src/core/ngx_alloc.c
@@ -12,8 +12,8 @@
 
     p = malloc(size);
     if (p == NULL)
-        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
-                      "ngx_alloc: malloc() %d bytes failed", size);
+        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                      "malloc() %d bytes failed", size);
     return p;
 }
 
diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h
index 16ea3a6..88f374a 100644
--- a/src/core/ngx_config.h
+++ b/src/core/ngx_config.h
@@ -48,6 +48,7 @@
 #else /* POSIX */
 
 #include <unistd.h>
+#include <stddef.h>    /* offsetof */
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h
index 84cbd24..2f6d128 100644
--- a/src/core/ngx_connection.h
+++ b/src/core/ngx_connection.h
@@ -26,6 +26,15 @@
     ngx_server_t     *server;
     ngx_server_t     *servers;
     ngx_pool_t       *pool;
+
+    int               family;
+    struct sockaddr  *sockaddr;
+    socklen_t         socklen;
+    size_t            addr;
+    char             *addr_text;
+    size_t            addr_textlen;
+
+    time_t            post_accept_timeout;
 };
 
 
diff --git a/src/core/ngx_hunk.c b/src/core/ngx_hunk.c
index 29edfbc..f829b7e 100644
--- a/src/core/ngx_hunk.c
+++ b/src/core/ngx_hunk.c
@@ -18,7 +18,7 @@
 
     h->type = NGX_HUNK_TEMP;
     h->tag = 0;
-    h->fd = (ngx_file_t) -1;
+    h->fd = (ngx_fd_t) -1;
 
     return h;
 }
@@ -39,7 +39,7 @@
 
         h->type = NGX_HUNK_TEMP;
         h->tag = 0;
-        h->fd = (ngx_file_t) -1;
+        h->fd = (ngx_fd_t) -1;
 
     } else {
         h->pre_start = h->start = h->pos.mem = h->last.mem
@@ -48,7 +48,7 @@
 
         h->type = NGX_HUNK_TEMP;
         h->tag = 0;
-        h->fd = (ngx_file_t) -1;
+        h->fd = (ngx_fd_t) -1;
     }
 
     return h;
@@ -71,7 +71,7 @@
                                                                 hunk->last.mem;
         h->type = NGX_HUNK_TEMP;
         h->tag = 0;
-        h->fd = (ngx_file_t) -1;
+        h->fd = (ngx_fd_t) -1;
 
     } else {
         h->pre_start = h->start = h->pos.mem = h->last.mem =
@@ -80,7 +80,7 @@
 
         h->type = NGX_HUNK_TEMP;
         h->tag = 0;
-        h->fd = (ngx_file_t) -1;
+        h->fd = (ngx_fd_t) -1;
     }
 
     return h;
diff --git a/src/core/ngx_hunk.h b/src/core/ngx_hunk.h
index 36c36e8..5e2a1d4 100644
--- a/src/core/ngx_hunk.h
+++ b/src/core/ngx_hunk.h
@@ -48,7 +48,7 @@
     char        *pre_start;     /* start of pre-allocated hunk */
     char        *post_end;      /* end of post-allocated hunk */
     int          tag;
-    ngx_file_t   fd;
+    ngx_fd_t     fd;
 };
 
 typedef struct ngx_chain_s  ngx_chain_t;
diff --git a/src/core/ngx_listen.h b/src/core/ngx_listen.h
index 26980d4..8108d83 100644
--- a/src/core/ngx_listen.h
+++ b/src/core/ngx_listen.h
@@ -11,22 +11,26 @@
 typedef struct {
     ngx_socket_t  fd;
 
-    void         *addr;
-    size_t        addr_len;
-    char         *addr_text;
+    struct sockaddr  *sockaddr;
+    socklen_t         socklen;
+    size_t            addr;
+    char             *addr_text;
+    size_t            addr_textlen;
 
     int           family;
     int           type;
     int           protocol;
+    int           flags;
 
     ngx_log_t    *log;
     void         *server;
     int         (*handler)(ngx_connection_t *c);
 
     int           backlog;
+    time_t        post_accept_timeout;
 
     unsigned      done:1;
-    unsigned      close:1;
+    unsigned      inherited:1;
     unsigned      nonblocking:1;
 #if 0
     unsigned      overlapped:1;
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index 8429d90..bed628a 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -37,31 +37,15 @@
 #endif
 
     ngx_localtime(&tm);
-    len = ngx_snprintf(errstr, sizeof(errstr), "%02d:%02d:%02d",
+    len = ngx_snprintf(errstr, sizeof(errstr), "%4d/%02d/%02d %02d:%02d:%02d",
+                       tm.ngx_tm_year + 1900, tm.ngx_tm_mon, tm.ngx_tm_mday,
                        tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec);
 
-    if (err) {
-        if ((unsigned) err < 0x80000000)
-            len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
-                            " [%s] (%d)",
-                            err_levels[level], err);
-        else
-            len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
-                            " [%s] (%X)",
-                            err_levels[level], err);
+    len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
+                        " [%s] ", err_levels[level]);
 
-        len += ngx_strerror_r(err, errstr + len, sizeof(errstr) - len - 1);
-        if (len < sizeof(errstr) - 2) {
-            errstr[len++] = ':';
-            errstr[len++] = ' ';
-        } else {
-            len = sizeof(errstr) - 2;
-        }
-
-    } else {
-        len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
-                            " [%s] ", err_levels[level]);
-    }
+    len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
+                        "%d#%d: ", getpid(), 0);
 
 #if (HAVE_VARIADIC_MACROS)
     va_start(args, fmt);
@@ -71,15 +55,31 @@
     len += ngx_vsnprintf(errstr + len, sizeof(errstr) - len - 1, fmt, args);
 #endif
 
+    if (err) {
+        if ((unsigned) err < 0x80000000)
+            len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
+                            " (%d: ", err);
+        else
+            len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
+                            " (%X: ", err);
+
+        len += ngx_strerror_r(err, errstr + len, sizeof(errstr) - len - 1);
+        if (len < sizeof(errstr) - 2) {
+            errstr[len++] = ')';
+        } else {
+            len = sizeof(errstr) - 2;
+        }
+    }
+
+    if (level != NGX_LOG_DEBUG && log->handler)
+        len += log->handler(log->data, errstr + len, sizeof(errstr) - len - 1);
+
     if (len > sizeof(errstr) - 2)
         len = sizeof(errstr) - 2;
     errstr[len] = '\n';
     errstr[len + 1] = '\0';
 
     fputs(errstr, stderr);
-
-    if (level == NGX_LOG_EMERG)
-        exit(1);
 }
 
 #if !(HAVE_VARIADIC_MACROS)
diff --git a/src/core/ngx_log.h b/src/core/ngx_log.h
index 7afabcb..f1e49eb 100644
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -3,6 +3,7 @@
 
 
 #include <ngx_errno.h>
+#include <ngx_file.h>
 
 typedef enum {
     NGX_LOG_EMERG = 0,
@@ -59,13 +60,14 @@
 */
 
 typedef struct {
-    int    log_level;
-    char  *action;
-    char  *context;
-#if 0
-    void  *data;   /* i.e. ngx_http_proxy_error_context_t */
-    char  *func(ngx_log_t *log);
-#endif
+    int       log_level;
+    ngx_fd_t  fd;
+    void     *data;
+    size_t   (*handler)(void *ctx, char *buf, size_t len);
+/* STUB */
+    char     *action;
+    char     *context;
+/* */
 } ngx_log_t;
 
 #define MAX_ERROR_STR	2048