summaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2009-06-15 09:48:15 +0000
committerIgor Sysoev <igor@sysoev.ru>2009-06-15 09:48:15 +0000
commitd8615fb29018da7ecb428506204af81b55b46b84 (patch)
tree53868e9ef5e13b810f70be3d724a9adc2309e419 /src/core
parent47246d6a1d65bb11c6db7d074ed8d317813ccfdb (diff)
downloadnginx-d8615fb29018da7ecb428506204af81b55b46b84.tar.gz
nginx-d8615fb29018da7ecb428506204af81b55b46b84.tar.bz2
merge r2897, r2898, r2899, r2901, r2902, r2904, r2905, r2906, r2907,
r2909, r2910, r2922, r2923, r2924, r2925, r2929: various win32 fixes: *) use no-threads for Unix builds only *) Win32 returns ERROR_PATH_NOT_FOUND instead of ERROR_FILE_NOT_FOUND *) add trailing zero to a file name in ngx_win32_rename_file() *) fix logging in ngx_win32_rename_file() *) allow shared memory segments more than 4G *) fix memory leak in successful case *) log shared memory name in failure case *) test that zone has the same addresses in different processes *) add drive letter for Win32 root path *) log GetExitCodeProcess()'s errno *) test premature process termination *) fix debug logging *) exit if no workers could not be started *) do not quit old workers if no new workers could not be started *) a signaller process should stop configuration processing just after it is able to get pid file, this allows to not open log files, etc. *) win32 master process had aready closed listening sockets
Diffstat (limited to 'src/core')
-rw-r--r--src/core/nginx.c8
-rw-r--r--src/core/ngx_conf_file.c95
-rw-r--r--src/core/ngx_connection.c2
-rw-r--r--src/core/ngx_cycle.c39
-rw-r--r--src/core/ngx_file.c10
-rw-r--r--src/core/ngx_slab.h1
6 files changed, 111 insertions, 44 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c
index eec48bfa7..ff7a9f848 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -330,6 +330,10 @@ main(int argc, char *const *argv)
return 0;
}
+ if (ngx_signal) {
+ return ngx_signal_process(cycle, ngx_signal);
+ }
+
ngx_os_status(cycle->log);
ngx_cycle = cycle;
@@ -340,10 +344,6 @@ main(int argc, char *const *argv)
ngx_process = NGX_PROCESS_MASTER;
}
- if (ngx_signal) {
- return ngx_signal_process(cycle, ngx_signal);
- }
-
#if !(NGX_WIN32)
if (ngx_init_signals(cycle->log) != NGX_OK) {
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
index 1f6b1f732..c58d8095f 100644
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -12,6 +12,7 @@
static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last);
static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf);
static char *ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+static ngx_int_t ngx_conf_test_full_name(ngx_str_t *name);
static void ngx_conf_flush_files(ngx_cycle_t *cycle);
@@ -802,29 +803,15 @@ ngx_int_t
ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, ngx_uint_t conf_prefix)
{
size_t len;
- u_char *p, *prefix;
- ngx_str_t old;
+ u_char *p, *n, *prefix;
+ ngx_int_t rc;
-#if (NGX_WIN32)
+ rc = ngx_conf_test_full_name(name);
- 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;
+ if (rc == NGX_OK) {
+ return rc;
}
-#else
-
- if (name->data[0] == '/') {
- return NGX_OK;
- }
-
-#endif
-
- old = *name;
-
if (conf_prefix) {
len = cycle->conf_prefix.len;
prefix = cycle->conf_prefix.data;
@@ -834,19 +821,79 @@ ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, ngx_uint_t conf_prefix)
prefix = cycle->prefix.data;
}
- name->len = len + old.len;
- name->data = ngx_pnalloc(cycle->pool, name->len + 1);
- if (name->data == NULL) {
+#if (NGX_WIN32)
+
+ if (rc == 2) {
+ len = rc;
+ }
+
+#endif
+
+ n = ngx_pnalloc(cycle->pool, len + name->len + 1);
+ if (n == NULL) {
return NGX_ERROR;
}
- p = ngx_cpymem(name->data, prefix, len);
- ngx_cpystrn(p, old.data, old.len + 1);
+ p = ngx_cpymem(n, prefix, len);
+ ngx_cpystrn(p, name->data, name->len + 1);
+
+ name->len += len;
+ name->data = n;
return NGX_OK;
}
+static ngx_int_t
+ngx_conf_test_full_name(ngx_str_t *name)
+{
+#if (NGX_WIN32)
+ u_char c0, c1;
+
+ c0 = name->data[0];
+
+ if (name->len < 2) {
+ if (c0 == '/') {
+ return 2;
+ }
+
+ return NGX_DECLINED;
+ }
+
+ c1 = name->data[1];
+
+ if (c1 == ':') {
+ c0 |= 0x20;
+
+ if ((c0 >= 'a' && c0 <= 'z')) {
+ return NGX_OK;
+ }
+
+ return NGX_DECLINED;
+ }
+
+ if (c1 == '/') {
+ return NGX_OK;
+ }
+
+ if (c0 == '/') {
+ return 2;
+ }
+
+ return NGX_DECLINED;
+
+#else
+
+ if (name->data[0] == '/') {
+ return NGX_OK;
+ }
+
+ return NGX_DECLINED;
+
+#endif
+}
+
+
ngx_open_file_t *
ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name)
{
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
index d4bb0648a..0a7fe847d 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -603,6 +603,8 @@ ngx_close_listening_sockets(ngx_cycle_t *cycle)
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
ngx_close_socket_n " %V failed", &ls[i].addr_text);
}
+
+ ls[i].fd = (ngx_socket_t) -1;
}
}
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index fc65765b0..1e846f85d 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -269,7 +269,6 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
cycle->conf_file.data);
}
-
for (i = 0; ngx_modules[i]; i++) {
if (ngx_modules[i]->type != NGX_CORE_MODULE) {
continue;
@@ -287,6 +286,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
}
}
+ if (ngx_process == NGX_PROCESS_SIGNALLER) {
+ return cycle;
+ }
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
@@ -463,11 +465,8 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
goto failed;
}
- if (!shm_zone[i].shm.exists) {
-
- if (ngx_init_zone_pool(cycle, &shm_zone[i]) != NGX_OK) {
- goto failed;
- }
+ if (ngx_init_zone_pool(cycle, &shm_zone[i]) != NGX_OK) {
+ goto failed;
}
if (shm_zone[i].init(&shm_zone[i], NULL) != NGX_OK) {
@@ -567,14 +566,12 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
}
}
- if (ngx_process != NGX_PROCESS_SIGNALLER) {
- if (ngx_open_listening_sockets(cycle) != NGX_OK) {
- goto failed;
- }
+ if (ngx_open_listening_sockets(cycle) != NGX_OK) {
+ goto failed;
+ }
- if (!ngx_test_config) {
- ngx_configure_listening_sockets(cycle);
- }
+ if (!ngx_test_config) {
+ ngx_configure_listening_sockets(cycle);
}
@@ -656,7 +653,8 @@ old_shm_zone_done:
ls = old_cycle->listening.elts;
for (i = 0; i < old_cycle->listening.nelts; i++) {
- if (ls[i].remain) {
+
+ if (ls[i].remain || ls[i].fd == -1) {
continue;
}
@@ -885,8 +883,21 @@ ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
sp = (ngx_slab_pool_t *) zn->shm.addr;
+ if (zn->shm.exists) {
+
+ if (sp == sp->addr) {
+ return NGX_OK;
+ }
+
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
+ "shared zone \"%V\" has no equal addresses: %p vs %p",
+ &zn->shm.name, sp->addr, sp);
+ return NGX_ERROR;
+ }
+
sp->end = zn->shm.addr + zn->shm.size;
sp->min_shift = 3;
+ sp->addr = zn->shm.addr;
#if (NGX_HAVE_ATOMIC_OPS)
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
index 450da5623..3f47fc98b 100644
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -558,8 +558,14 @@ ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, ngx_ext_rename_file_t *ext)
err = ngx_errno;
- if (err == NGX_ENOENT) {
-
+ if (err
+#if (NGX_WIN32)
+ == ERROR_PATH_NOT_FOUND
+#else
+ == NGX_ENOENT
+#endif
+ )
+ {
if (!ext->create_path) {
goto failed;
}
diff --git a/src/core/ngx_slab.h b/src/core/ngx_slab.h
index 89c4687f6..291e1b51e 100644
--- a/src/core/ngx_slab.h
+++ b/src/core/ngx_slab.h
@@ -39,6 +39,7 @@ typedef struct {
u_char zero;
void *data;
+ void *addr;
} ngx_slab_pool_t;