diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2009-06-15 09:48:15 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2009-06-15 09:48:15 +0000 |
| commit | d8615fb29018da7ecb428506204af81b55b46b84 (patch) | |
| tree | 53868e9ef5e13b810f70be3d724a9adc2309e419 /src/core | |
| parent | 47246d6a1d65bb11c6db7d074ed8d317813ccfdb (diff) | |
| download | nginx-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.c | 8 | ||||
| -rw-r--r-- | src/core/ngx_conf_file.c | 95 | ||||
| -rw-r--r-- | src/core/ngx_connection.c | 2 | ||||
| -rw-r--r-- | src/core/ngx_cycle.c | 39 | ||||
| -rw-r--r-- | src/core/ngx_file.c | 10 | ||||
| -rw-r--r-- | src/core/ngx_slab.h | 1 |
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; |
