Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-07-01 19:00:03 +0400
committerIgor Sysoev <igor@sysoev.ru>2003-07-01 19:00:03 +0400
commit6abfde65573d145325a908417d5301d4766c6af8 (patch)
treea1ac279536b8830a41dcbde437af0ac054f3050b /src
parentf5e97c5cbe063246087f11f36fa04c48e8dba10a (diff)
nginx-0.0.1-2003-07-01-19:00:03 import
Diffstat (limited to 'src')
-rw-r--r--src/core/nginx.c352
-rw-r--r--src/core/ngx_conf_file.h5
-rw-r--r--src/core/ngx_modules.c4
-rw-r--r--src/core/ngx_string.h14
-rw-r--r--src/event/modules/ngx_poll_module.c2
-rw-r--r--src/event/modules/ngx_select_module.c4
-rw-r--r--src/event/ngx_event.c16
-rw-r--r--src/event/ngx_event.h2
-rw-r--r--src/event/ngx_event_accept.c2
-rw-r--r--src/event/ngx_event_timer.c2
-rw-r--r--src/http/ngx_http_cache.c3
-rw-r--r--src/os/win32/ngx_errno.c2
-rw-r--r--src/os/win32/ngx_win32_init.c22
13 files changed, 351 insertions, 79 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 338f98a75..b96739321 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -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)
{
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index d82d239e0..e84137472 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -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;
diff --git a/src/core/ngx_modules.c b/src/core/ngx_modules.c
index 0dbcde64d..50655abf4 100644
--- a/src/core/ngx_modules.c
+++ b/src/core/ngx_modules.c
@@ -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)
diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h
index 036194bde..73ed43a95 100644
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -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);
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index a49afea97..b03ed1745 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -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),
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 96a5d678e..a55be3034 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -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 */
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index f6d10cc4b..263d88e36 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -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);
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 9b6dd2399..8ae2b5385 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -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) \
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index 7e877617f..2d2eed4f4 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -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;
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index a49cc9260..9ca3fe504 100644
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -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,
diff --git a/src/http/ngx_http_cache.c b/src/http/ngx_http_cache.c
index b156966dc..e29241b57 100644
--- a/src/http/ngx_http_cache.c
+++ b/src/http/ngx_http_cache.c
@@ -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;
diff --git a/src/os/win32/ngx_errno.c b/src/os/win32/ngx_errno.c
index 30c1b9315..3a9487c06 100644
--- a/src/os/win32/ngx_errno.c
+++ b/src/os/win32/ngx_errno.c
@@ -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);
diff --git a/src/os/win32/ngx_win32_init.c b/src/os/win32/ngx_win32_init.c
index 6bc69e4c9..c522c9e95 100644
--- a/src/os/win32/ngx_win32_init.c
+++ b/src/os/win32/ngx_win32_init.c
@@ -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);
+ }
}