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/core/nginx.c b/src/core/nginx.c
index ab85b23..53ac666 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -18,6 +18,13 @@
 static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 
 
+static ngx_conf_enum_t  ngx_debug_points[] = {
+    { ngx_string("stop"), NGX_DEBUG_POINTS_STOP },
+    { ngx_string("abort"), NGX_DEBUG_POINTS_ABORT },
+    { ngx_null_string, 0 }
+};  
+
+
 static ngx_command_t  ngx_core_commands[] = {
 
     { ngx_string("daemon"),
@@ -41,6 +48,13 @@
       offsetof(ngx_core_conf_t, worker_processes),
       NULL },
 
+    { ngx_string("debug_points"),
+      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_enum_slot,
+      0,
+      offsetof(ngx_core_conf_t, debug_points),
+      &ngx_debug_points },
+
 #if (NGX_THREADS)
 
     { ngx_string("worker_threads"),
@@ -97,6 +111,7 @@
 ngx_uint_t  ngx_max_module;
 
 
+
 int main(int argc, char *const *argv, char *const *envp)
 {
     ngx_int_t         i;
@@ -118,7 +133,7 @@
 
     ngx_pid = ngx_getpid();
 
-    if (!(log = ngx_log_init_stderr())) {
+    if (!(log = ngx_log_init())) {
         return 1;
     }
 
@@ -165,7 +180,7 @@
     if (cycle == NULL) {
         if (ngx_test_config) {
             ngx_log_error(NGX_LOG_EMERG, log, 0,
-                          "the configuration file %s test failed",
+                          "the configuration file \"%s\" test failed",
                           init_cycle.conf_file.data);
         }
 
@@ -174,7 +189,7 @@
 
     if (ngx_test_config) {
         ngx_log_error(NGX_LOG_INFO, log, 0,
-                      "the configuration file %s was tested successfully",
+                      "the configuration file \"%s\" was tested successfully",
                       cycle->conf_file.data);
         return 0;
     }
@@ -187,7 +202,7 @@
 
     ngx_process = ccf->master ? NGX_PROCESS_MASTER : NGX_PROCESS_SINGLE;
 
-#if (WIN32)
+#if (NGX_WIN32)
 
 #if 0
 
@@ -241,11 +256,14 @@
         return NGX_OK;
     }
 
-    ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
                   "using inherited sockets from \"%s\"", inherited);
 
-    ngx_init_array(cycle->listening, cycle->pool,
-                   10, sizeof(ngx_listening_t), NGX_ERROR);
+    if (ngx_array_init(&cycle->listening, cycle->pool, 10,
+                                         sizeof(ngx_listening_t)) == NGX_ERROR)
+    {
+        return NGX_ERROR;
+    }
 
     for (p = inherited, v = p; *p; p++) {
         if (*p == ':' || *p == ';') {
@@ -260,7 +278,7 @@
 
             v = p + 1;
 
-            if (!(ls = ngx_push_array(&cycle->listening))) {
+            if (!(ls = ngx_array_push(&cycle->listening))) {
                 return NGX_ERROR;
             }
 
@@ -276,7 +294,8 @@
 
 ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)
 {
-    char             *env[3], *var, *p;
+    char             *env[3], *var;
+    u_char           *p;
     ngx_uint_t        i;
     ngx_pid_t         pid;
     ngx_exec_ctx_t    ctx;
@@ -290,20 +309,22 @@
                             + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 2,
                     cycle->log);
 
-    p = (char *) ngx_cpymem(var, NGINX_VAR "=", sizeof(NGINX_VAR));
+    p = ngx_cpymem(var, NGINX_VAR "=", sizeof(NGINX_VAR));
 
     ls = cycle->listening.elts;
     for (i = 0; i < cycle->listening.nelts; i++) {
-        p += ngx_snprintf(p, NGX_INT32_LEN + 2, "%u;", ls[i].fd);
+        p = ngx_sprintf(p, "%ud;", ls[i].fd);
     }
 
+    *p = '\0';
+
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "inherited: %s", var);
 
     env[0] = var;
 
 #if (NGX_SETPROCTITLE_USES_ENV)
 
-    /* allocate spare 300 bytes for the new binary process title */
+    /* allocate the spare 300 bytes for the new binary process title */
 
     env[1] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
              "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
@@ -430,12 +451,13 @@
     ccf->daemon = NGX_CONF_UNSET;
     ccf->master = NGX_CONF_UNSET;
     ccf->worker_processes = NGX_CONF_UNSET;
-#if (NGX_THREADS)
-    ccf->worker_threads = NGX_CONF_UNSET;
-    ccf->thread_stack_size = NGX_CONF_UNSET;
-#endif
+    ccf->debug_points = NGX_CONF_UNSET;
     ccf->user = (ngx_uid_t) NGX_CONF_UNSET;
     ccf->group = (ngx_gid_t) NGX_CONF_UNSET;
+#if (NGX_THREADS)
+    ccf->worker_threads = NGX_CONF_UNSET;
+    ccf->thread_stack_size = NGX_CONF_UNSET_SIZE;
+#endif
 
     return ccf;
 }
@@ -445,7 +467,7 @@
 {
     ngx_core_conf_t  *ccf = conf;
 
-#if !(WIN32)
+#if !(NGX_WIN32)
     struct passwd    *pwd;
     struct group     *grp;
 #endif
@@ -453,6 +475,7 @@
     ngx_conf_init_value(ccf->daemon, 1);
     ngx_conf_init_value(ccf->master, 1);
     ngx_conf_init_value(ccf->worker_processes, 1);
+    ngx_conf_init_value(ccf->debug_points, 0);
 
 #if (NGX_THREADS)
     ngx_conf_init_value(ccf->worker_threads, 0);
@@ -460,9 +483,9 @@
     ngx_conf_init_size_value(ccf->thread_stack_size, 2 * 1024 * 1024);
 #endif
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
-    if (ccf->user == (uid_t) NGX_CONF_UNSET) {
+    if (ccf->user == (uid_t) NGX_CONF_UNSET && geteuid() == 0) {
 
         pwd = getpwnam(NGX_USER);
         if (pwd == NULL) {
@@ -509,7 +532,7 @@
 
 static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
-#if (WIN32)
+#if (NGX_WIN32)
 
     ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
                        "\"user\" is not supported, ignored");
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 0d42998..2be26e0 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define NGINX_VER          "nginx/0.1.4"
+#define NGINX_VER          "nginx/0.1.5"
 
 #define NGINX_VAR          "NGINX"
 #define NGX_NEWPID_EXT     ".newbin"
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
index fb629a4..3c7898a 100644
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -73,7 +73,7 @@
         fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN);
         if (fd == NGX_INVALID_FILE) {
             ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,
-                          ngx_open_file_n " %s failed", filename->data);
+                          ngx_open_file_n " \"%s\" failed", filename->data);
             return NGX_CONF_ERROR;
         }
 
@@ -84,7 +84,7 @@
 
         if (ngx_fd_info(fd, &cf->conf_file->file.info) == -1) {
             ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno,
-                          ngx_fd_info_n " %s failed", filename->data);
+                          ngx_fd_info_n " \"%s\" failed", filename->data);
         }
 
         if (!(cf->conf_file->buffer = ngx_create_temp_buf(cf->pool, 1024))) {
@@ -103,8 +103,12 @@
         rc = ngx_conf_read_token(cf);
 
         /*
-         * ngx_conf_read_token() returns NGX_OK, NGX_ERROR,
-         * NGX_CONF_FILE_DONE or NGX_CONF_BLOCK_DONE
+         * ngx_conf_read_token() may return
+         *    NGX_ERROR             there is error
+         *    NGX_OK                the token terminated by ";" was found
+         *    NGX_CONF_BLOCK_START  the token terminated by "{" was found
+         *    NGX_CONF_BLOCK_DONE   the "}" was found
+         *    NGX_CONF_FILE_DONE    the configuration file is done
          */
 
 #if 0
@@ -115,13 +119,16 @@
             break;
         }
 
-        if (rc != NGX_OK) {
+        if (rc != NGX_OK && rc != NGX_CONF_BLOCK_START) {
             break;
         }
 
         if (cf->handler) {
 
-            /* custom handler, i.e. used in http "types { ... }" directive */
+            /*
+             * the custom handler, i.e., that is used in the http's
+             * "types { ... }" directive
+             */
 
             rv = (*cf->handler)(cf, NULL, cf->handler_conf);
             if (rv == NGX_CONF_OK) {
@@ -182,6 +189,31 @@
                         break;
                     }
 
+                    if (!(cmd->type & NGX_CONF_BLOCK) && rc != NGX_OK)
+                    {
+                        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                                      "directive \"%s\" in %s:%d "
+                                      "is not terminated by \";\"",
+                                      name->data,
+                                      cf->conf_file->file.name.data,
+                                      cf->conf_file->line);
+                        rc = NGX_ERROR;
+                        break;
+                    }
+
+                    if ((cmd->type & NGX_CONF_BLOCK)
+                        && rc != NGX_CONF_BLOCK_START)
+                    {
+                        ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
+                                      "directive \"%s\" in %s:%d "
+                                      "has not the opening \"{\"",
+                                      name->data,
+                                      cf->conf_file->file.name.data,
+                                      cf->conf_file->line);
+                        rc = NGX_ERROR;
+                        break;
+                    }
+
                     /* is the directive's argument count right ? */
 
                     if (cmd->type & NGX_CONF_ANY) {
@@ -396,10 +428,14 @@
                 continue;
             }
 
-            if (ch == ';' || ch == '{') {
+            if (ch == ';') {
                 return NGX_OK;
             }
 
+            if (ch == '{') {
+                return NGX_CONF_BLOCK_START;
+            }
+
             ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
                           "unexpected '%c' in %s:%d",
                           ch, cf->conf_file->file.name.data,
@@ -427,6 +463,10 @@
                     return NGX_ERROR;
                 }
 
+                if (ch == '{') {
+                    return NGX_CONF_BLOCK_START;
+                }
+
                 return NGX_OK;
 
             case '}':
@@ -538,10 +578,14 @@
 ngx_log_debug(cf->log, "FOUND %d:'%s'" _ word->len _ word->data);
 #endif
 
-                if (ch == ';' || ch == '{') {
+                if (ch == ';') {
                     return NGX_OK;
                 }
 
+                if (ch == '{') {
+                    return NGX_CONF_BLOCK_START;
+                }
+
                 found = 0;
             }
         }
