]> git.kaiwu.me - nginx.git/commitdiff
nginx-0.0.1-2003-07-01-19:00:03 import
authorIgor Sysoev <igor@sysoev.ru>
Tue, 1 Jul 2003 15:00:03 +0000 (15:00 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Tue, 1 Jul 2003 15:00:03 +0000 (15:00 +0000)
13 files changed:
src/core/nginx.c
src/core/ngx_conf_file.h
src/core/ngx_modules.c
src/core/ngx_string.h
src/event/modules/ngx_poll_module.c
src/event/modules/ngx_select_module.c
src/event/ngx_event.c
src/event/ngx_event.h
src/event/ngx_event_accept.c
src/event/ngx_event_timer.c
src/http/ngx_http_cache.c
src/os/win32/ngx_errno.c
src/os/win32/ngx_win32_init.c

index 338f98a751ee7abded71258847b7402ac020df86..b967393212a090106093ffce6305accc9bd27c1e 100644 (file)
@@ -23,12 +23,14 @@ int ngx_connection_counter;
 ngx_array_t  ngx_listening_sockets;
 
 
+#if 0
+
 int main(int argc, char *const *argv)
 {
     int          i;
     ngx_str_t    conf_file;
     ngx_log_t   *log;
-    ngx_pool_t  *pool, *old_pool;
+    ngx_pool_t  *pool;
     ngx_conf_t   conf;
 
     ngx_max_sockets = -1;
@@ -44,12 +46,11 @@ int main(int argc, char *const *argv)
         ngx_modules[i]->index = ngx_max_module++;
     }
 
-#if 0
-
-    ngx_test_null(cycle->pool, ngx_create_pool(16 * 1024, log), 1);
+    ngx_test_null(pool, ngx_create_pool(16 * 1024, log), 1);
+    ngx_test_null(cycle, ngx_pcalloc(pool, sizeof(ngx_cycle_t)), 1);
+    cycle->pool = pool;
 
     if (ngx_init_conf(cycle) == NGX_ERROR) {
-        ngx_destroy_pool(cycle->pool);
         return 1;
     }
 
@@ -57,38 +58,73 @@ int main(int argc, char *const *argv)
 
     /* life cycle */
 
-    {
+    for ( ;; ) {
 
         /* forks */
 
+        ngx_init_temp_number();
+
         /* threads */
 
         for ( ;; ) {
-            worker;
 
-            new_cycle = ngx_calloc(sizeof(ngx_cycle_t), cycle->log);
+            worker(cycle->log);
+
+            pool = ngx_create_pool(16 * 1024, cycle->log);
+
+            if (pool == NULL) {
+                continue;
+            }
+
+            new_cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
 
             if (new_cycle == NULL) {
+                ngx_destroy_pool(pool);
                 continue;
             }
 
-            new_cycle->pool = ngx_create_pool(16 * 1024, cycle->log);
+            new_cycle->pool = pool;
 
-            if (new_cycle->pool == NULL) {
-                ngx_free(new_cycle);
+            if (ngx_init_conf(new_cycle, cycle->log) == NGX_ERROR) {
+                ngx_destroy_pool(new_cycle->pool);
                 continue;
             }
 
-            if (ngx_init_conf(new_cycle) == NGX_ERROR) {
+            nls = new_cycle->listening.elts;
+            for (n = 0; n < new_cycle->listening.nelts; n++) {
+                ls = cycle->listening.elts;
+                for (i = 0; i < cycle->listening.nelts; i++) {
+                    if (ngx_memcmp(nls[n].sockaddr,
+                                   ls[i].sockaddr, ls[i].socklen) == 0)
+                    {
+                        nls[n].fd = ls[i].fd;
+                        break;
+                    }
+                }
+
+                if (nls[n].fd == -1) {
+                    nls[n].new = 1;
+                }
+            }
+
+            if (ngx_open_listening_sockets(new_cycle) == NGX_ERROR) {
+                for (n = 0; n < new_cycle->listening.nelts; n++) {
+                    if (nls[n].new && nls[n].fd != -1) {
+                        if (ngx_close_socket(nls[n].fd) == -1)
+                            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+                                          ngx_close_socket_n " %s failed",
+                                          nls[n].addr_text.data);
+                        }
+                    }
+                }
+
                 ngx_destroy_pool(new_cycle->pool);
-                ngx_free(new_cycle);
                 continue;
             }
 
-            /* update bound listening */
+            new_cycle->log = new log;
 
             ngx_destroy_pool(cycle->pool);
-            ngx_free(cycle);
 
             cycle = new_cycle;
             break;
@@ -96,9 +132,258 @@ int main(int argc, char *const *argv)
     }
 
     return 0;
+}
+
+
+static int ngx_init_cycle(ngx_cycle_t *old_cycle, ngx_log_t *log)
+{
+    int           n;
+    ngx_conf_t    conf;
+    ngx_pool_t   *pool;
+    ngx_cycle_t  *cycle;
+
+
+    pool = ngx_create_pool(16 * 1024, log);
+    if (pool == NULL) {
+        return NULL;
+    }
+
+    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
+    if (cycle == NULL) {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+    cycle->pool = pool;
+
+    n = old_cycle ? old_cycle->open_files.nelts : 20;
+    cycle->open_files.elts = ngx_pcalloc(pool, n * sizeof(ngx_open_file_t));
+    if (cycle->open_files.elts == NULL) {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+    cycle->open_files.nelts = 0;
+    cycle->open_files.size = sizeof(ngx_open_file_t);
+    cycle->open_files.nalloc = n;
+    cycle->open_files.pool = pool;
+
+    n = old_cycle ? old_cycle->listening.nelts : 10;
+    cycle->listening.elts = ngx_pcalloc(pool, n * sizeof(ngx_listening_t));
+    if (cycle->listening.elts == NULL) {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+    cycle->listening.nelts = 0;
+    cycle->listening.size = sizeof(ngx_listening_t);
+    cycle->listening.nalloc = n;
+    cycle->listening.pool = pool;
+
+    cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));
+    if (cycle->conf_ctx == NULL) {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+
+    ngx_memzero(&conf, sizeof(ngx_conf_t));
+    /* STUB: init array ? */
+    conf.args = ngx_create_array(pool, 10, sizeof(ngx_str_t));
+    if (conf.args == NULL) {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+
+    conf.ctx = cycle->conf_ctx;
+    conf.cycle = cycle;
+    /* STUB */ conf.pool = cycle->pool;
+    conf.log = log;
+    conf.module_type = NGX_CORE_MODULE;
+    conf.cmd_type = NGX_MAIN_CONF;
+
+    conf_file.len = sizeof(NGINX_CONF) - 1;
+    conf_file.data = NGINX_CONF;
+
+    if (ngx_conf_parse(&conf, &conf_file) != NGX_CONF_OK) {
+        ngx_destroy_pool(pool);
+        return NULL;
+    }
+
+    for (i = 0; ngx_modules[i]; i++) {
+        if (ngx_modules[i]->init_module) {
+            if (ngx_modules[i]->init_module(cycle, log) == NGX_ERROR)
+            {
+                failed = 1;
+                break;
+            }
+        }
+    }
+
+    if (!failed) {
+        file = cycle->open_files.elts;
+        for (i = 0; i < cycle->open_files.nelts; i++) {
+            if (file->name.data = NULL) {
+                continue;
+            }
+
+            file->fd = ngx_open_file(file->name.data,
+                                     NGX_FILE_RDWR,
+                                     NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
+
+            if (file->fd == NGX_INVALID_FILE) {
+                ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                              ngx_open_file_n " \"%s\" failed",
+                              file->name.data);
+                failed = 1;
+                break;
+            }
+
+            /* TODO: Win32 append */
+        }
+    }
+
+    if (!failed) {
+        if (ngx_open_listening_sockets(new_cycle) == NGX_ERROR) {
+            failed = 1;
+        }
+    }
+
+    if (failed) {
+
+        /* rollback the new cycle configuration */
+
+        for (i = 0; ngx_modules[i]; i++) {
+            if (ngx_modules[i]->rollback_module) {
+                ngx_modules[i]->rollback_module(cycle);
+            }
+        }
+
+        file = cycle->open_files.elts;
+        for (i = 0; i < cycle->open_files.nelts; i++) {
+            if (file->fd != NGX_INVALID_FILE) {
+                if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
+                    ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                                  ngx_close_file_n " \"%s\" failed",
+                                  file->name.data);
+                }
+            }
+        }
+
+        ls[i] = cycle->listening.elts;
+        for (i = 0; i < cycle->listening.nelts; i++) {
+            if (ls[i].new && ls[i].fd != -1) {
+                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_destroy_pool(pool);
+        return NULL;
+
+    } else {
+
+        /* commit the new cycle configuration */
+
+        for (i = 0; ngx_modules[i]; i++) {
+            if (ngx_modules[i]->commit_module) {
+                ngx_modules[i]->commit_module(cycle);
+            }
+        }
+    }
+
+    new_cycle->log = ???;
+    pool->log = ???;
+
+    return cycle;
+
+
+
+
+
+
+----------------
+
+    ngx_init_array(cycle->listening, cycle->pool, 10, sizeof(ngx_listening_t),
+                   NGX_ERROR);
+
+    ngx_memzero(&conf, sizeof(ngx_conf_t));
+
+    ngx_test_null(conf.args,
+                  ngx_create_array(cycle->pool, 10, sizeof(ngx_str_t)),
+                  NGX_ERROR);
+
+    ngx_test_null(cycle->conf_ctx,
+                  ngx_pcalloc(cycle->pool, ngx_max_module * sizeof(void *)),
+                  NGX_ERROR);
+
+    conf.ctx = cycle->conf_ctx;
+    conf.cycle = cycle;
+    /* STUB */ conf.pool = cycle->pool; conf.log = cycle->log;
+    conf.module_type = NGX_CORE_MODULE;
+    conf.cmd_type = NGX_MAIN_CONF;
+
+    conf_file.len = sizeof(NGINX_CONF) - 1;
+    conf_file.data = NGINX_CONF;
+
+    if (ngx_conf_parse(&conf, &conf_file) == NGX_CONF_OK) {
+        for (i = 0; ngx_modules[i]; i++) {
+            if (ngx_modules[i]->init_module) {
+                if (ngx_modules[i]->init_module(pool) == NGX_ERROR) {
+                    failed = 1;
+                    break;
+                }
+            }
+        }
+
+    } else {
+        failed = 1;
+    }
+
+    if (failed) {
+        for (i = 0; ngx_modules[i]; i++) {
+            if (ngx_modules[i]->rollback_module) {
+                ngx_modules[i]->rollback_module(pool);
+            }
+        }
+
+        return NGX_ERROR;
+
+    } else {
+        for (i = 0; ngx_modules[i]; i++) {
+            if (ngx_modules[i]->commit_module) {
+                ngx_modules[i]->commit_module(pool);
+            }
+        }
+    }
+
+    return NGX_OK;
+}
+
 
 #endif
 
+
+int main(int argc, char *const *argv)
+{
+    int          i;
+    ngx_str_t    conf_file;
+    ngx_log_t   *log;
+    ngx_pool_t  *pool, *old_pool;
+    ngx_conf_t   conf;
+
+    ngx_max_sockets = -1;
+
+    log = ngx_log_init_errlog();
+
+    if (ngx_os_init(log) == NGX_ERROR) {
+        return 1;
+    }
+
+    ngx_max_module = 0;
+    for (i = 0; ngx_modules[i]; i++) {
+        ngx_modules[i]->index = ngx_max_module++;
+    }
+
     /* life cycle */
 
     {
@@ -169,43 +454,6 @@ int main(int argc, char *const *argv)
     return 0;
 }
 
-#if 0
-
-static int ngx_init_conf(ngx_cycle_t *cycle)
-{
-    ngx_conf_t   conf;
-
-    ngx_init_array(cycle->listening, cycle->pool, 10, sizeof(ngx_listening_t),
-                   NGX_ERROR);
-
-    ngx_memzero(&conf, sizeof(ngx_conf_t));
-
-    ngx_test_null(conf.args,
-                  ngx_create_array(cycle->pool, 10, sizeof(ngx_str_t)),
-                  NGX_ERROR);
-
-    ngx_test_null(ngx_conf_ctx,
-                  ngx_pcalloc(cycle->pool, ngx_max_module * sizeof(void *)),
-                  NGX_ERROR);
-
-    conf.ctx = ngx_conf_ctx;
-    conf.pool = cycle->pool;
-    conf.log = cycle->log;
-    conf.module_type = NGX_CORE_MODULE;
-    conf.cmd_type = NGX_MAIN_CONF;
-
-    conf_file.len = sizeof(NGINX_CONF) - 1;
-    conf_file.data = NGINX_CONF;
-
-    if (ngx_conf_parse(&conf, &conf_file) != NGX_CONF_OK) {
-        return NGX_ERROR;
-    }
-
-    return NGX_OK;
-}
-
-
-#endif
 
 static int ngx_open_listening_sockets(ngx_log_t *log)
 {
index d82d239e0afdba7af4d3fb75acd8a8d60db32c6e..e841374720ea6bdef0e1e3b7e2671c7ee0fdb352 100644 (file)
@@ -83,7 +83,9 @@ typedef struct {
     ngx_pool_t   *pool;
     ngx_log_t    *log;
     ngx_array_t   listening;
-    ngx_array_t   files;
+    ngx_array_t   open_files;
+
+    unsigned      one_process:1;
 } ngx_cycle_t;
 
 
@@ -95,6 +97,7 @@ struct ngx_conf_s {
     char                 *name;
     ngx_array_t          *args;
 
+    ngx_cycle_t          *cycle;
     ngx_pool_t           *pool;
     ngx_conf_file_t      *conf_file;
     ngx_log_t            *log;
index 0dbcde64d754c5ae5f605e34983b6b5235db4ae0..50655abf45c358d54a52493e84f483b4644b4d83 100644 (file)
@@ -6,7 +6,7 @@
 extern ngx_module_t  ngx_errlog_module;
 
 extern ngx_module_t  ngx_events_module;
-extern ngx_module_t  ngx_event_module;
+extern ngx_module_t  ngx_event_core_module;
 extern ngx_module_t  ngx_select_module;
 #if (HAVE_POLL)
 extern ngx_module_t  ngx_poll_module;
@@ -51,7 +51,7 @@ ngx_module_t *ngx_modules[] = {
     /* events */
 
     &ngx_events_module,
-    &ngx_event_module,
+    &ngx_event_core_module,
 
     &ngx_select_module,
 #if (HAVE_POLL)
index 036194bdee74c1b2803ae79a5cd3b6244e99940e..73ed43a958679984788c11c5940ad4806fdc8dad 100644 (file)
@@ -18,8 +18,6 @@ typedef struct {
 
 #if (WIN32)
 
-#define ngx_memzero               ZeroMemory
-
 #define ngx_strncasecmp           strnicmp
 #define ngx_strcasecmp            stricmp
 #define ngx_strncmp               strncmp
@@ -32,8 +30,6 @@ typedef struct {
 
 #else
 
-#define ngx_memzero               bzero
-
 #define ngx_strncasecmp           strncasecmp
 #define ngx_strcasecmp            strcasecmp
 #define ngx_strncmp               strncmp
@@ -46,9 +42,19 @@ typedef struct {
 
 #endif
 
+/*
+ * msvc and icc compile memset() to inline "rep stos"
+ * while ZeroMemory and bzero are calls.
+ */
+#define ngx_memzero(buf, n)       memset(buf, n, 0)
+
+/* msvc and icc compile memcpy() to inline "rep movs" */
 #define ngx_memcpy(dst, src, n)   memcpy(dst, src, n)
 #define ngx_cpymem(dst, src, n)   ((char *) memcpy(dst, src, n)) + n
 
+/* msvc and icc compile memcmp() to inline loop */
+#define ngx_memcmp                memcmp
+
 char *ngx_cpystrn(char *dst, char *src, size_t n);
 int ngx_rstrncmp(char *s1, char *s2, size_t n);
 int ngx_atoi(char *line, size_t n);
index a49afea9705d886747aad724094967c183d02cdd..b03ed1745f814bbff98a40acdb4192f6de613146 100644 (file)
@@ -58,7 +58,7 @@ static int ngx_poll_init(ngx_log_t *log)
 {
     ngx_event_conf_t  *ecf;
 
-    ecf = ngx_event_get_conf(ngx_event_module);
+    ecf = ngx_event_get_conf(ngx_event_core_module);
 
     ngx_test_null(event_list,
                   ngx_alloc(sizeof(struct pollfd) * ecf->connections, log),
index 96a5d678eda62e96867898fef4616074ed61bc1f..a55be3034c469c6b705236d3bd6464666298c805 100644 (file)
@@ -70,7 +70,7 @@ static int ngx_select_init(ngx_log_t *log)
 {
     ngx_event_conf_t  *ecf;
 
-    ecf = ngx_event_get_conf(ngx_event_module);
+    ecf = ngx_event_get_conf(ngx_event_core_module);
 
     FD_ZERO(&master_read_fd_set);
     FD_ZERO(&master_write_fd_set);
@@ -376,7 +376,7 @@ static char *ngx_select_init_conf(ngx_pool_t *pool, void *conf)
 {
     ngx_event_conf_t  *ecf;
 
-    ecf = ngx_event_get_conf(ngx_event_module);
+    ecf = ngx_event_get_conf(ngx_event_core_module);
 
     /* the default FD_SETSIZE is 1024U in FreeBSD 5.x */
 
index f6d10cc4b9c60b5ebabeb373a61319b71518a1c4..263d88e3634d1e7a506f1a3f842f51fe7319aaa7 100644 (file)
@@ -65,9 +65,9 @@ ngx_module_t  ngx_events_module = {
 };
 
 
-static ngx_str_t  event_name = ngx_string("event");
+static ngx_str_t  event_core_name = ngx_string("event_core");
 
-static ngx_command_t  ngx_event_commands[] = {
+static ngx_command_t  ngx_event_core_commands[] = {
 
     {ngx_string("connections"),
      NGX_EVENT_CONF|NGX_CONF_TAKE1,
@@ -94,8 +94,8 @@ static ngx_command_t  ngx_event_commands[] = {
 };
 
 
-ngx_event_module_t  ngx_event_module_ctx = {
-    &event_name,
+ngx_event_module_t  ngx_event_core_module_ctx = {
+    &event_core_name,
     ngx_event_create_conf,                 /* create configuration */
     ngx_event_init_conf,                   /* init configuration */
 
@@ -103,10 +103,10 @@ ngx_event_module_t  ngx_event_module_ctx = {
 };
 
 
-ngx_module_t  ngx_event_module = {
+ngx_module_t  ngx_event_core_module = {
     NGX_MODULE,
-    &ngx_event_module_ctx,                 /* module context */
-    ngx_event_commands,                    /* module directives */
+    &ngx_event_core_module_ctx,            /* module context */
+    ngx_event_core_commands,               /* module directives */
     NGX_EVENT_MODULE,                      /* module type */
     NULL                                   /* init module */
 };
@@ -125,7 +125,7 @@ int ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log)
     ngx_iocp_conf_t     *iocpcf;
 #endif
 
-    ecf = ngx_event_get_conf(ngx_event_module);
+    ecf = ngx_event_get_conf(ngx_event_core_module);
 
 ngx_log_debug(log, "CONN: %d" _ ecf->connections);
 ngx_log_debug(log, "TYPE: %d" _ ecf->use);
index 9b6dd23996e024baba9b6c131751fb5c09854187..8ae2b5385af9fa1e03727fc0f0ceda474f8be4e6 100644 (file)
@@ -345,7 +345,7 @@ typedef struct {
 
 
 extern ngx_module_t        ngx_events_module;
-extern ngx_module_t        ngx_event_module;
+extern ngx_module_t        ngx_event_core_module;
 
 
 #define ngx_event_get_conf(module)                                           \
index 7e877617fdba3726c764c5b0ab9082f94d0831bf..2d2eed4f412332dc5fd092a2d1a4af1ba0832688 100644 (file)
@@ -17,7 +17,7 @@ void ngx_event_accept(ngx_event_t *ev)
     ngx_connection_t  *c, *ls;
     ngx_event_conf_t  *ecf;
 
-    ecf = ngx_event_get_conf(ngx_event_module);
+    ecf = ngx_event_get_conf(ngx_event_core_module);
 
     ls = ev->data;
 
index a49cc92608c04675031e1cba3bb09178f38165ae..9ca3fe504ad76344f040734533d2ac1a37078b6a 100644 (file)
@@ -15,7 +15,7 @@ int ngx_event_timer_init(ngx_log_t *log)
     ngx_event_t       *new_queue;
     ngx_event_conf_t  *ecf;
 
-    ecf = ngx_event_get_conf(ngx_event_module);
+    ecf = ngx_event_get_conf(ngx_event_core_module);
 
     if (ngx_timer_queue_num < ecf->timer_queues) {
         ngx_test_null(new_queue,
index b156966dcd075505b84ef9cdf6fdb4e034523b9e..e29241b576c38986a48952bb58aed37e527badc7 100644 (file)
@@ -83,7 +83,8 @@ int ngx_crc(char *data, size_t len)
 
     for (sum = 0; len; len--) {
         /*
-         * gcc 2.95.2 x86 compiles that operator into the single rol opcode.
+         * gcc 2.95.2 x86 and icc 7.1.006 compile that operator
+         * into the single rol opcode.
          * msvc 6.0sp2 compiles it into four opcodes.
          */
         sum = sum >> 1 | sum << 31;
index 30c1b9315919ff886ba14c3fa5bd3996b4f1b73e..3a9487c06d05f009d6833b54e9c15654a05345da 100644 (file)
@@ -34,7 +34,7 @@ int ngx_strerror_r(ngx_err_t err, char *errstr, size_t size)
     ngx_err_t  format_error;
 
     len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
-                        | FORMAT_MESSAGE_IGNORE_INSERTS,
+                        |FORMAT_MESSAGE_IGNORE_INSERTS,
                         NULL, err,
                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                         errstr, size, NULL);
index 6bc69e4c94f58966132fdeb9d524e3d9313f6c4a..c522c9e95b46eaffe2d25da45b72e3291e074e37 100644 (file)
@@ -77,20 +77,34 @@ int ngx_os_init(ngx_log_t *log)
                              + osvi.wServicePackMinor;
 
         ngx_log_error(NGX_LOG_INFO, log, 0,
-                      "OS: %u build:%u, %s, suite:%x, type:%u",
+                      "OS: %u build:%u, \"%s\", suite:%x, type:%u",
                       ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion,
                       osvi.wReserved[0], osvi.wReserved[1]);
 
 #if 0
         ngx_log_error(NGX_LOG_INFO, log, 0,
-                      "OS: %u build:%u, %s, suite:%x, type:%u",
+                      "OS: %u build:%u, \"%s\", suite:%x, type:%u",
                       ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion,
                       osvi.wSuiteMask, osvi.wProductType);
 #endif
 
     } else {
-        ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u, %s",
-                      ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion);
+        if (osvi.dwPlatformId == 1) {
+
+            /* Win9x build */
+
+            ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u.%u.%u, \"%s\"",
+                          ngx_win32_version,
+                          osvi.dwBuildNumber >> 24,
+                          (osvi.dwBuildNumber >> 16) & 0xff,
+                          osvi.dwBuildNumber & 0xffff,
+                          osvi.szCSDVersion);
+
+        } else {
+            ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u, \"%s\"",
+                          ngx_win32_version, osvi.dwBuildNumber,
+                          osvi.szCSDVersion);
+        }
     }