@@ -575,6 +619,18 @@
         return NGX_OK;
     }
 
+#if (NGX_WIN32)
+
+    if (name->len > 2
+        && name->data[1] == ':'
+        && ((name->data[0] >= 'a' && name->data[0] <= 'z')
+             || (name->data[0] >= 'A' && name->data[0] <= 'Z')))
+    {
+        return NGX_OK;
+    }
+
+#endif
+
     old = *name;
 
     name->len = cycle->root.len + old.len;
@@ -664,20 +720,22 @@
 void ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err,
                         char *fmt, ...)
 {
-    int      len;
-    char     errstr[NGX_MAX_CONF_ERRSTR];
+    u_char   errstr[NGX_MAX_CONF_ERRSTR], *buf, *last;
     va_list  args;
 
+    last = errstr + NGX_MAX_CONF_ERRSTR;
+
     va_start(args, fmt);
-    len = ngx_vsnprintf(errstr, sizeof(errstr) - 1, fmt, args);
+    buf = ngx_vsnprintf(errstr, last - errstr, fmt, args);
     va_end(args);
 
+    *buf = '\0';
+
     if (err) {
-        len += ngx_snprintf(errstr + len, sizeof(errstr) - len - 1,
-                            " (%d: ", err);
-        len += ngx_strerror_r(err, errstr + len, sizeof(errstr) - len - 1);
-        errstr[len++] = ')';
-        errstr[len] = '\0';
+        buf = ngx_snprintf(buf, last - buf - 1, " (%d: ", err);
+        buf = ngx_strerror_r(err, buf, last - buf - 1);
+        *buf++ = ')';
+        *buf = '\0';
     }
 
     ngx_log_error(level, cf->log, 0, "%s in %s:%d",
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index 3a3db52..0e94056 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -59,8 +59,9 @@
 #define NGX_CONF_OK          NULL
 #define NGX_CONF_ERROR       (char *) -1
 
-#define NGX_CONF_BLOCK_DONE  1
-#define NGX_CONF_FILE_DONE   2
+#define NGX_CONF_BLOCK_START 1
+#define NGX_CONF_BLOCK_DONE  2
+#define NGX_CONF_FILE_DONE   3
 
 #define NGX_MODULE           0, 0
 
diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h
index 3590fae..9faf00a 100644
--- a/src/core/ngx_config.h
+++ b/src/core/ngx_config.h
@@ -39,7 +39,7 @@
 #endif
 
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
 #define ngx_signal_helper(n)     SIG##n
 #define ngx_signal_value(n)      ngx_signal_helper(n)
@@ -72,8 +72,6 @@
 typedef u_int              ngx_uint_t;
 typedef int                ngx_flag_t;
 #define NGX_INT_T_LEN      sizeof("-2147483648") - 1
-#define NGX_INT_T_FMT      "d"
-#define NGX_UINT_T_FMT     "u"
 
 #else
 
@@ -81,8 +79,6 @@
 typedef u_long             ngx_uint_t;
 typedef long               ngx_flag_t;
 #define NGX_INT_T_LEN      sizeof("-9223372036854775808") - 1
-#define NGX_INT_T_FMT      "lld"
-#define NGX_UINT_T_FMT     "llu"
 
 #endif
 
@@ -131,5 +127,12 @@
 #define NGX_MAXHOSTNAMELEN MAXHOSTNAMELEN
 */
 
+#if ((__GNU__ == 2) && (__GNUC_MINOR__ < 8))
+#define NGX_MAX_UINT32_VALUE  0xffffffffLL
+#else
+#define NGX_MAX_UINT32_VALUE  0xffffffff
+#endif
+
+
 
 #endif /* _NGX_CONFIG_H_INCLUDED_ */
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
index 19f5629..06fd85c 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -30,28 +30,27 @@
         return NULL;
     }
 
-#if (HAVE_SIN_LEN)
-    addr_in->sin_len = sizeof(struct sockaddr_in);
-#endif
     addr_in->sin_family = AF_INET;
     addr_in->sin_addr.s_addr = addr;
     addr_in->sin_port = htons(port);
 
-    if (!(ls->addr_text.data = ngx_palloc(cf->pool, INET_ADDRSTRLEN + 6))) {
+
+    ls->addr_text.data = ngx_palloc(cf->pool,
+                                    INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
+    if (ls->addr_text.data == NULL) {
         return NULL;
     }
 
     len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, INET_ADDRSTRLEN);
-    ls->addr_text.len = ngx_snprintf((char *) ls->addr_text.data + len,
-                                     6, ":%d", port);
+
+    ls->addr_text.len = ngx_sprintf(ls->addr_text.data + len, ":%d", port)
+                        - ls->addr_text.data;
+
 
     ls->fd = (ngx_socket_t) -1;
     ls->family = AF_INET;
     ls->type = SOCK_STREAM;
     ls->protocol = IPPROTO_IP;
-#if (WIN32)
-    ls->flags = WSA_FLAG_OVERLAPPED;
-#endif
     ls->sockaddr = (struct sockaddr *) addr_in;
     ls->socklen = sizeof(struct sockaddr_in);
     ls->addr = offsetof(struct sockaddr_in, sin_addr);
@@ -63,6 +62,7 @@
 
 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle)
 {
+    size_t               len;
     ngx_uint_t           i;
     ngx_listening_t     *ls;
     struct sockaddr_in  *addr_in;
@@ -95,20 +95,26 @@
             ls[i].ignore = 1;
             continue;
         }
+
         ls[i].addr_text_max_len = INET_ADDRSTRLEN;
 
-        ls[i].addr_text.data = ngx_palloc(cycle->pool, ls[i].addr_text_max_len);
+
+        ls[i].addr_text.data = ngx_palloc(cycle->pool, INET_ADDRSTRLEN - 1
+                                                       + sizeof(":65535") - 1);
         if (ls[i].addr_text.data == NULL) {
             return NGX_ERROR;
         }
 
         ls[i].family = addr_in->sin_family;
-        ls[i].addr_text.len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr,
-                                            ls[i].addr_text.data,
-                                            ls[i].addr_text_max_len);
-        if (ls[i].addr_text.len == 0) {
+        len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr,
+                            ls[i].addr_text.data, INET_ADDRSTRLEN);
+        if (len == 0) {
             return NGX_ERROR;
         }
+
+        ls[i].addr_text.len = ngx_sprintf(ls[i].addr_text.data + len, ":%d",
+                                        ntohs(addr_in->sin_port))
+                              - ls[i].addr_text.data;
     }
 
     return NGX_OK;
@@ -157,16 +163,15 @@
                 continue;
             }
 
-            s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol,
-                           ls[i].flags);
+            s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol);
 
             if (s == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              ngx_socket_n " %s failed", ls[i].addr_text.data);
+                              ngx_socket_n " %V failed", &ls[i].addr_text);
                 return NGX_ERROR;
             }
 
-#if (WIN32)
+#if (NGX_WIN32)
             /*
              * Winsock assignes a socket number divisible by 4
              * so to find a connection we divide a socket number by 4.
@@ -182,8 +187,8 @@
             if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
                            (const void *) &reuseaddr, sizeof(int)) == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              "setsockopt(SO_REUSEADDR) %s failed",
-                              ls[i].addr_text.data);
+                              "setsockopt(SO_REUSEADDR) %V failed",
+                              &ls[i].addr_text);
                 return NGX_ERROR;
             }
 
@@ -192,8 +197,8 @@
             if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {
                 if (ngx_nonblocking(s) == -1) {
                     ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                                  ngx_nonblocking_n " %s failed",
-                                  ls[i].addr_text.data);
+                                  ngx_nonblocking_n " %V failed",
+                                  &ls[i].addr_text);
                     return NGX_ERROR;
                 }
             }
@@ -202,8 +207,8 @@
             if (ls[i].nonblocking) {
                 if (ngx_nonblocking(s) == -1) {
                     ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                                  ngx_nonblocking_n " %s failed",
-                                  ls[i].addr_text.data);
+                                  ngx_nonblocking_n " %V failed",
+                                  &ls[i].addr_text);
                     return NGX_ERROR;
                 }
             }
@@ -212,15 +217,15 @@
             if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {
                 err = ngx_socket_errno;
                 ngx_log_error(NGX_LOG_EMERG, log, err,
-                              "bind() to %s failed", ls[i].addr_text.data);
+                              "bind() to %V failed", &ls[i].addr_text);
 
                 if (err != NGX_EADDRINUSE)
                     return NGX_ERROR;
 
                 if (ngx_close_socket(s) == -1)
                     ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                                  ngx_close_socket_n " %s failed",
-                                  ls[i].addr_text.data);
+                                  ngx_close_socket_n " %V failed",
+                                  &ls[i].addr_text);
 
                 failed = 1;
                 continue;
@@ -228,7 +233,7 @@
 
             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.data);
+                              "listen() to %V failed", &ls[i].addr_text);
                 return NGX_ERROR;
             }
 
@@ -273,7 +278,7 @@
     for (i = 0; i < cycle->listening.nelts; i++) {
         fd = ls[i].fd;
 
-#if (WIN32)
+#if (NGX_WIN32)
         /*
          * Winsock assignes a socket number divisible by 4
          * so to find a connection we divide a socket number by 4.
@@ -296,8 +301,7 @@
 
         if (ngx_close_socket(ls[i].fd) == -1) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
-                          ngx_close_socket_n " %s failed",
-                          ls[i].addr_text.data);
+                          ngx_close_socket_n " %V failed", &ls[i].addr_text);
         }
 
         cycle->connections[fd].fd = (ngx_socket_t) -1;
@@ -408,7 +412,7 @@
     }
 
     if (err == NGX_ECONNRESET
-#if !(WIN32)
+#if !(NGX_WIN32)
         || err == NGX_EPIPE
 #endif
         || err == NGX_ENOTCONN
diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h
index 8e2ba39..e2257ac 100644
--- a/src/core/ngx_connection.h
+++ b/src/core/ngx_connection.h
@@ -24,7 +24,6 @@
     int               family;
     int               type;
     int               protocol;
-    int               flags;      /* Winsock2 flags */
 
     void            (*handler)(ngx_connection_t *c); /* handler of accepted
                                                         connection */
@@ -48,9 +47,6 @@
     unsigned          inherited:1;   /* inherited from previous process */
     unsigned          nonblocking_accept:1;
     unsigned          nonblocking:1;
-#if 0
-    unsigned          overlapped:1;  /* Winsock2 overlapped */
-#endif
     unsigned          shared:1;    /* shared between threads or processes */
 #if (HAVE_DEFERRED_ACCEPT)
     unsigned          deferred_accept:1;
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index a1402f1..85d9458 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -9,6 +9,7 @@
 #include <ngx_event.h>
 
 
+static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *s1, struct sockaddr *s2);
 static void ngx_clean_old_cycles(ngx_event_t *ev);
 
 
@@ -195,7 +196,7 @@
     failed = 0;
 
 
-#if !(WIN32)
+#if !(NGX_WIN32)
     if (ngx_create_pidfile(cycle, old_cycle) == NGX_ERROR) {
         failed = 1;
     }
@@ -204,6 +205,8 @@
 
     if (!failed) {
 
+        /* open the new files */
+
         part = &cycle->open_files.part;
         file = part->elts;
 
@@ -227,7 +230,7 @@
                                        NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
 
             ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
-                           "log: %0X %d \"%s\"",
+                           "log: %p %d \"%s\"",
                            &file[i], file[i].fd, file[i].name.data);
 
             if (file[i].fd == NGX_INVALID_FILE) {
@@ -238,7 +241,7 @@
                 break;
             }
 
-#if (WIN32)
+#if (NGX_WIN32)
             if (ngx_file_append_mode(file[i].fd) == NGX_ERROR) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                               ngx_file_append_mode_n " \"%s\" failed",
@@ -266,6 +269,9 @@
     }
 
     if (!failed) {
+
+        /* handle the listening sockets */
+
         if (old_cycle->listening.nelts) {
             ls = old_cycle->listening.elts;
             for (i = 0; i < old_cycle->listening.nelts; i++) {
@@ -274,16 +280,17 @@
 
             nls = cycle->listening.elts;
             for (n = 0; n < cycle->listening.nelts; n++) {
+
                 for (i = 0; i < old_cycle->listening.nelts; i++) {
                     if (ls[i].ignore) {
                         continue;
                     }
 
-                    if (ngx_memcmp(nls[n].sockaddr,
-                                   ls[i].sockaddr, ls[i].socklen) == 0)
+                    if (ngx_cmp_sockaddr(nls[n].sockaddr, ls[i].sockaddr)
+                                                                     == NGX_OK)
                     {
                         fd = ls[i].fd;
-#if (WIN32)
+#if (NGX_WIN32)
                         /*
                          * Winsock assignes a socket number divisible by 4 so
                          * to find a connection we divide a socket number by 4.
@@ -294,10 +301,10 @@
                         if (fd >= (ngx_socket_t) cycle->connection_n) {
                             ngx_log_error(NGX_LOG_EMERG, log, 0,
                                         "%d connections is not enough to hold "
-                                        "an open listening socket on %s, "
+                                        "an open listening socket on %V, "
                                         "required at least %d connections",
                                         cycle->connection_n,
-                                        ls[i].addr_text.data, fd);
+                                        &ls[i].addr_text, fd);
                             failed = 1;
                             break;
                         }
@@ -372,8 +379,8 @@
 
             if (ngx_close_socket(ls[i].fd) == -1) {
                 ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                              ngx_close_socket_n " %s failed",
-                              ls[i].addr_text.data);
+                              ngx_close_socket_n " %V failed",
+                              &ls[i].addr_text);
             }
         }
 
@@ -384,12 +391,12 @@
 
     /* commit the new cycle configuration */
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
     if (!ngx_test_config && cycle->log->file->fd != STDERR_FILENO) {
 
         ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
-                       "dup2: %0X %d \"%s\"",
+                       "dup2: %p %d \"%s\"",
                        cycle->log->file,
                        cycle->log->file->fd, cycle->log->file->name.data);
 
@@ -426,8 +433,8 @@
 
         if (ngx_close_socket(ls[i].fd) == -1) {
             ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                          ngx_close_socket_n " %s failed",
-                          ls[i].addr_text.data);
+                          ngx_close_socket_n " %V failed",
+                          &ls[i].addr_text);
         }
     }
 
@@ -512,13 +519,38 @@
 }
 
 
-#if !(WIN32)
+static ngx_int_t ngx_cmp_sockaddr(struct sockaddr *s1, struct sockaddr *s2)
+{
+    struct sockaddr_in  *sin1, *sin2;
+
+    /* AF_INET only */
+
+    if (s1->sa_family != AF_INET || s2->sa_family != AF_INET) {
+        return NGX_DECLINED;
+    }
+
+    sin1 = (struct sockaddr_in *) s1;
+    sin2 = (struct sockaddr_in *) s2;
+
+    if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {
+        return NGX_DECLINED;
+    }
+
+    if (sin1->sin_port != sin2->sin_port) {
+        return NGX_DECLINED;
+    }
+
+    return NGX_OK;
+}
+
+
+#if !(NGX_WIN32)
 
 ngx_int_t ngx_create_pidfile(ngx_cycle_t *cycle, ngx_cycle_t *old_cycle)
 {
     ngx_uint_t        trunc;
     size_t            len;
-    u_char           *name, pid[NGX_INT64_LEN + 1];
+    u_char           *name, pid[NGX_INT64_LEN];
     ngx_file_t        file;
     ngx_core_conf_t  *ccf, *old_ccf;
 
@@ -548,8 +580,6 @@
         }
     }
 
-    len = ngx_snprintf((char *) pid, NGX_INT64_LEN + 1, PID_T_FMT, ngx_pid);
-
     ngx_memzero(&file, sizeof(ngx_file_t));
     file.name = (ngx_inherited && getppid() > 1) ? ccf->newpid : ccf->pid;
     file.log = cycle->log;
@@ -566,6 +596,8 @@
     }
 
     if (!ngx_test_config) {
+        len = ngx_sprintf(pid, "%P", ngx_pid) - pid;
+
         if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) {
             return NGX_ERROR;
         }
@@ -615,7 +647,7 @@
     ngx_uint_t        i;
     ngx_list_part_t  *part;
     ngx_open_file_t  *file;
-#if !(WIN32)
+#if !(NGX_WIN32)
     ngx_file_info_t   fi;
 #endif
 
@@ -649,7 +681,7 @@
             continue;
         }
 
-#if (WIN32)
+#if (NGX_WIN32)
         if (ngx_file_append_mode(fd) == NGX_ERROR) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
                           ngx_file_append_mode_n " \"%s\" failed",
@@ -730,7 +762,7 @@
         file[i].fd = fd;
     }
 
-#if !(WIN32)
+#if !(NGX_WIN32)
 
     if (cycle->log->file->fd != STDERR_FILENO) {
         if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {
diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h
index 45b7b23..2baf829 100644
--- a/src/core/ngx_cycle.h
+++ b/src/core/ngx_cycle.h
@@ -12,6 +12,10 @@
 #include <ngx_core.h>
 
 
+#define NGX_DEBUG_POINTS_STOP   1
+#define NGX_DEBUG_POINTS_ABORT  2
+
+
 struct ngx_cycle_s {
     void           ****conf_ctx;
     ngx_pool_t        *pool;
@@ -40,6 +44,7 @@
      ngx_flag_t  master;
 
      ngx_int_t   worker_processes;
+     ngx_int_t   debug_points;
 
      ngx_uid_t   user;
      ngx_gid_t   group;
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
index c7ee513..8e1edbd 100644
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -55,9 +55,8 @@
     num = ngx_next_temp_number(0);
 
     for ( ;; ) {
-        ngx_snprintf((char *)
-                            (file->name.data + path->name.len + 1 + path->len),
-                     11, "%010u", num);
+        ngx_sprintf(file->name.data + path->name.len + 1 + path->len,
+                    "%010ud%Z", num);
 
         ngx_create_hashed_filename(file, path);
 
@@ -83,7 +82,7 @@
 
         if ((path->level[0] == 0)
             || (err != NGX_ENOENT
-#if (WIN32)
+#if (NGX_WIN32)
                 && err != NGX_ENOTDIR
 #endif
         )) {
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index bf8a788..5cabb49 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -9,6 +9,17 @@
 #include <ngx_core.h>
 
 
+/*
+ * ngx_sock_ntop() and ngx_inet_ntop() may be implemented as
+ * "ngx_sprintf(text, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3])",
+ * however, they were implemented long before the ngx_sprintf() appeared
+ * and they are faster by 1.5-2.5 times, so it is worth to keep them.
+ *
+ * By the way, the implementation using ngx_sprintf() is faster by 2.5-3 times
+ * than using FreeBSD libc's snrpintf().
+ */
+
+
 ngx_inline static size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len)
 {
     size_t      n;
@@ -105,15 +116,8 @@
     text[n] = '\0';
 
     return n;
-
-#if 0
-    return ngx_snprintf((char *) text,
-                        len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len,
-                        "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
-#endif
 }
 
-
 size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len)
 {
     u_char      *p;
@@ -163,12 +167,6 @@
     text[n] = '\0';
 
     return n;
-
-#if 0
-    return ngx_snprintf((char *) text,
-                        len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len,
-                        "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
-#endif
 }
 
 
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index f1c0e97..521ba7a 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -8,7 +8,7 @@
 #include <ngx_core.h>
 
 
-static void ngx_log_write(ngx_log_t *log, char *errstr, size_t len);
+static void ngx_log_write(ngx_log_t *log, u_char *errstr, size_t len);
 static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 
 
@@ -38,7 +38,7 @@
     ngx_errlog_commands,                   /* module directives */
     NGX_CORE_MODULE,                       /* module type */
     NULL,                                  /* init module */
-    NULL                                   /* init child */
+    NULL                                   /* init process */
 };
 
 
@@ -65,121 +65,104 @@
                         const char *fmt, va_list args)
 #endif
 {
-    char      errstr[MAX_ERROR_STR];
-    size_t    len, max;
 #if (NGX_HAVE_VARIADIC_MACROS)
-    va_list   args;
+    va_list  args;
 #endif
+    u_char   errstr[NGX_MAX_ERROR_STR], *p, *last;
 
     if (log->file->fd == NGX_INVALID_FILE) {
         return;
     }
 
+    last = errstr + NGX_MAX_ERROR_STR;
+
     ngx_memcpy(errstr, ngx_cached_err_log_time.data,
                ngx_cached_err_log_time.len);
 
-#if (WIN32)
-    max = MAX_ERROR_STR - 2;
-#else
-    max = MAX_ERROR_STR - 1;
-#endif
+    p = errstr + ngx_cached_err_log_time.len;
 
-    len = ngx_cached_err_log_time.len;
-
-    len += ngx_snprintf(errstr + len, max - len, " [%s] ", err_levels[level]);
+    p = ngx_sprintf(p, " [%s] ", err_levels[level]);
 
     /* pid#tid */
-    len += ngx_snprintf(errstr + len, max - len,
-                        PID_T_FMT "#" TID_T_FMT ": ", ngx_log_pid, ngx_log_tid);
+    p = ngx_sprintf(p, "%P#" NGX_TID_T_FMT ": ", ngx_log_pid, ngx_log_tid);
 
     if (log->data && *(int *) log->data != -1) {
-        len += ngx_snprintf(errstr + len, max - len,
-                            "*%u ", *(u_int *) log->data);
+        p = ngx_sprintf(p, "*%ud ", *(u_int *) log->data);
     }
 
 #if (NGX_HAVE_VARIADIC_MACROS)
 
     va_start(args, fmt);
-    len += ngx_vsnprintf(errstr + len, max - len, fmt, args);
+    p = ngx_vsnprintf(p, last - p, fmt, args);
     va_end(args);
 
 #else
 
-    len += ngx_vsnprintf(errstr + len, max - len, fmt, args);
+    p = ngx_vsnprintf(p, last - p, fmt, args);
 
 #endif
 
     if (err) {
 
-        if (len > max - 50) {
+        if (p > last - 50) {
 
             /* leave a space for an error code */
 
-            len = max - 50;
-            errstr[len++] = '.';
-            errstr[len++] = '.';
-            errstr[len++] = '.';
+            p = last - 50;
+            *p++ = '.';
+            *p++ = '.';
+            *p++ = '.';
         }
 
-#if (WIN32)
+#if (NGX_WIN32)
+
         if ((unsigned) err >= 0x80000000) {
-            len += ngx_snprintf(errstr + len, max - len, " (%X: ", err);
+            p = ngx_snprintf(p, last - p, " (%Xd: ", err);
+
         } else {
-            len += ngx_snprintf(errstr + len, max - len, " (%d: ", err);
+            p = ngx_snprintf(p, last - p, " (%d: ", err);
         }
+
 #else
-        len += ngx_snprintf(errstr + len, max - len, " (%d: ", err);
+
+        p = ngx_snprintf(p, last - p, " (%d: ", err);
+
 #endif
 
-        if (len >= max) {
-            ngx_log_write(log, errstr, max);
-            return;
-        }
+        p = ngx_strerror_r(err, p, last - p);
 
-        len += ngx_strerror_r(err, errstr + len, max - len);
-
-        if (len >= max) {
-            ngx_log_write(log, errstr, max);
-            return;
-        }
-
-        errstr[len++] = ')';
-
-        if (len >= max) {
-            ngx_log_write(log, errstr, max);
-            return;
-        }
-
-    } else {
-        if (len >= max) {
-            ngx_log_write(log, errstr, max);
-            return;
+        if (p < last) {
+            *p++ = ')';
         }
     }
 
     if (level != NGX_LOG_DEBUG && log->handler) {
-        len += log->handler(log->data, errstr + len, max - len);
-
-        if (len >= max) {
-            len = max;
-        }
+        p = log->handler(log->data, p, last - p);
     }
 
-    ngx_log_write(log, errstr, len);
+    ngx_log_write(log, errstr, p - errstr);
 }
 
 
-static void ngx_log_write(ngx_log_t *log, char *errstr, size_t len)
+static void ngx_log_write(ngx_log_t *log, u_char *errstr, size_t len)
 {
-#if (WIN32)
+#if (NGX_WIN32)
     u_long  written;
 
+    if (len >= NGX_MAX_ERROR_STR - 1) {
+        len = NGX_MAX_ERROR_STR - 2;
+    }
+
     errstr[len++] = CR;
     errstr[len++] = LF;
     WriteFile(log->file->fd, errstr, len, &written, NULL);
 
 #else
 
+    if (len == NGX_MAX_ERROR_STR) {
+        len--;
+    }
+
     errstr[len++] = LF;
     write(log->file->fd, errstr, len);
 
@@ -192,7 +175,7 @@
 void ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                    const char *fmt, ...)
 {
-    va_list    args;
+    va_list  args;
 
     if (log->log_level >= level) {
         va_start(args, fmt);
@@ -204,46 +187,39 @@
 
 void ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...)
 {
-    va_list    args;
+    va_list  args;
 
     va_start(args, fmt);
     ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args);
     va_end(args);
 }
 
-
-void ngx_assert_core(ngx_log_t *log, const char *fmt, ...)
-{
-    va_list    args;
-
-    va_start(args, fmt);
-    ngx_log_error_core(NGX_LOG_ALERT, log, 0, fmt, args);
-    va_end(args);
-}
-
 #endif
 
 
-ngx_log_t *ngx_log_init_stderr()
+ngx_log_t *ngx_log_init()
 {
-#if (WIN32)
+    ngx_log.file = &ngx_stderr;
+    ngx_log.log_level = NGX_LOG_NOTICE;
 
-    ngx_stderr_fileno = GetStdHandle(STD_ERROR_HANDLE);
-    ngx_stderr.fd = ngx_stderr_fileno;
+#if (NGX_WIN32)
 
-    if (ngx_stderr_fileno == NGX_INVALID_FILE) {
+    ngx_stderr.fd = ngx_open_file(NGX_ERROR_LOG_PATH, NGX_FILE_RDWR,
+                                  NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
 
-        /* TODO: where can we log error ? */
-
+    if (ngx_stderr.fd == NGX_INVALID_FILE) {
+        ngx_message_box("nginx", MB_OK, ngx_errno,
+                        "Could not open error log file: "
+                        ngx_open_file_n " \"" NGX_ERROR_LOG_PATH "\" failed");
         return NULL;
+    }
 
-    } else if (ngx_stderr_fileno == NULL) {
-
-        /* there are no associated standard handles */
-
-        /* TODO: where can we can log possible errors ? */
-
-        ngx_stderr.fd = NGX_INVALID_FILE;
+    if (ngx_file_append_mode(ngx_stderr.fd) == NGX_ERROR) {
+        ngx_message_box("nginx", MB_OK, ngx_errno,
+                        "Could not open error log file: "
+                        ngx_file_append_mode_n " \"" NGX_ERROR_LOG_PATH
+                        "\" failed");
+        return NULL;
     }
 
 #else
@@ -252,61 +228,10 @@
 
 #endif
 
-    ngx_log.file = &ngx_stderr;
-    ngx_log.log_level = NGX_LOG_NOTICE;
-
     return &ngx_log;
 }
 
 
-#if 0
-
-ngx_int_t ngx_log_init_error_log()
-{
-    ngx_fd_t  fd;
-
-#ifdef NGX_ERROR_LOG_PATH
-
-    fd = ngx_open_file(NGX_ERROR_LOG_PATH, NGX_FILE_RDWR,
-                       NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
-
-    if (fd == NGX_INVALID_FILE) {
-        ngx_log_error(NGX_LOG_EMERG, (&ngx_log), ngx_errno,
-                      ngx_open_file_n " \"" NGX_ERROR_LOG_PATH "\" failed");
-        return NGX_ERROR;
-    }
-
-#if (WIN32)
-
-    if (ngx_file_append_mode(fd) == NGX_ERROR) {
-        ngx_log_error(NGX_LOG_EMERG, (&ngx_log), ngx_errno,
-                      ngx_file_append_mode_n " \"" NGX_ERROR_LOG_PATH
-                      "\" failed");
-        return NGX_ERROR;
-    }
-
-#else
-
-    if (dup2(fd, STDERR_FILENO) == NGX_ERROR) {
-        ngx_log_error(NGX_LOG_EMERG, (&ngx_log), ngx_errno,
-                      "dup2(STDERR) failed");
-        return NGX_ERROR;
-    }
-
-#endif
-
-#else  /* no NGX_ERROR_LOG_PATH */
-
-    ngx_log.log_level = NGX_LOG_INFO;
-
-#endif
-
-    return NGX_OK;
-}
-
-#endif
-
-
 ngx_log_t *ngx_log_create_errlog(ngx_cycle_t *cycle, ngx_array_t *args)
 {
     ngx_log_t  *log;
diff --git a/src/core/ngx_log.h b/src/core/ngx_log.h
index 5ddd8fc..c54c187 100644
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -40,7 +40,7 @@
 #define NGX_LOG_DEBUG_ALL         0x7ffffff0
 
 
-typedef size_t  (*ngx_log_handler_pt) (void *ctx, char *buf, size_t len);
+typedef u_char *(*ngx_log_handler_pt) (void *ctx, u_char *buf, size_t len);
 
 
 struct ngx_log_s {
@@ -50,7 +50,8 @@
     ngx_log_handler_pt   handler;
 };
 
-#define MAX_ERROR_STR	 2048
+
+#define NGX_MAX_ERROR_STR   2048
 
 
 /*********************************/
@@ -88,7 +89,6 @@
 void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                         const char *fmt, va_list args);
 void ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...);
-void ngx_assert_core(ngx_log_t *log, const char *fmt, ...);
 
 
 #endif /* VARIADIC MACROS */
@@ -195,10 +195,7 @@
 #define ngx_log_alloc_log(pool, log)  ngx_palloc(pool, log, sizeof(ngx_log_t))
 #define ngx_log_copy_log(new, old)    ngx_memcpy(new, old, sizeof(ngx_log_t))
 
-ngx_log_t *ngx_log_init_stderr();
-#if 0
-ngx_int_t ngx_log_init_error_log();
-#endif
+ngx_log_t *ngx_log_init();
 ngx_log_t *ngx_log_create_errlog(ngx_cycle_t *cycle, ngx_array_t *args);
 char *ngx_set_error_log_levels(ngx_conf_t *cf, ngx_log_t *log);
 
diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c
index 23b7846..30dda35 100644
--- a/src/core/ngx_output_chain.c
+++ b/src/core/ngx_output_chain.c
@@ -162,7 +162,11 @@
                 ctx->in = ctx->in->next;
             }
 
-            ngx_alloc_link_and_set_buf(cl, ctx->buf, ctx->pool, NGX_ERROR);
+            if (!(cl = ngx_alloc_chain_link(ctx->pool))) {
+                return NGX_ERROR;
+            }
+            cl->buf = ctx->buf;
+            cl->next = NULL;
             *last_out = cl;
             last_out = &cl->next;
             ctx->buf = NULL;
@@ -266,7 +270,7 @@
 
         if ((size_t) n != size) {
             ngx_log_error(NGX_LOG_ALERT, src->file->log, 0,
-                          ngx_read_file_n " reads only %d of %d from file",
+                          ngx_read_file_n " reads only %z of %uz from file",
                           n, size);
             if (n == 0) {
                 return NGX_ERROR;
@@ -306,20 +310,24 @@
     for (/* void */; in; in = in->next) {
 
         ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->connection->log, 0,
-                       "WRITER buf: %d", ngx_buf_size(in->buf));
+                       "chain writer buf size: %uz", ngx_buf_size(in->buf));
 
-        ngx_alloc_link_and_set_buf(cl, in->buf, ctx->pool, NGX_ERROR);
+        if (!(cl = ngx_alloc_chain_link(ctx->pool))) {
+            return NGX_ERROR;
+        }
+        cl->buf = in->buf;
+        cl->next = NULL;
         *ctx->last = cl;
         ctx->last = &cl->next;
     }
 
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->connection->log, 0,
-                   "WRITER0: %X", ctx->out);
+                   "chain writer in: %p", ctx->out);
 
     ctx->out = ngx_send_chain(ctx->connection, ctx->out, ctx->limit);
 
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->connection->log, 0,
-                   "WRITER1: %X", ctx->out);
+                   "chain writer out: %p", ctx->out);
 
     if (ctx->out == NGX_CHAIN_ERROR) {
         return NGX_ERROR;
diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c
index e41e971..ed13de5 100644
--- a/src/core/ngx_palloc.c
+++ b/src/core/ngx_palloc.c
@@ -33,8 +33,7 @@
 
     for (l = pool->large; l; l = l->next) {
 
-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
-                       "free: " PTR_FMT, l->alloc);
+        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
 
         if (l->alloc) {
             free(l->alloc);
@@ -50,8 +49,7 @@
 
     for (p = pool, n = pool->next; /* void */; p = n, n = n->next) {
         ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
-                       "free: " PTR_FMT ", unused: " SIZE_T_FMT,
-                       p, p->end - p->last);
+                       "free: %p, unused: %uz", p, p->end - p->last);
 
         if (n == NULL) {
             break;
@@ -164,7 +162,7 @@
     for (l = pool->large; l; l = l->next) {
         if (p == l->alloc) {
             ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
-                           "free: " PTR_FMT, l->alloc);
+                           "free: %p", l->alloc);
             free(l->alloc);
             l->alloc = NULL;
 
diff --git a/src/core/ngx_regex.c b/src/core/ngx_regex.c
index 27dad8d..35b4892 100644
--- a/src/core/ngx_regex.c
+++ b/src/core/ngx_regex.c
@@ -53,11 +53,11 @@
 
     if (re == NULL) {
        if ((size_t) erroff == pattern->len) {
-           ngx_snprintf((char *) err->data, err->len - 1,
+           ngx_snprintf(err->data, err->len - 1,
                         "pcre_compile() failed: %s in \"%s\"",
                         errstr, pattern->data);
         } else {
-           ngx_snprintf((char *) err->data, err->len - 1,
+           ngx_snprintf(err->data, err->len - 1,
                         "pcre_compile() failed: %s in \"%s\" at \"%s\"",
                         errstr, pattern->data, pattern->data + erroff);
         }
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 390ca43..94eadfb 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -30,42 +30,92 @@
 
 /*
  * supported formats:
- *    %[0][width]O     off_t
- *    %[0][width]T     time_t
- *    %[0][width]S     ssize_t
- *    %[0][width]uS    size_t
- *    %[0][width]uxS   size_t in hex
- *    %[0][width]l     long
- *    %[0][width]d     int
- *    %[0][width]i     ngx_int_t
- *    %[0][width]ui    ngx_uint_t
- *    %[0][width]uxi   ngx_uint_t in hex
- *    %s               null-terminated string
- *    %c               char
- *    %%               %
+ *    %[0][width]O              off_t
+ *    %[0][width]T              time_t
+ *    %[0][width][u][x|X]z      ssize_t/size_t
+ *    %[0][width][u][x|X]d      int/u_int
+ *    %[0][width][u][x|X]l      long
+ *    %[0][width|m][u][x|X]i    ngx_int_t/ngx_uint_t
+ *    %[0][width][u][x|X]D      int32_t/uint32_t
+ *    %[0][width][u][x|X]L      int64_t/uint64_t
+ *    %P                        ngx_pid_t
+ *    %r                        rlim_t
+ *    %p                        pointer
+ *    %V                        pointer to ngx_str_t
+ *    %s                        null-terminated string
+ *    %Z                        '\0'
+ *    %c                        char
+ *    %%                        %
  *
+ *  TODO:
+ *    %M                        ngx_msec_t
+ *    %A                        ngx_atomic_t
+ *
+ *  reserved:
+ *    %t                        ptrdiff_t
+ *    %S                        null-teminated wchar string
+ *    %C                        wchar
  */
 
-u_char *ngx_sprintf(u_char *buf, char *fmt, ...)
+
+u_char *ngx_sprintf(u_char *buf, const char *fmt, ...)
 {
-    u_char        *p, c, temp[NGX_MAX_INT_LEN];
-    int            d;
-    long           l;
-    off_t          offset;
-    size_t         size, len;
-    ssize_t        ssize;
-    time_t         sec;
-    va_list        arg;
-    ngx_int_t      i;
-    ngx_uint_t     ui, zero, width, sign, hexadecimal;
-    static u_char  hex[] = "0123456789abcdef";
+    u_char   *p;
+    va_list   args;
 
-    va_start(arg, fmt);
+    va_start(args, fmt);
+    p = ngx_vsnprintf(buf, /* STUB */ 65536, fmt, args);
+    va_end(args);
 
-    while (*fmt) {
+    return p;
+}
+
+
+u_char *ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...)
+{
+    u_char   *p;
+    va_list   args;
+
+    va_start(args, fmt);
+    p = ngx_vsnprintf(buf, max, fmt, args);
+    va_end(args);
+
+    return p;
+}
+
+
+u_char *ngx_vsnprintf(u_char *buf, size_t max, const char *fmt, va_list args)
+{
+    u_char         *p, zero, *last, temp[NGX_MAX_INT_LEN];
+    int             d;
+    size_t          len;
+    uint32_t        ui32;
+    int64_t         i64;
+    uint64_t        ui64;
+    ngx_str_t      *s;
+    ngx_uint_t      width, sign, hexadecimal;
+    static u_char   hex[] = "0123456789abcdef";
+    static u_char   HEX[] = "0123456789ABCDEF";
+
+    if (max == 0) {
+        return buf;
+    }
+
+    last = buf + max;
+
+    while (*fmt && buf < last) {
+
+        /*
+         * "buf < last" means that we could copy at least one character:
+         * the plain character, "%%", "%c", and minus without the checking
+         */
+
         if (*fmt == '%') {
 
-            zero = (*++fmt == '0') ? 1 : 0;
+            i64 = 0;
+            ui64 = 0;
+
+            zero = (u_char) ((*++fmt == '0') ? '0' : ' ');
             width = 0;
             sign = 1;
             hexadecimal = 0;
@@ -85,8 +135,15 @@
                     fmt++;
                     continue;
 
+                case 'X':
+                    hexadecimal = 2;
+                    sign = 0;
+                    fmt++;
+                    continue;
+
                 case 'x':
                     hexadecimal = 1;
+                    sign = 0;
                     fmt++;
                     continue;
 
@@ -100,137 +157,116 @@
 
             switch (*fmt) {
 
-            case 'O':
-                offset = va_arg(arg, off_t);
+            case 'V':
+                s = va_arg(args, ngx_str_t *);
 
-                if (offset < 0) {
-                    *buf++ = '-';
-                    offset = -offset;
-                }
+                len = (buf + s->len < last) ? s->len : (size_t) (last - buf);
+                buf = ngx_cpymem(buf, s->data, len);
+                fmt++;
 
-                do {
-                    *--p = (u_char) (offset % 10 + '0');
-                } while (offset /= 10);
-
-                break;
-
-            case 'T':
-                sec = va_arg(arg, time_t);
-
-                if (sec < 0) {
-                    *buf++ = '-';
-                    sec = -sec;
-                }
-
-                do {
-                    *--p = (u_char) (sec % 10 + '0');
-                } while (sec /= 10);
-
-                break;
-
-            case 'S':
-                if (sign) {
-                    ssize = va_arg(arg, ssize_t);
-
-                    if (ssize < 0) {
-                        *buf++ = '-';
-                        size = (size_t) -ssize;
-
-                    } else {
-                        size = (size_t) ssize;
-                    }
-
-                } else {
-                    size = va_arg(arg, size_t);
-                }
-
-                if (hexadecimal) {
-                    do {
-                        *--p = hex[size & 0xf];
-                    } while (size >>= 4);
-
-                } else {
-                    do {
-                        *--p = (u_char) (size % 10 + '0');
-                    } while (size /= 10);
-                }
-
-                break;
-
-            case 'l':
-                l = va_arg(arg, long);
-
-                if (l < 0) {
-                    *buf++ = '-';
-                    l = -l;
-                }
-
-                do {
-                    *--p = (u_char) (l % 10 + '0');
-                } while (l /= 10);
-
-                break;
-
-            case 'd':
-                d = va_arg(arg, int);
-
-                if (d < 0) {
-                    *buf++ = '-';
-                    d = -d;
-                }
-
-                do {
-                    *--p = (u_char) (d % 10 + '0');
-                } while (d /= 10);
-
-                break;
-
-            case 'i':
-                if (sign) {
-                    i = va_arg(arg, ngx_int_t);
-
-                    if (i < 0) {
-                        *buf++ = '-';
-                        ui = (ngx_uint_t) -i;
-
-                    } else {
-                        ui = (ngx_uint_t) i;
-                    }
-
-                } else {
-                    ui = va_arg(arg, ngx_uint_t);
-                }
-
-                if (hexadecimal) {
-                    do {
-                        *--p = hex[ui & 0xf];
-                    } while (ui >>= 4);
-
-                } else {
-                    do {
-                        *--p = (u_char) (ui % 10 + '0');
-                    } while (ui /= 10);
-                }
-
-                break;
+                continue;
 
             case 's':
-                p = va_arg(arg, u_char *);
+                p = va_arg(args, u_char *);
 
-                while (*p) {
+                while (*p && buf < last) {
                     *buf++ = *p++;
                 }
                 fmt++;
 
                 continue;
 
+            case 'O':
+                i64 = (int64_t) va_arg(args, off_t);
+                sign = 1;
+                break;
+
+            case 'P':
+                i64 = (int64_t) va_arg(args, ngx_pid_t);
+                sign = 1;
+                break;
+
+            case 'T':
+                i64 = (int64_t) va_arg(args, time_t);
+                sign = 1;
+                break;
+
+            case 'z':
+                if (sign) {
+                    i64 = (int64_t) va_arg(args, ssize_t);
+                } else {
+                    ui64 = (uint64_t) va_arg(args, size_t);
+                }
+                break;
+
+            case 'i':
+                if (sign) {
+                    i64 = (int64_t) va_arg(args, ngx_int_t);
+                } else {
+                    ui64 = (uint64_t) va_arg(args, ngx_uint_t);
+                }
+                break;
+
+            case 'd':
+                if (sign) {
+                    i64 = (int64_t) va_arg(args, int);
+                } else {
+                    ui64 = (uint64_t) va_arg(args, u_int);
+                }
+                break;
+
+            case 'l':
+                if (sign) {
+                    i64 = (int64_t) va_arg(args, long);
+                } else {
+                    ui64 = (uint64_t) va_arg(args, u_long);
+                }
+                break;
+
+            case 'D':
+                if (sign) {
+                    i64 = (int64_t) va_arg(args, int32_t);
+                } else {
+                    ui64 = (uint64_t) va_arg(args, uint32_t);
+                }
+                break;
+
+            case 'L':
+                if (sign) {
+                    i64 = va_arg(args, int64_t);
+                } else {
+                    ui64 = va_arg(args, uint64_t);
+                }
+                break;
+
+#if !(NGX_WIN32)
+            case 'r':
+                i64 = (int64_t) va_arg(args, rlim_t);
+                sign = 1;
+                break;
+#endif
+
+            case 'p':
+                ui64 = (uintptr_t) va_arg(args, void *);
+                hexadecimal = 2;
+                sign = 0;
+                zero = '0';
+                width = 8;
+                break;
+
             case 'c':
-                d = va_arg(arg, int);
+                d = va_arg(args, int);
                 *buf++ = (u_char) (d & 0xff);
                 fmt++;
 
                 continue;
 
+            case 'Z':
+                *buf++ = '\0';
+                fmt++;
+
+                continue;
+
             case '%':
                 *buf++ = '%';
                 fmt++;
@@ -243,15 +279,71 @@
                 continue;
             }
 
-            len = (temp + NGX_MAX_INT_LEN) - p;
+            if (sign) {
+                if (i64 < 0) {
+                    *buf++ = '-';
+                    ui64 = (uint64_t) -i64;
 
-            c = (u_char) (zero ? '0' : ' ');
-
-            while (len++ < width) {
-                *buf++ = c;
+                } else {
+                    ui64 = (uint64_t) i64;
+                }
             }
 
-            buf = ngx_cpymem(buf, p, ((temp + NGX_MAX_INT_LEN) - p));
+            if (hexadecimal == 1) {
+                do {
+
+                    /* the "(uint32_t)" cast disables the BCC's warning */
+                    *--p = hex[(uint32_t) (ui64 & 0xf)];
+
+                } while (ui64 >>= 4);
+
+            } else if (hexadecimal == 2) {
+                do {
+
+                    /* the "(uint32_t)" cast disables the BCC's warning */
+                    *--p = HEX[(uint32_t) (ui64 & 0xf)];
+
+                } while (ui64 >>= 4);
+
+            } else if (ui64 <= NGX_MAX_UINT32_VALUE) {
+
+                /*
+                 * To divide 64-bit number and to find the remainder
+                 * on the x86 platform gcc and icc call the libc functions
+                 * [u]divdi3() and [u]moddi3(), they call another function
+                 * in return.  On FreeBSD it is the qdivrem() function,
+                 * its source code is about 170 lines of the code.
+                 * The glibc counterpart is about 150 lines of the code.
+                 *
+                 * For 32-bit numbers gcc and icc use the inlined
+                 * multiplication and shifts.  For example, unsigned
+                 * "i32 / 10" is compiled to "(i32 * 0xCCCCCCCD) >> 35".
+                 */
+
+                ui32 = (uint32_t) ui64;
+
+                do {
+                    *--p = (u_char) (ui32 % 10 + '0');
+                } while (ui32 /= 10);
+
+            } else {
+                do {
+                    *--p = (u_char) (ui64 % 10 + '0');
+                } while (ui64 /= 10);
+            }
+
+            len = (temp + NGX_MAX_INT_LEN) - p;
+
+            while (len++ < width && buf < last) {
+                *buf++ = zero;
+            }
+
+            len = (temp + NGX_MAX_INT_LEN) - p;
+            if (buf + len > last) {
+                len = last - buf;
+            }
+
+            buf = ngx_cpymem(buf, p, len);
 
             fmt++;
 
@@ -260,10 +352,6 @@
         }
     }
 
-    va_end(arg);
-
-    *buf = '\0';
-
     return buf;
 }
 
@@ -505,12 +593,14 @@
 }
 
 
-ngx_int_t ngx_escape_uri(u_char *dst, u_char *src, size_t size)
+ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
+                          ngx_uint_t type)
 {
-    ngx_int_t         n;
-    ngx_uint_t        i;
+    ngx_uint_t        i, n;
+    uint32_t         *escape;
     static u_char     hex[] = "0123456789abcdef";
-    static uint32_t   escape[] =
+
+    static uint32_t   uri[] =
         { 0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
 
                       /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */
@@ -527,6 +617,31 @@
           0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
           0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */ };
 
+    static uint32_t   html[] =
+        { 0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
+
+                      /* ?>=< ;:98 7654 3210  /.-, +*)( '&%$ #"!  */
+          0x80000021, /* 0000 0000 0000 0000  0000 0000 1010 0101 */
+
+                      /* _^]\ [ZYX WVUT SRQP  ONML KJIH GFED CBA@ */
+          0x00000000, /* 0000 0000 0000 0000  0000 0000 0000 0000 */
+
+                      /*  ~}| {zyx wvut srqp  onml kjih gfed cba` */
+          0x80000000, /* 1000 0000 0000 0000  0000 0000 0000 0000 */
+
+          0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
+          0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
+          0xffffffff, /* 1111 1111 1111 1111  1111 1111 1111 1111 */
+          0xffffffff  /* 1111 1111 1111 1111  1111 1111 1111 1111 */ };
+
+
+    if (type == NGX_ESCAPE_HTML) {
+        escape = html;
+
+    } else {
+        escape = uri;
+    }
+
     if (dst == NULL) {
 
         /* find the number of the characters to be escaped */
@@ -555,5 +670,5 @@
         }
     }
 
-    return NGX_OK;
+    return 0;
 }
diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h
index d7caaaf..51e0fd0 100644
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -22,16 +22,13 @@
 #define ngx_null_string  { 0, NULL }
 
 
-#if (WIN32)
+#if (NGX_WIN32)
 
 #define ngx_strncasecmp(s1, s2, n)                                           \
                            strnicmp((const char *) s1, (const char *) s2, n)
 #define ngx_strcasecmp(s1, s2)                                               \
                            stricmp((const char *) s1, (const char *) s2)
 
-#define ngx_snprintf       _snprintf
-#define ngx_vsnprintf      _vsnprintf
-
 #else
 
 #define ngx_strncasecmp(s1, s2, n)                                           \
@@ -39,21 +36,20 @@
 #define ngx_strcasecmp(s1, s2)                                               \
                            strcasecmp((const char *) s1, (const char *) s2)
 
-#define ngx_snprintf       snprintf
-#define ngx_vsnprintf      vsnprintf
-
 #endif
 
 
-#define ngx_strncmp(s1, s2, n)                                               \
-                            strncmp((const char *) s1, (const char *) s2, n)
+#define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)
+
 
 /* msvc and icc compile strcmp() to inline loop */
 #define ngx_strcmp(s1, s2)  strcmp((const char *) s1, (const char *) s2)
 
+
 #define ngx_strstr(s1, s2)  strstr((const char *) s1, (const char *) s2)
 #define ngx_strlen(s)       strlen((const char *) s)
 
+
 /*
  * msvc and icc compile memset() to the inline "rep stos"
  * while ZeroMemory() and bzero() are the calls.
@@ -62,15 +58,20 @@
 #define ngx_memzero(buf, n)       memset(buf, 0, n)
 #define ngx_memset(buf, c, n)     memset(buf, c, n)
 
+
 /* msvc and icc compile memcpy() to the inline "rep movs" */
 #define ngx_memcpy(dst, src, n)   memcpy(dst, src, n)
 #define ngx_cpymem(dst, src, n)   ((u_char *) memcpy(dst, src, n)) + n
 
+
 /* msvc and icc compile memcmp() to the inline loop */
 #define ngx_memcmp                memcmp
 
+
 u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n);
-u_char *ngx_sprintf(u_char *buf, char *fmt, ...);
+u_char *ngx_sprintf(u_char *buf, const char *fmt, ...);
+u_char *ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...);
+u_char *ngx_vsnprintf(u_char *buf, size_t max, const char *fmt, va_list args);
 
 ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n);
 ngx_int_t ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n);
@@ -86,7 +87,13 @@
 
 void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src);
 ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src);
-ngx_int_t ngx_escape_uri(u_char *dst, u_char *src, size_t size);
+
+
+#define NGX_ESCAPE_URI   0
+#define NGX_ESCAPE_HTML  1
+
+ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
+                          ngx_uint_t type);
 
 
 #define  ngx_qsort                qsort
diff --git a/src/core/ngx_times.c b/src/core/ngx_times.c
index 40dbbdb..f06d644 100644
--- a/src/core/ngx_times.c
+++ b/src/core/ngx_times.c
@@ -94,7 +94,7 @@
     ngx_old_elapsed_msec = 0;
     ngx_elapsed_msec = 0;
 
-#if !(WIN32)
+#if !(NGX_WIN32)
     tzset();
 #endif
 
@@ -150,15 +150,14 @@
 
     p = cached_http_time[slot];
 
-    ngx_snprintf((char *) p, sizeof("Mon, 28 Sep 1970 06:00:00 GMT"),
-                 "%s, %02d %s %4d %02d:%02d:%02d GMT",
-                 week[ngx_cached_gmtime.ngx_tm_wday],
-                 ngx_cached_gmtime.ngx_tm_mday,
-                 months[ngx_cached_gmtime.ngx_tm_mon - 1],
-                 ngx_cached_gmtime.ngx_tm_year,
-                 ngx_cached_gmtime.ngx_tm_hour,
-                 ngx_cached_gmtime.ngx_tm_min,
-                 ngx_cached_gmtime.ngx_tm_sec);
+    ngx_sprintf(p, "%s, %02d %s %4d %02d:%02d:%02d GMT",
+                week[ngx_cached_gmtime.ngx_tm_wday],
+                ngx_cached_gmtime.ngx_tm_mday,
+                months[ngx_cached_gmtime.ngx_tm_mon - 1],
+                ngx_cached_gmtime.ngx_tm_year,
+                ngx_cached_gmtime.ngx_tm_hour,
+                ngx_cached_gmtime.ngx_tm_min,
+                ngx_cached_gmtime.ngx_tm_sec);
 
     ngx_cached_http_time.data = p;
 
@@ -183,24 +182,22 @@
 
     p = cached_err_log_time[slot];
 
-    ngx_snprintf((char *) p, sizeof("1970/09/28 12:00:00"),
-                 "%4d/%02d/%02d %02d:%02d:%02d",
-                 tm.ngx_tm_year, tm.ngx_tm_mon,
-                 tm.ngx_tm_mday, tm.ngx_tm_hour,
-                 tm.ngx_tm_min, tm.ngx_tm_sec);
+    ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d",
+                tm.ngx_tm_year, tm.ngx_tm_mon,
+                tm.ngx_tm_mday, tm.ngx_tm_hour,
+                tm.ngx_tm_min, tm.ngx_tm_sec);
 
     ngx_cached_err_log_time.data = p;
 
 
     p = cached_http_log_time[slot];
 
-    ngx_snprintf((char *) p, sizeof("28/Sep/1970:12:00:00 +0600"),
-                 "%02d/%s/%d:%02d:%02d:%02d %c%02d%02d",
-                 tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1],
-                 tm.ngx_tm_year, tm.ngx_tm_hour,
-                 tm.ngx_tm_min, tm.ngx_tm_sec,
-                 ngx_gmtoff < 0 ? '-' : '+',
-                 abs(ngx_gmtoff / 60), abs(ngx_gmtoff % 60));
+    ngx_sprintf(p, "%02d/%s/%d:%02d:%02d:%02d %c%02d%02d",
+                tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1],
+                tm.ngx_tm_year, tm.ngx_tm_hour,
+                tm.ngx_tm_min, tm.ngx_tm_sec,
+                ngx_gmtoff < 0 ? '-' : '+',
+                abs(ngx_gmtoff / 60), abs(ngx_gmtoff % 60));
 
     ngx_cached_http_log_time.data = p;
 
@@ -213,9 +210,6 @@
 
 
 u_char *ngx_http_time(u_char *buf, time_t t)
-#if 0
-size_t ngx_http_time(u_char *buf, time_t t)
-#endif
 {
     ngx_tm_t  tm;
 
@@ -229,25 +223,10 @@
                        tm.ngx_tm_hour,
                        tm.ngx_tm_min,
                        tm.ngx_tm_sec);
-
-#if 0
-    return ngx_snprintf((char *) buf, sizeof("Mon, 28 Sep 1970 06:00:00 GMT"),
-                                      "%s, %02d %s %4d %02d:%02d:%02d GMT",
-                                      week[tm.ngx_tm_wday],
-                                      tm.ngx_tm_mday,
-                                      months[tm.ngx_tm_mon - 1],
-                                      tm.ngx_tm_year,
-                                      tm.ngx_tm_hour,
-                                      tm.ngx_tm_min,
-                                      tm.ngx_tm_sec);
-#endif
 }
 
 
 u_char *ngx_http_cookie_time(u_char *buf, time_t t)
-#if 0
-size_t ngx_http_cookie_time(u_char *buf, time_t t)
-#endif
 {
     ngx_tm_t  tm;
 
@@ -270,32 +249,6 @@
                        tm.ngx_tm_hour,
                        tm.ngx_tm_min,
                        tm.ngx_tm_sec);
-
-#if 0
-    if (tm.ngx_tm_year > 2037) {
-        return ngx_snprintf((char *) buf,
-                                      sizeof("Mon, 28-Sep-1970 06:00:00 GMT"),
-                                      "%s, %02d-%s-%d %02d:%02d:%02d GMT",
-                                      week[tm.ngx_tm_wday],
-                                      tm.ngx_tm_mday,
-                                      months[tm.ngx_tm_mon - 1],
-                                      tm.ngx_tm_year,
-                                      tm.ngx_tm_hour,
-                                      tm.ngx_tm_min,
-                                      tm.ngx_tm_sec);
-    } else {
-        return ngx_snprintf((char *) buf,
-                                      sizeof("Mon, 28-Sep-70 06:00:00 GMT"),
-                                      "%s, %02d-%s-%02d %02d:%02d:%02d GMT",
-                                      week[tm.ngx_tm_wday],
-                                      tm.ngx_tm_mday,
-                                      months[tm.ngx_tm_mon - 1],
-                                      tm.ngx_tm_year % 100,
-                                      tm.ngx_tm_hour,
-                                      tm.ngx_tm_min,
-                                      tm.ngx_tm_sec);
-    }
-#endif
 }