# HG changeset patch # User Igor Sysoev # Date 1185739200 -14400 # Node ID f7cd062ee035392cb44b3ec340d31f94ce4d83de # Parent 7e977a664d91b93a9e7818d69087931d32da18c4 nginx 0.6.6 *) Feature: the --sysconfdir=PATH option in configure. *) Feature: named locations. *) Feature: the $args variable can be set with the "set" directive. *) Feature: the $is_args variable. *) Bugfix: fair big weight upstream balancer. *) Bugfix: if a client has closed connection to mail proxy then nginx might not close connection to backend. *) Bugfix: if the same host without specified port was used as backend for HTTP and HTTPS, then nginx used only one port - 80 or 443. *) Bugfix: fix building on Solaris/amd64 by Sun Studio 11 and early versions; bug appeared in 0.6.4. diff --git a/CHANGES b/CHANGES --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,26 @@ +Changes with nginx 0.6.6 30 Jul 2007 + + *) Feature: the --sysconfdir=PATH option in configure. + + *) Feature: named locations. + + *) Feature: the $args variable can be set with the "set" directive. + + *) Feature: the $is_args variable. + + *) Bugfix: fair big weight upstream balancer. + + *) Bugfix: if a client has closed connection to mail proxy then nginx + might not close connection to backend. + + *) Bugfix: if the same host without specified port was used as backend + for HTTP and HTTPS, then nginx used only one port - 80 or 443. + + *) Bugfix: fix building on Solaris/amd64 by Sun Studio 11 and early + versions; bug appeared in 0.6.4. + + Changes with nginx 0.6.5 23 Jul 2007 *) Feature: $nginx_version variable. diff --git a/CHANGES.ru b/CHANGES.ru --- a/CHANGES.ru +++ b/CHANGES.ru @@ -1,4 +1,28 @@ +Изменения в nginx 0.6.6 30.07.2007 + + *) Добавление: параметр --sysconfdir=PATH в configure. + + *) Добавление: именованные location'ы. + + *) Добавление: переменную $args можно устанавливать с помощью set. + + *) Добавление: переменная $is_args. + + *) Исправление: равномерное распределение запросов к апстримам с + большими весами. + + *) Исправление: если клиент в почтовом прокси-сервере закрывал + соединение, то nginx мог не закрывать соединение с бэкендом. + + *) Исправление: при использовании одного хоста в качестве бэкендов для + протоколов HTTP и HTTPS без явного указания портов, nginx + использовал только один порт - 80 или 443. + + *) Исправление: nginx не собирался на Solaris/amd64 Sun Studio 11 и + более ранними версиями; ошибка появилась в 0.6.4. + + Изменения в nginx 0.6.5 23.07.2007 *) Добавление: переменная $nginx_version. diff --git a/auto/cc/sunc b/auto/cc/sunc --- a/auto/cc/sunc +++ b/auto/cc/sunc @@ -39,7 +39,7 @@ if [ "$ngx_sunc_ver" -ge 1424 ]; then else ngx_sparc32="-xarch=v8plus" ngx_sparc64="-xarch=v9" - ngx_amd64="-amd64" + ngx_amd64="-xarch=amd64" fi case "$NGX_MACHINE" in diff --git a/auto/install b/auto/install --- a/auto/install +++ b/auto/install @@ -26,19 +26,22 @@ install: $NGX_OBJS${ngx_dirsep}nginx${ng test ! -f '$NGX_SBIN_PATH' || mv '$NGX_SBIN_PATH' '$NGX_SBIN_PATH.old' cp $NGX_OBJS/nginx '$NGX_SBIN_PATH' - test -d '`dirname "$NGX_CONF_PATH"`' \ - || mkdir -p '`dirname "$NGX_CONF_PATH"`' + test -d '$NGX_CONF_PREFIX' || mkdir -p '$NGX_CONF_PREFIX' - cp conf/koi-win '`dirname "$NGX_CONF_PATH"`' - cp conf/koi-utf '`dirname "$NGX_CONF_PATH"`' - cp conf/win-utf '`dirname "$NGX_CONF_PATH"`' + cp conf/koi-win '$NGX_CONF_PREFIX' + cp conf/koi-utf '$NGX_CONF_PREFIX' + cp conf/win-utf '$NGX_CONF_PREFIX' - test -f '`dirname "$NGX_CONF_PATH"`/mime.types' || \ - cp conf/mime.types '`dirname "$NGX_CONF_PATH"`/mime.types' - cp conf/mime.types '`dirname "$NGX_CONF_PATH"`/mime.types.default' + test -f '$NGX_CONF_PREFIX/mime.types' \ + || cp conf/mime.types '$NGX_CONF_PREFIX' + cp conf/mime.types '$NGX_CONF_PATH/mime.types.default' - test -f '$NGX_CONF_PATH' || cp conf/nginx.conf '$NGX_CONF_PATH' - cp conf/nginx.conf '`dirname "$NGX_CONF_PATH"`/nginx.conf.default' + test -f '$NGX_CONF_PREFIX/fastcgi_params' \ + || cp conf/fastcgi_params '$NGX_CONF_PREFIX' + cp conf/fastcgi_params '$NGX_CONF_PATH/fastcgi_params.default' + + test -f '$NGX_CONF_PATH' || cp conf/nginx.conf '$NGX_CONF_PREFIX' + cp conf/nginx.conf '$NGX_CONF_PREFIX/nginx.conf.default' test -d '`dirname "$NGX_PID_PATH"`' \ || mkdir -p '`dirname "$NGX_PID_PATH"`' diff --git a/auto/options b/auto/options --- a/auto/options +++ b/auto/options @@ -6,6 +6,7 @@ help=no NGX_PREFIX= NGX_SBIN_PATH= +NGX_CONF_PREFIX= NGX_CONF_PATH= NGX_ERROR_LOG_PATH= NGX_PID_PATH= @@ -123,6 +124,7 @@ do --prefix=*) NGX_PREFIX="$value" ;; --sbin-path=*) NGX_SBIN_PATH="$value" ;; + --sysconfdir=*) NGX_CONF_PREFIX="$value" ;; --conf-path=*) NGX_CONF_PATH="$value" ;; --error-log-path=*) NGX_ERROR_LOG_PATH="$value";; --pid-path=*) NGX_PID_PATH="$value" ;; @@ -240,6 +242,7 @@ cat << END --prefix=PATH set the installation prefix --sbin-path=PATH set path to the nginx binary file + --sysconfdir=PATH set the configuration prefix --conf-path=PATH set path to the nginx.conf file --error-log-path=PATH set path to the error log --pid-path=PATH set path to nginx.pid file @@ -360,6 +363,7 @@ fi NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx} +NGX_CONF_PREFIX=${NGX_CONF_PREFIX:-$NGX_PREFIX} case ".$NGX_SBIN_PATH" in @@ -381,11 +385,11 @@ case ".$NGX_CONF_PATH" in ;; .) - NGX_CONF_PATH=$NGX_PREFIX/conf/nginx.conf + NGX_CONF_PATH=$NGX_CONF_PREFIX/conf/nginx.conf ;; *) - NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH + NGX_CONF_PATH=$NGX_CONF_PREFIX/$NGX_CONF_PATH ;; esac diff --git a/auto/summary b/auto/summary --- a/auto/summary +++ b/auto/summary @@ -148,6 +148,7 @@ fi cat << END nginx path prefix: "$NGX_PREFIX" nginx binary file: "$NGX_SBIN_PATH" + nginx configuration prefix: "$NGX_CONF_PREFIX" nginx configuration file: "$NGX_CONF_PATH" nginx pid file: "$NGX_PID_PATH" END diff --git a/auto/types/uintptr_t b/auto/types/uintptr_t --- a/auto/types/uintptr_t +++ b/auto/types/uintptr_t @@ -36,5 +36,6 @@ if [ $found = no ]; then found="uint`expr 8 \* $ngx_ptr_size`_t" echo ", $found used" - echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H + echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H + echo "typedef $found intptr_t;" | sed -e 's/u//g' >> $NGX_AUTO_CONFIG_H fi diff --git a/configure b/configure --- a/configure +++ b/configure @@ -67,6 +67,7 @@ fi have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define +have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define diff --git a/src/core/nginx.c b/src/core/nginx.c --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -656,7 +656,7 @@ ngx_getopt(ngx_cycle_t *cycle, int argc, cycle->conf_file.data = (u_char *) NGX_CONF_PATH; } - if (ngx_conf_full_name(cycle, &cycle->conf_file) == NGX_ERROR) { + if (ngx_conf_full_name(cycle, &cycle->conf_file, 1) == NGX_ERROR) { return NGX_ERROR; } @@ -826,7 +826,7 @@ ngx_core_module_init_conf(ngx_cycle_t *c ccf->pid.data = (u_char *) NGX_PID_PATH; } - if (ngx_conf_full_name(cycle, &ccf->pid) == NGX_ERROR) { + if (ngx_conf_full_name(cycle, &ccf->pid, 0) == NGX_ERROR) { return NGX_CONF_ERROR; } @@ -846,7 +846,7 @@ ngx_core_module_init_conf(ngx_cycle_t *c ccf->lock_file.data = (u_char *) NGX_LOCK_PATH; } - if (ngx_conf_full_name(cycle, &ccf->lock_file) == NGX_ERROR) { + if (ngx_conf_full_name(cycle, &ccf->lock_file, 0) == NGX_ERROR) { return NGX_CONF_ERROR; } diff --git a/src/core/nginx.h b/src/core/nginx.h --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -8,7 +8,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VERSION "0.6.5" +#define NGINX_VERSION "0.6.6" #define NGINX_VER "nginx/" NGINX_VERSION #define NGINX_VAR "NGINX" diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c --- a/src/core/ngx_conf_file.c +++ b/src/core/ngx_conf_file.c @@ -641,7 +641,7 @@ ngx_conf_include(ngx_conf_t *cf, ngx_com ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - if (ngx_conf_full_name(cf->cycle, &file) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, &file, 1) == NGX_ERROR) { return NGX_CONF_ERROR; } @@ -681,9 +681,10 @@ ngx_conf_include(ngx_conf_t *cf, ngx_com ngx_int_t -ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name) +ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, ngx_uint_t conf_prefix) { - u_char *p; + size_t len; + u_char *p, *prefix; ngx_str_t old; if (name->data[0] == '/') { @@ -704,14 +705,22 @@ ngx_conf_full_name(ngx_cycle_t *cycle, n old = *name; - name->len = cycle->root.len + old.len; + if (conf_prefix) { + len = sizeof(NGX_CONF_PREFIX) - 1; + prefix = (u_char *) NGX_CONF_PREFIX; + } else { + len = cycle->root.len; + prefix = cycle->root.data; + } + + name->len = len + old.len; name->data = ngx_palloc(cycle->pool, name->len + 1); if (name->data == NULL) { return NGX_ERROR; } - p = ngx_cpymem(name->data, cycle->root.data, cycle->root.len), + p = ngx_cpymem(name->data, prefix, len); ngx_cpystrn(p, old.data, old.len + 1); return NGX_OK; @@ -734,7 +743,7 @@ ngx_conf_open_file(ngx_cycle_t *cycle, n if (name) { full = *name; - if (ngx_conf_full_name(cycle, &full) == NGX_ERROR) { + if (ngx_conf_full_name(cycle, &full, 0) == NGX_ERROR) { return NULL; } diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h --- a/src/core/ngx_conf_file.h +++ b/src/core/ngx_conf_file.h @@ -320,7 +320,8 @@ char *ngx_conf_check_num_bounds(ngx_conf char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename); -ngx_int_t ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name); +ngx_int_t ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, + ngx_uint_t conf_prefix); ngx_open_file_t *ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name); void ngx_cdecl ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err, char *fmt, ...); diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h --- a/src/core/ngx_config.h +++ b/src/core/ngx_config.h @@ -70,31 +70,20 @@ #endif - - -/* TODO: platform specific: array[NGX_INVALID_ARRAY_INDEX] must cause SIGSEGV */ -#define NGX_INVALID_ARRAY_INDEX 0x80000000 - +typedef intptr_t ngx_int_t; +typedef uintptr_t ngx_uint_t; +typedef intptr_t ngx_flag_t; -#if 1 -/* STUB: autoconf */ -typedef int ngx_int_t; -typedef u_int ngx_uint_t; -typedef int ngx_flag_t; -#define NGX_INT_T_LEN sizeof("-2147483648") - 1 - -#else - -typedef long ngx_int_t; -typedef u_long ngx_uint_t; -typedef long ngx_flag_t; -#define NGX_INT_T_LEN sizeof("-9223372036854775808") - 1 - -#endif #define NGX_INT32_LEN sizeof("-2147483648") - 1 #define NGX_INT64_LEN sizeof("-9223372036854775808") - 1 +#if (NGX_PTR_SIZE == 4) +#define NGX_INT_T_LEN NGX_INT32_LEN +#else +#define NGX_INT_T_LEN NGX_INT64_LEN +#endif + #ifndef NGX_ALIGNMENT #define NGX_ALIGNMENT sizeof(unsigned long) /* platform word */ @@ -108,6 +97,10 @@ typedef long ngx_flag_t; #define ngx_abort abort +/* TODO: platform specific: array[NGX_INVALID_ARRAY_INDEX] must cause SIGSEGV */ +#define NGX_INVALID_ARRAY_INDEX 0x80000000 + + /* TODO: auto_conf: ngx_inline inline __inline __inline__ */ #ifndef ngx_inline #define ngx_inline inline diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c --- a/src/core/ngx_file.c +++ b/src/core/ngx_file.c @@ -260,7 +260,7 @@ ngx_conf_set_path_slot(ngx_conf_t *cf, n path->name.len--; } - if (ngx_conf_full_name(cf->cycle, &path->name) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, &path->name, 0) == NGX_ERROR) { return NULL; } diff --git a/src/core/ngx_file.h b/src/core/ngx_file.h --- a/src/core/ngx_file.h +++ b/src/core/ngx_file.h @@ -109,7 +109,7 @@ char *ngx_conf_set_access_slot(ngx_conf_ curr->name.len = sizeof(path) - 1; \ curr->name.data = (u_char *) path; \ \ - if (ngx_conf_full_name(cf->cycle, &curr->name) == NGX_ERROR) { \ + if (ngx_conf_full_name(cf->cycle, &curr->name, 0) == NGX_ERROR) { \ return NGX_CONF_ERROR; \ } \ \ diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c --- a/src/core/ngx_log.c +++ b/src/core/ngx_log.c @@ -333,7 +333,7 @@ ngx_set_error_log(ngx_conf_t *cf, ngx_co } else { cf->cycle->new_log->file->name = value[1]; - if (ngx_conf_full_name(cf->cycle, &cf->cycle->new_log->file->name) + if (ngx_conf_full_name(cf->cycle, &cf->cycle->new_log->file->name, 0) == NGX_ERROR) { return NGX_CONF_ERROR; diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c --- a/src/event/modules/ngx_aio_module.c +++ b/src/event/modules/ngx_aio_module.c @@ -16,9 +16,11 @@ static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_aio_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, u_int flags); +static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags); static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); @@ -100,21 +102,21 @@ ngx_aio_done(ngx_cycle_t *cycle) /* the event adding and deleting are needed for the listening sockets */ static ngx_int_t -ngx_aio_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { return ngx_kqueue_module_ctx.actions.add(ev, event, flags); } static ngx_int_t -ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { return ngx_kqueue_module_ctx.actions.del(ev, event, flags); } static ngx_int_t -ngx_aio_del_connection(ngx_connection_t *c, u_int flags) +ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags) { int rc; diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c @@ -13,8 +13,8 @@ /* Solaris declarations */ -#define POLLREMOVE 0x0800 -#define DP_POLL 0xD001 +#define POLLREMOVE 0x0800 +#define DP_POLL 0xD001 struct dvpoll { struct pollfd *dp_fds; @@ -26,16 +26,19 @@ struct dvpoll { typedef struct { - u_int changes; - u_int events; + ngx_uint_t changes; + ngx_uint_t events; } ngx_devpoll_conf_t; static ngx_int_t ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_devpoll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags); +static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); static ngx_int_t ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); @@ -44,7 +47,7 @@ static char *ngx_devpoll_init_conf(ngx_c static int dp = -1; static struct pollfd *change_list, *event_list; -static u_int nchanges, max_changes, nevents; +static ngx_uint_t nchanges, max_changes, nevents; static ngx_event_t **change_index; @@ -208,7 +211,7 @@ ngx_devpoll_done(ngx_cycle_t *cycle) static ngx_int_t -ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { #if (NGX_DEBUG) ngx_connection_t *c; @@ -221,7 +224,7 @@ ngx_devpoll_add_event(ngx_event_t *ev, i #if (NGX_DEBUG) c = ev->data; ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll add event: fd:%d ev:%04Xd", c->fd, event); + "devpoll add event: fd:%d ev:%04Xi", c->fd, event); #endif ev->active = 1; @@ -231,7 +234,7 @@ ngx_devpoll_add_event(ngx_event_t *ev, i static ngx_int_t -ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_event_t *e; ngx_connection_t *c; @@ -243,7 +246,7 @@ ngx_devpoll_del_event(ngx_event_t *ev, i #endif ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll del event: fd:%d ev:%04Xd", c->fd, event); + "devpoll del event: fd:%d ev:%04Xi", c->fd, event); if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) { return NGX_ERROR; @@ -275,7 +278,7 @@ ngx_devpoll_del_event(ngx_event_t *ev, i static ngx_int_t -ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags) +ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { size_t n; ngx_connection_t *c; @@ -283,7 +286,7 @@ ngx_devpoll_set_event(ngx_event_t *ev, i c = ev->data; ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll fd:%d ev:%04Xd fl:%04Xd", c->fd, event, flags); + "devpoll fd:%d ev:%04Xi fl:%04Xi", c->fd, event, flags); if (nchanges >= max_changes) { ngx_log_error(NGX_LOG_WARN, ev->log, 0, @@ -300,7 +303,7 @@ ngx_devpoll_set_event(ngx_event_t *ev, i } change_list[nchanges].fd = c->fd; - change_list[nchanges].events = event; + change_list[nchanges].events = (short) event; change_list[nchanges].revents = 0; change_index[nchanges] = ev; @@ -353,7 +356,7 @@ ngx_devpoll_process_events(ngx_cycle_t * } dvp.dp_fds = event_list; - dvp.dp_nfds = nevents; + dvp.dp_nfds = (int) nevents; dvp.dp_timeout = timer; events = ioctl(dp, DP_POLL, &dvp); diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c --- a/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c @@ -66,16 +66,19 @@ int epoll_wait(int epfd, struct epoll_ev typedef struct { - u_int events; + ngx_uint_t events; } ngx_epoll_conf_t; static ngx_int_t ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_epoll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags); +static ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); static ngx_int_t ngx_epoll_add_connection(ngx_connection_t *c); -static ngx_int_t ngx_epoll_del_connection(ngx_connection_t *c, u_int flags); +static ngx_int_t ngx_epoll_del_connection(ngx_connection_t *c, + ngx_uint_t flags); static ngx_int_t ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); @@ -84,7 +87,7 @@ static char *ngx_epoll_init_conf(ngx_cyc static int ep = -1; static struct epoll_event *event_list; -static u_int nevents; +static ngx_uint_t nevents; static ngx_str_t epoll_name = ngx_string("epoll"); @@ -205,7 +208,7 @@ ngx_epoll_done(ngx_cycle_t *cycle) static ngx_int_t -ngx_epoll_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { int op; uint32_t events, prev; @@ -240,7 +243,7 @@ ngx_epoll_add_event(ngx_event_t *ev, int op = EPOLL_CTL_ADD; } - ee.events = events | flags; + ee.events = events | (uint32_t) flags; ee.data.ptr = (void *) ((uintptr_t) c | ev->instance); ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, @@ -263,7 +266,7 @@ ngx_epoll_add_event(ngx_event_t *ev, int static ngx_int_t -ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { int op; uint32_t prev; @@ -295,7 +298,7 @@ ngx_epoll_del_event(ngx_event_t *ev, int if (e->active) { op = EPOLL_CTL_MOD; - ee.events = prev | flags; + ee.events = prev | (uint32_t) flags; ee.data.ptr = (void *) ((uintptr_t) c | ev->instance); } else { @@ -345,10 +348,10 @@ ngx_epoll_add_connection(ngx_connection_ static ngx_int_t -ngx_epoll_del_connection(ngx_connection_t *c, u_int flags) +ngx_epoll_del_connection(ngx_connection_t *c, ngx_uint_t flags) { - int op; - struct epoll_event ee; + int op; + struct epoll_event ee; /* * when the file descriptor is closed the epoll automatically deletes @@ -399,7 +402,7 @@ ngx_epoll_process_events(ngx_cycle_t *cy ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll timer: %M", timer); - events = epoll_wait(ep, event_list, nevents, timer); + events = epoll_wait(ep, event_list, (int) nevents, timer); if (events == -1) { err = ngx_errno; diff --git a/src/event/modules/ngx_eventport_module.c b/src/event/modules/ngx_eventport_module.c --- a/src/event/modules/ngx_eventport_module.c +++ b/src/event/modules/ngx_eventport_module.c @@ -40,9 +40,9 @@ typedef struct port_notify { void *portnfy_user; /* user defined */ } port_notify_t; -typedef struct itimerspec { /* definition per POSIX.4 */ - struct timespec it_interval; /* timer period */ - struct timespec it_value; /* timer expiration */ +typedef struct itimerspec { /* definition per POSIX.4 */ + struct timespec it_interval;/* timer period */ + struct timespec it_value; /* timer expiration */ } itimerspec_t; int port_create(void) @@ -87,16 +87,16 @@ int timer_delete(timer_t timerid) typedef struct { - u_int events; + ngx_uint_t events; } ngx_eventport_conf_t; static ngx_int_t ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_eventport_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_eventport_add_event(ngx_event_t *ev, int event, - u_int flags); -static ngx_int_t ngx_eventport_del_event(ngx_event_t *ev, int event, - u_int flags); +static ngx_int_t ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); static ngx_int_t ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); @@ -105,7 +105,7 @@ static char *ngx_eventport_init_conf(ngx static int ep = -1; static port_event_t *event_list; -static u_int nevents; +static ngx_uint_t nevents; static timer_t event_timer = -1; static ngx_str_t eventport_name = ngx_string("eventport"); @@ -261,9 +261,9 @@ ngx_eventport_done(ngx_cycle_t *cycle) static ngx_int_t -ngx_eventport_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { - int events, prev; + ngx_int_t events, prev; ngx_event_t *e; ngx_connection_t *c; @@ -291,7 +291,7 @@ ngx_eventport_add_event(ngx_event_t *ev, } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "eventport add event: fd:%d ev:%04Xd", c->fd, events); + "eventport add event: fd:%d ev:%04Xi", c->fd, events); if (port_associate(ep, PORT_SOURCE_FD, c->fd, events, (void *) ((uintptr_t) ev | ev->instance)) @@ -310,7 +310,7 @@ ngx_eventport_add_event(ngx_event_t *ev, static ngx_int_t -ngx_eventport_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_event_t *e; ngx_connection_t *c; @@ -340,7 +340,7 @@ ngx_eventport_del_event(ngx_event_t *ev, if (e->oneshot) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "eventport change event: fd:%d ev:%04Xd", c->fd, event); + "eventport change event: fd:%d ev:%04Xi", c->fd, event); if (port_associate(ep, PORT_SOURCE_FD, c->fd, event, (void *) ((uintptr_t) ev | ev->instance)) @@ -396,7 +396,7 @@ ngx_eventport_process_events(ngx_cycle_t events = 1; - n = port_getn(ep, event_list, nevents, &events, tp); + n = port_getn(ep, event_list, (u_int) nevents, &events, tp); err = ngx_errno; diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -11,16 +11,19 @@ typedef struct { - int changes; - int events; + ngx_uint_t changes; + ngx_uint_t events; } ngx_kqueue_conf_t; static ngx_int_t ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_kqueue_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); +static ngx_int_t ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, + ngx_uint_t flags); static ngx_int_t ngx_kqueue_process_changes(ngx_cycle_t *cycle, ngx_uint_t try); static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); @@ -43,7 +46,7 @@ int ngx_kqueue = -1; static struct kevent *change_list, *change_list0, *change_list1; static struct kevent *event_list; -static int max_changes, nchanges, nevents; +static ngx_uint_t max_changes, nchanges, nevents; #if (NGX_THREADS) static ngx_mutex_t *list_mutex; @@ -151,7 +154,9 @@ ngx_kqueue_init(ngx_cycle_t *cycle, ngx_ ts.tv_sec = 0; ts.tv_nsec = 0; - if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { + if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) + == -1) + { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, "kevent() failed"); return NGX_ERROR; @@ -273,7 +278,7 @@ ngx_kqueue_done(ngx_cycle_t *cycle) static ngx_int_t -ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_int_t rc; #if 0 @@ -289,7 +294,7 @@ ngx_kqueue_add_event(ngx_event_t *ev, in #if 0 - if (ev->index < (u_int) nchanges + if (ev->index < nchanges && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) == (uintptr_t) ev) { @@ -301,10 +306,10 @@ ngx_kqueue_add_event(ngx_event_t *ev, in */ ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent activated: %d: ft:%d", + "kevent activated: %d: ft:%i", ngx_event_ident(ev->data), event); - if (ev->index < (u_int) --nchanges) { + if (ev->index < --nchanges) { e = (ngx_event_t *) ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1); change_list[ev->index] = change_list[nchanges]; @@ -337,7 +342,7 @@ ngx_kqueue_add_event(ngx_event_t *ev, in static ngx_int_t -ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_int_t rc; ngx_event_t *e; @@ -347,19 +352,19 @@ ngx_kqueue_del_event(ngx_event_t *ev, in ngx_mutex_lock(list_mutex); - if (ev->index < (u_int) nchanges + if (ev->index < nchanges && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) == (uintptr_t) ev) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent deleted: %d: ft:%d", + "kevent deleted: %d: ft:%i", ngx_event_ident(ev->data), event); /* if the event is still not passed to a kernel we will not pass it */ nchanges--; - if (ev->index < (u_int) nchanges) { + if (ev->index < nchanges) { e = (ngx_event_t *) ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1); change_list[ev->index] = change_list[nchanges]; @@ -396,7 +401,7 @@ ngx_kqueue_del_event(ngx_event_t *ev, in static ngx_int_t -ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) +ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags) { struct kevent *kev; struct timespec ts; @@ -405,7 +410,7 @@ ngx_kqueue_set_event(ngx_event_t *ev, in c = ev->data; ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "kevent set event: %d: ft:%d fl:%04Xd", + "kevent set event: %d: ft:%i fl:%04Xi", c->fd, filter, flags); if (nchanges >= max_changes) { @@ -415,7 +420,9 @@ ngx_kqueue_set_event(ngx_event_t *ev, in ts.tv_sec = 0; ts.tv_nsec = 0; - if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { + if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) + == -1) + { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); return NGX_ERROR; } @@ -426,8 +433,8 @@ ngx_kqueue_set_event(ngx_event_t *ev, in kev = &change_list[nchanges]; kev->ident = c->fd; - kev->filter = filter; - kev->flags = flags; + kev->filter = (short) filter; + kev->flags = (u_short) flags; kev->udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ev | ev->instance); if (filter == EVFILT_VNODE) { @@ -482,7 +489,7 @@ ngx_kqueue_process_events(ngx_cycle_t *c n = 0; } else { - n = nchanges; + n = (int) nchanges; nchanges = 0; } @@ -510,7 +517,7 @@ ngx_kqueue_process_events(ngx_cycle_t *c ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "kevent timer: %M, changes: %d", timer, n); - events = kevent(ngx_kqueue, change_list, n, event_list, nevents, tp); + events = kevent(ngx_kqueue, change_list, n, event_list, (int) nevents, tp); if (events == -1) { err = ngx_errno; @@ -696,7 +703,7 @@ ngx_kqueue_process_changes(ngx_cycle_t * change_list = change_list0; } - n = nchanges; + n = (int) nchanges; nchanges = 0; ngx_mutex_unlock(list_mutex); @@ -758,8 +765,8 @@ ngx_kqueue_init_conf(ngx_cycle_t *cycle, { ngx_kqueue_conf_t *kcf = conf; - ngx_conf_init_value(kcf->changes, 512); - ngx_conf_init_value(kcf->events, 512); + ngx_conf_init_uint_value(kcf->changes, 512); + ngx_conf_init_uint_value(kcf->events, 512); return NGX_CONF_OK; } diff --git a/src/event/modules/ngx_kqueue_module.h b/src/event/modules/ngx_kqueue_module.h --- a/src/event/modules/ngx_kqueue_module.h +++ b/src/event/modules/ngx_kqueue_module.h @@ -13,5 +13,4 @@ extern ngx_module_t ngx_kqueue_mo extern ngx_event_module_t ngx_kqueue_module_ctx; - #endif /* _NGX_KQUEUE_MODULE_H_INCLUDED_ */ diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -11,15 +11,17 @@ static ngx_int_t ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_poll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags); +static ngx_int_t ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); static ngx_int_t ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); static char *ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf); static struct pollfd *event_list; -static int nevents; +static ngx_int_t nevents; static ngx_str_t poll_name = ngx_string("poll"); @@ -108,7 +110,7 @@ ngx_poll_done(ngx_cycle_t *cycle) static ngx_int_t -ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_event_t *e; ngx_connection_t *c; @@ -119,7 +121,7 @@ ngx_poll_add_event(ngx_event_t *ev, int if (ev->index != NGX_INVALID_INDEX) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "poll event fd:%d ev:%d is already set", c->fd, event); + "poll event fd:%d ev:%i is already set", c->fd, event); return NGX_OK; } @@ -137,11 +139,11 @@ ngx_poll_add_event(ngx_event_t *ev, int } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll add event: fd:%d ev:%d", c->fd, event); + "poll add event: fd:%d ev:%i", c->fd, event); if (e == NULL || e->index == NGX_INVALID_INDEX) { event_list[nevents].fd = c->fd; - event_list[nevents].events = event; + event_list[nevents].events = (short) event; event_list[nevents].revents = 0; ev->index = nevents; @@ -149,9 +151,9 @@ ngx_poll_add_event(ngx_event_t *ev, int } else { ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll add index: %d", e->index); + "poll add index: %i", e->index); - event_list[e->index].events |= event; + event_list[e->index].events |= (short) event; ev->index = e->index; } @@ -160,7 +162,7 @@ ngx_poll_add_event(ngx_event_t *ev, int static ngx_int_t -ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_event_t *e; ngx_connection_t *c; @@ -171,7 +173,7 @@ ngx_poll_del_event(ngx_event_t *ev, int if (ev->index == NGX_INVALID_INDEX) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "poll event fd:%d ev:%d is already deleted", + "poll event fd:%d ev:%i is already deleted", c->fd, event); return NGX_OK; } @@ -190,15 +192,15 @@ ngx_poll_del_event(ngx_event_t *ev, int } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll del event: fd:%d ev:%d", c->fd, event); + "poll del event: fd:%d ev:%i", c->fd, event); if (e == NULL || e->index == NGX_INVALID_INDEX) { nevents--; - if (ev->index < (u_int) nevents) { + if (ev->index < (ngx_uint_t) nevents) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "index: copy event %d to %d", nevents, ev->index); + "index: copy event %ui to %i", nevents, ev->index); event_list[ev->index] = event_list[nevents]; @@ -209,11 +211,11 @@ ngx_poll_del_event(ngx_event_t *ev, int "unexpected last event"); } else { - if (c->read->index == (u_int) nevents) { + if (c->read->index == (ngx_uint_t) nevents) { c->read->index = ev->index; } - if (c->write->index == (u_int) nevents) { + if (c->write->index == (ngx_uint_t) nevents) { c->write->index = ev->index; } } @@ -221,9 +223,9 @@ ngx_poll_del_event(ngx_event_t *ev, int } else { ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll del index: %d", e->index); + "poll del index: %i", e->index); - event_list[e->index].events &= ~event; + event_list[e->index].events &= (short) ~event; } ev->index = NGX_INVALID_INDEX; diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c --- a/src/event/modules/ngx_rtsig_module.c +++ b/src/event/modules/ngx_rtsig_module.c @@ -29,10 +29,10 @@ int ngx_linux_rtsig_max; typedef struct { - int signo; - ngx_int_t overflow_events; - ngx_int_t overflow_test; - ngx_int_t overflow_threshold; + ngx_uint_t signo; + ngx_uint_t overflow_events; + ngx_uint_t overflow_test; + ngx_uint_t overflow_threshold; } ngx_rtsig_conf_t; @@ -41,7 +41,8 @@ extern ngx_event_module_t ngx_poll_modu static ngx_int_t ngx_rtsig_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_rtsig_done(ngx_cycle_t *cycle); static ngx_int_t ngx_rtsig_add_connection(ngx_connection_t *c); -static ngx_int_t ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags); +static ngx_int_t ngx_rtsig_del_connection(ngx_connection_t *c, + ngx_uint_t flags); static ngx_int_t ngx_rtsig_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); static ngx_int_t ngx_rtsig_process_overflow(ngx_cycle_t *cycle, @@ -143,8 +144,8 @@ ngx_rtsig_init(ngx_cycle_t *cycle, ngx_m rtscf = ngx_event_get_conf(cycle->conf_ctx, ngx_rtsig_module); sigemptyset(&set); - sigaddset(&set, rtscf->signo); - sigaddset(&set, rtscf->signo + 1); + sigaddset(&set, (int) rtscf->signo); + sigaddset(&set, (int) rtscf->signo + 1); sigaddset(&set, SIGIO); sigaddset(&set, SIGALRM); @@ -188,7 +189,7 @@ ngx_rtsig_done(ngx_cycle_t *cycle) static ngx_int_t ngx_rtsig_add_connection(ngx_connection_t *c) { - int signo; + ngx_uint_t signo; ngx_rtsig_conf_t *rtscf; if (c->read->accept && c->read->disabled) { @@ -211,7 +212,7 @@ ngx_rtsig_add_connection(ngx_connection_ signo = rtscf->signo + c->read->instance; ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "rtsig add connection: fd:%d signo:%d", c->fd, signo); + "rtsig add connection: fd:%d signo:%ui", c->fd, signo); if (fcntl(c->fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) == -1) { ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, @@ -219,7 +220,7 @@ ngx_rtsig_add_connection(ngx_connection_ return NGX_ERROR; } - if (fcntl(c->fd, F_SETSIG, signo) == -1) { + if (fcntl(c->fd, F_SETSIG, (int) signo) == -1) { ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "fcntl(F_SETSIG) failed"); return NGX_ERROR; @@ -247,7 +248,7 @@ ngx_rtsig_add_connection(ngx_connection_ static ngx_int_t -ngx_rtsig_del_connection(ngx_connection_t *c, u_int flags) +ngx_rtsig_del_connection(ngx_connection_t *c, ngx_uint_t flags) { ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "rtsig del connection: fd:%d", c->fd); @@ -348,7 +349,7 @@ ngx_rtsig_process_events(ngx_cycle_t *cy rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); - if (signo == rtscf->signo || signo == rtscf->signo + 1) { + if (signo == (int) rtscf->signo || signo == (int) rtscf->signo + 1) { if (overflow && (ngx_uint_t) si.si_fd > overflow_current) { return NGX_OK; @@ -363,7 +364,7 @@ ngx_rtsig_process_events(ngx_cycle_t *cy return NGX_OK; } - instance = signo - rtscf->signo; + instance = signo - (int) rtscf->signo; rev = c->read; @@ -459,8 +460,8 @@ ngx_rtsig_process_overflow(ngx_cycle_t * { int name[2], rtsig_max, rtsig_nr, events, ready; size_t len; - ngx_int_t tested, n, i; ngx_err_t err; + ngx_uint_t tested, n, i; ngx_event_t *rev, *wev, **queue; ngx_connection_t *c; ngx_rtsig_conf_t *rtscf; @@ -638,7 +639,7 @@ ngx_rtsig_process_overflow(ngx_cycle_t * * "/proc/sys/kernel/rtsig-max" / "rtsig_overflow_threshold" */ - if (rtsig_max / rtscf->overflow_threshold < rtsig_nr) { + if (rtsig_max / (int) rtscf->overflow_threshold < rtsig_nr) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "rtsig queue state: %d/%d", rtsig_nr, rtsig_max); @@ -703,19 +704,18 @@ ngx_rtsig_init_conf(ngx_cycle_t *cycle, ngx_rtsig_conf_t *rtscf = conf; /* LinuxThreads use the first 3 RT signals */ - ngx_conf_init_value(rtscf->signo, SIGRTMIN + 10); + ngx_conf_init_uint_value(rtscf->signo, SIGRTMIN + 10); - ngx_conf_init_value(rtscf->overflow_events, 16); - ngx_conf_init_value(rtscf->overflow_test, 32); - ngx_conf_init_value(rtscf->overflow_threshold, 10); + ngx_conf_init_uint_value(rtscf->overflow_events, 16); + ngx_conf_init_uint_value(rtscf->overflow_test, 32); + ngx_conf_init_uint_value(rtscf->overflow_threshold, 10); return NGX_CONF_OK; } static char * -ngx_check_ngx_overflow_threshold_bounds(ngx_conf_t *cf, - void *post, void *data) +ngx_check_ngx_overflow_threshold_bounds(ngx_conf_t *cf, void *post, void *data) { if (ngx_linux_rtsig_max) { return ngx_conf_check_num_bounds(cf, post, data); diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -12,8 +12,10 @@ static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_select_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_select_add_event(ngx_event_t *ev, int event, u_int flags); -static ngx_int_t ngx_select_del_event(ngx_event_t *ev, int event, u_int flags); +static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); +static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, + ngx_uint_t flags); static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf); @@ -25,10 +27,10 @@ static fd_set work_read_fd_set; static fd_set work_write_fd_set; #if (NGX_WIN32) -static int max_read; -static int max_write; +static ngx_uint_t max_read; +static ngx_uint_t max_write; #else -static int max_fd; +static ngx_int_t max_fd; #endif static ngx_uint_t nevents; @@ -129,18 +131,18 @@ ngx_select_done(ngx_cycle_t *cycle) static ngx_int_t -ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) +ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_connection_t *c; c = ev->data; ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "select add event fd:%d ev:%d", c->fd, event); + "select add event fd:%d ev:%i", c->fd, event); if (ev->index != NGX_INVALID_INDEX) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "select event fd:%d ev:%d is already set", c->fd, event); + "select event fd:%d ev:%i is already set", c->fd, event); return NGX_OK; } @@ -190,7 +192,7 @@ ngx_select_add_event(ngx_event_t *ev, in static ngx_int_t -ngx_select_del_event(ngx_event_t *ev, int event, u_int flags) +ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { ngx_connection_t *c; @@ -203,7 +205,7 @@ ngx_select_del_event(ngx_event_t *ev, in } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "select del event fd:%d ev:%d", c->fd, event); + "select del event fd:%d ev:%i", c->fd, event); #if (NGX_WIN32) @@ -231,7 +233,7 @@ ngx_select_del_event(ngx_event_t *ev, in #endif - if (ev->index < (u_int) --nevents) { + if (ev->index < --nevents) { event_index[ev->index] = event_index[nevents]; event_index[ev->index]->index = ev->index; } diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -276,7 +276,7 @@ ngx_process_events_and_timers(ngx_cycle_ ngx_int_t -ngx_handle_read_event(ngx_event_t *rev, u_int flags) +ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags) { if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -126,7 +126,7 @@ struct ngx_event_s { #endif - u_int index; + ngx_uint_t index; ngx_log_t *log; @@ -182,7 +182,7 @@ struct ngx_event_s { /* event should not cross cache line in SMP */ - int padding[NGX_EVENT_T_PADDING]; + uint32_t padding[NGX_EVENT_T_PADDING]; #endif #endif }; @@ -195,14 +195,14 @@ typedef struct { typedef struct { - ngx_int_t (*add)(ngx_event_t *ev, int event, u_int flags); - ngx_int_t (*del)(ngx_event_t *ev, int event, u_int flags); + ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); + ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); - ngx_int_t (*enable)(ngx_event_t *ev, int event, u_int flags); - ngx_int_t (*disable)(ngx_event_t *ev, int event, u_int flags); + ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); + ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); ngx_int_t (*add_conn)(ngx_connection_t *c); - ngx_int_t (*del_conn)(ngx_connection_t *c, u_int flags); + ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags); ngx_int_t (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait); ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer, @@ -489,7 +489,7 @@ u_char *ngx_accept_log_error(ngx_log_t * void ngx_process_events_and_timers(ngx_cycle_t *cycle); -ngx_int_t ngx_handle_read_event(ngx_event_t *rev, u_int flags); +ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags); ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat); diff --git a/src/event/ngx_event_busy_lock.c b/src/event/ngx_event_busy_lock.c --- a/src/event/ngx_event_busy_lock.c +++ b/src/event/ngx_event_busy_lock.c @@ -9,7 +9,7 @@ #include -static int ngx_event_busy_lock_look_cachable(ngx_event_busy_lock_t *bl, +static ngx_int_t ngx_event_busy_lock_look_cachable(ngx_event_busy_lock_t *bl, ngx_event_busy_lock_ctx_t *ctx); static void ngx_event_busy_lock_handler(ngx_event_t *ev); static void ngx_event_busy_lock_posted_handler(ngx_event_t *ev); diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -198,7 +198,7 @@ ngx_int_t ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert, ngx_str_t *key) { - if (ngx_conf_full_name(cf->cycle, cert) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, cert, 1) == NGX_ERROR) { return NGX_ERROR; } @@ -211,7 +211,7 @@ ngx_ssl_certificate(ngx_conf_t *cf, ngx_ return NGX_ERROR; } - if (ngx_conf_full_name(cf->cycle, key) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, key, 1) == NGX_ERROR) { return NGX_ERROR; } @@ -242,7 +242,7 @@ ngx_ssl_client_certificate(ngx_conf_t *c return NGX_OK; } - if (ngx_conf_full_name(cf->cycle, cert) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, cert, 1) == NGX_ERROR) { return NGX_ERROR; } @@ -784,7 +784,7 @@ ngx_ssl_send_chain(ngx_connection_t *c, /* the maximum limit size is the maximum uint32_t value - the page size */ - if (limit == 0 || limit > NGX_MAX_UINT32_VALUE - ngx_pagesize) { + if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize)) { limit = NGX_MAX_UINT32_VALUE - ngx_pagesize; } diff --git a/src/http/modules/ngx_http_auth_basic_module.c b/src/http/modules/ngx_http_auth_basic_module.c --- a/src/http/modules/ngx_http_auth_basic_module.c +++ b/src/http/modules/ngx_http_auth_basic_module.c @@ -352,7 +352,7 @@ ngx_http_auth_basic_merge_loc_conf(ngx_c } if (conf->user_file.data) { - if (ngx_conf_full_name(cf->cycle, &conf->user_file) != NGX_OK) { + if (ngx_conf_full_name(cf->cycle, &conf->user_file, 1) != NGX_OK) { return NGX_CONF_ERROR; } diff --git a/src/http/modules/ngx_http_geo_module.c b/src/http/modules/ngx_http_geo_module.c --- a/src/http/modules/ngx_http_geo_module.c +++ b/src/http/modules/ngx_http_geo_module.c @@ -198,7 +198,7 @@ ngx_http_geo(ngx_conf_t *cf, ngx_command if (ngx_strcmp(value[0].data, "include") == 0) { file = value[1]; - if (ngx_conf_full_name(cf->cycle, &file) == NGX_ERROR){ + if (ngx_conf_full_name(cf->cycle, &file, 1) == NGX_ERROR){ return NGX_CONF_ERROR; } diff --git a/src/http/modules/ngx_http_map_module.c b/src/http/modules/ngx_http_map_module.c --- a/src/http/modules/ngx_http_map_module.c +++ b/src/http/modules/ngx_http_map_module.c @@ -378,7 +378,7 @@ ngx_http_map(ngx_conf_t *cf, ngx_command if (ngx_strcmp(value[0].data, "include") == 0) { file = value[1]; - if (ngx_conf_full_name(cf->cycle, &file) == NGX_ERROR){ + if (ngx_conf_full_name(cf->cycle, &file, 1) == NGX_ERROR){ return NGX_CONF_ERROR; } diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c --- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -2237,6 +2237,7 @@ ngx_http_proxy_pass(ngx_conf_t *cf, ngx_ if (port == 80) { plcf->port.len = sizeof("80") - 1; plcf->port.data = (u_char *) "80"; + } else { plcf->port.len = sizeof("443") - 1; plcf->port.data = (u_char *) "443"; @@ -2275,13 +2276,17 @@ ngx_http_proxy_pass(ngx_conf_t *cf, ngx_ plcf->upstream.location = clcf->name; + if (clcf->named #if (NGX_PCRE) - - if (clcf->regex || clcf->noname) { + || clcf->regex +#endif + || clcf->noname) + { if (plcf->upstream.uri.len) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "\"proxy_pass\" may not have URI part in " "location given by regular expression, " + "or inside named location, " "or inside the \"if\" statement, " "or inside the \"limit_except\" block"); return NGX_CONF_ERROR; @@ -2290,8 +2295,6 @@ ngx_http_proxy_pass(ngx_conf_t *cf, ngx_ plcf->upstream.location.len = 0; } -#endif - plcf->upstream.url = *url; if (clcf->name.data[clcf->name.len - 1] == '/') { diff --git a/src/http/modules/perl/nginx.pm b/src/http/modules/perl/nginx.pm --- a/src/http/modules/perl/nginx.pm +++ b/src/http/modules/perl/nginx.pm @@ -47,7 +47,7 @@ our @EXPORT = qw( HTTP_INSUFFICIENT_STORAGE ); -our $VERSION = '0.6.5'; +our $VERSION = '0.6.6'; require XSLoader; XSLoader::load('nginx', $VERSION); diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c --- a/src/http/modules/perl/ngx_http_perl_module.c +++ b/src/http/modules/perl/ngx_http_perl_module.c @@ -454,7 +454,7 @@ ngx_http_perl_init_interpreter(ngx_conf_ #endif if (pmcf->modules.data) { - if (ngx_conf_full_name(cf->cycle, &pmcf->modules) != NGX_OK) { + if (ngx_conf_full_name(cf->cycle, &pmcf->modules, 0) != NGX_OK) { return NGX_CONF_ERROR; } } diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c @@ -401,6 +401,7 @@ ngx_http_block(ngx_conf_t *cf, ngx_comma cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1; + cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1; find_config_index = 0; use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0; use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0; @@ -442,6 +443,14 @@ ngx_http_block(ngx_conf_t *cf, ngx_comma continue; + case NGX_HTTP_REWRITE_PHASE: + if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) { + cmcf->phase_engine.location_rewrite_index = n; + } + checker = ngx_http_core_generic_phase; + + break; + case NGX_HTTP_POST_REWRITE_PHASE: if (use_rewrite) { ph->checker = ngx_http_core_post_rewrite_phase; diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c @@ -945,13 +945,12 @@ ngx_http_core_find_location(ngx_http_req clcfp = locations->elts; for (i = 0; i < locations->nelts; i++) { + if (clcfp[i]->noname #if (NGX_PCRE) - if (clcfp[i]->regex) { - break; - } + || clcfp[i]->regex #endif - - if (clcfp[i]->noname) { + || clcfp[i]->named) + { break; } @@ -1028,7 +1027,7 @@ ngx_http_core_find_location(ngx_http_req for (i = regex_start; i < locations->nelts; i++) { - if (clcfp[i]->noname) { + if (!clcfp[i]->regex) { break; } @@ -1223,7 +1222,8 @@ ngx_http_map_uri_to_path(ngx_http_reques return NULL; } - if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, path) == NGX_ERROR) { + if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, path, 0)== NGX_ERROR) + { return NULL; } @@ -1513,6 +1513,51 @@ ngx_http_internal_redirect(ngx_http_requ } +ngx_int_t +ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name) +{ + ngx_uint_t i; + ngx_http_core_srv_conf_t *cscf; + ngx_http_core_loc_conf_t **clcfp; + ngx_http_core_main_conf_t *cmcf; + + cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); + + clcfp = cscf->locations.elts; + + for (i = cscf->named_start; i < cscf->locations.nelts; i++) { + + if (name->len != clcfp[i]->name.len + || ngx_strncmp(name->data, clcfp[i]->name.data, name->len) != 0) + { + continue; + } + + ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "named location: %V \"%V?%V\"", name, &r->uri, &r->args); + + r->internal = 1; + + r->loc_conf = clcfp[i]->loc_conf; + + ngx_http_update_location_config(r); + + cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); + + r->phase_handler = cmcf->phase_engine.location_rewrite_index; + ngx_http_core_run_phases(r); + + return NGX_DONE; + } + + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "could not find name location \"%V\"", name); + + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return NGX_DONE; +} + + ngx_http_cleanup_t * ngx_http_cleanup_add(ngx_http_request_t *r, size_t size) { @@ -1557,10 +1602,8 @@ ngx_http_core_server(ngx_conf_t *cf, ngx ngx_http_module_t *module; ngx_http_conf_ctx_t *ctx, *http_ctx; ngx_http_core_srv_conf_t *cscf, **cscfp; + ngx_http_core_loc_conf_t **clcfp; ngx_http_core_main_conf_t *cmcf; -#if (NGX_PCRE) - ngx_http_core_loc_conf_t **clcfp; -#endif ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); if (ctx == NULL) { @@ -1644,10 +1687,11 @@ ngx_http_core_server(ngx_conf_t *cf, ngx ngx_sort(cscf->locations.elts, (size_t) cscf->locations.nelts, sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations); + clcfp = cscf->locations.elts; + #if (NGX_PCRE) cscf->regex_start = cscf->locations.nelts; - clcfp = cscf->locations.elts; for (i = 0; i < cscf->locations.nelts; i++) { if (clcfp[i]->regex) { @@ -1658,6 +1702,15 @@ ngx_http_core_server(ngx_conf_t *cf, ngx #endif + cscf->named_start = cscf->locations.nelts; + + for (i = 0; i < cscf->locations.nelts; i++) { + if (clcfp[i]->named) { + cscf->named_start = i; + break; + } + } + return rv; } @@ -1758,7 +1811,12 @@ ngx_http_core_location(ngx_conf_t *cf, n } } else { + clcf->name = value[1]; + + if (value[1].data[0] == '@') { + clcf->named = 1; + } } pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index]; @@ -1784,6 +1842,14 @@ ngx_http_core_location(ngx_conf_t *cf, n return NGX_CONF_ERROR; } + if (pclcf->named) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "location \"%V\" could not be inside " + "the named location \"%V\"", + &clcf->name, &pclcf->name); + return NGX_CONF_ERROR; + } + #if (NGX_PCRE) if (clcf->regex == NULL && ngx_strncmp(clcf->name.data, pclcf->name.data, pclcf->name.len) @@ -1861,6 +1927,20 @@ ngx_http_core_cmp_locations(const void * first = *(ngx_http_core_loc_conf_t **) one; second = *(ngx_http_core_loc_conf_t **) two; + if (first->named && !second->named) { + /* shift named locations to the end */ + return 1; + } + + if (!first->named && second->named) { + /* shift named locations to the end */ + return -1; + } + + if (first->named && second->named) { + return ngx_strcmp(first->name.data, second->name.data); + } + if (first->noname && !second->noname) { /* shift no named locations to the end */ return 1; @@ -1947,7 +2027,7 @@ ngx_http_core_type(ngx_conf_t *cf, ngx_c if (ngx_strcmp(value[0].data, "include") == 0) { file = value[1]; - if (ngx_conf_full_name(cf->cycle, &file) == NGX_ERROR){ + if (ngx_conf_full_name(cf->cycle, &file, 1) == NGX_ERROR){ return NGX_CONF_ERROR; } @@ -2290,7 +2370,7 @@ ngx_http_core_merge_loc_conf(ngx_conf_t conf->root.len = sizeof("html") - 1; conf->root.data = (u_char *) "html"; - if (ngx_conf_full_name(cf->cycle, &conf->root) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, &conf->root, 0) == NGX_ERROR) { return NGX_CONF_ERROR; } } @@ -2706,6 +2786,14 @@ ngx_http_core_root(ngx_conf_t *cf, ngx_c return NGX_CONF_ERROR; } + if (lcf->named && alias) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the \"alias\" directive may not be used " + "inside named location"); + + return NGX_CONF_ERROR; + } + #if (NGX_PCRE) if (lcf->regex && alias) { @@ -2739,7 +2827,7 @@ ngx_http_core_root(ngx_conf_t *cf, ngx_c } if (lcf->root.data[0] != '$') { - if (ngx_conf_full_name(cf->cycle, &lcf->root) == NGX_ERROR) { + if (ngx_conf_full_name(cf->cycle, &lcf->root, 0) == NGX_ERROR) { return NGX_CONF_ERROR; } } diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h --- a/src/http/ngx_http_core_module.h +++ b/src/http/ngx_http_core_module.h @@ -79,6 +79,7 @@ struct ngx_http_phase_handler_s { typedef struct { ngx_http_phase_handler_t *handlers; ngx_uint_t server_rewrite_index; + ngx_uint_t location_rewrite_index; } ngx_http_phase_engine_t; @@ -117,7 +118,8 @@ typedef struct { */ ngx_array_t locations; - unsigned regex_start:16; + unsigned regex_start:15; + unsigned named_start:15; unsigned wildcard:1; /* array of the ngx_http_listen_t, "listen" directive */ @@ -212,9 +214,10 @@ struct ngx_http_core_loc_conf_s { ngx_regex_t *regex; #endif - unsigned regex_start:16; + unsigned regex_start:15; - unsigned noname:1; /* "if () {}" block */ + unsigned noname:1; /* "if () {}" block or limit_except */ + unsigned named:1; unsigned exact_match:1; unsigned noregex:1; @@ -314,6 +317,8 @@ ngx_int_t ngx_http_subrequest(ngx_http_r ngx_http_post_subrequest_t *psr, ngx_uint_t flags); ngx_int_t ngx_http_internal_redirect(ngx_http_request_t *r, ngx_str_t *uri, ngx_str_t *args); +ngx_int_t ngx_http_named_location(ngx_http_request_t *r, ngx_str_t *name); + ngx_http_cleanup_t *ngx_http_cleanup_add(ngx_http_request_t *r, size_t size); diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c --- a/src/http/ngx_http_special_response.c +++ b/src/http/ngx_http_special_response.c @@ -409,6 +409,10 @@ ngx_http_special_response_handler(ngx_ht return ngx_http_internal_redirect(r, uri, NULL); } + if (uri->data[0] == '@') { + return ngx_http_named_location(r, uri); + } + r->headers_out.location = ngx_list_push(&r->headers_out.headers); diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -3209,6 +3209,12 @@ ngx_http_upstream_add(ngx_conf_t *cf, ng continue; } + if (uscfp[i]->default_port && u->default_port + && uscfp[i]->default_port != u->default_port) + { + continue; + } + return uscfp[i]; } diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c --- a/src/http/ngx_http_upstream_round_robin.c +++ b/src/http/ngx_http_upstream_round_robin.c @@ -9,6 +9,10 @@ #include +static ngx_uint_t +ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers); + + ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us) @@ -215,7 +219,12 @@ ngx_http_upstream_get_round_robin_peer(n /* it's a first try - get a current peer */ for ( ;; ) { - rrp->current = rrp->peers->current; + rrp->current = ngx_http_upstream_get_peer(rrp->peers); + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get rr peer, current: %ui %i", + rrp->current, + rrp->peers->peer[rrp->current].current_weight); n = rrp->current / (8 * sizeof(uintptr_t)); m = (uintptr_t) 1 << rrp->current % (8 * sizeof(uintptr_t)); @@ -236,6 +245,8 @@ ngx_http_upstream_get_round_robin_peer(n break; } + peer->current_weight = 0; + } else { rrp->tried[n] |= m; } @@ -243,12 +254,6 @@ ngx_http_upstream_get_round_robin_peer(n pc->tries--; } - rrp->peers->current++; - - if (rrp->peers->current >= rrp->peers->number) { - rrp->peers->current = 0; - } - if (pc->tries) { continue; } @@ -258,16 +263,6 @@ ngx_http_upstream_get_round_robin_peer(n peer->current_weight--; - if (peer->current_weight == 0) { - peer->current_weight = peer->weight; - - rrp->peers->current++; - - if (rrp->peers->current >= rrp->peers->number) { - rrp->peers->current = 0; - } - } - } else { for ( ;; ) { n = rrp->current / (8 * sizeof(uintptr_t)); @@ -290,6 +285,8 @@ ngx_http_upstream_get_round_robin_peer(n break; } + peer->current_weight = 0; + } else { rrp->tried[n] |= m; } @@ -311,18 +308,6 @@ ngx_http_upstream_get_round_robin_peer(n } peer->current_weight--; - - if (peer->current_weight == 0) { - peer->current_weight = peer->weight; - - if (rrp->current == rrp->peers->current) { - rrp->peers->current++; - - if (rrp->peers->current >= rrp->peers->number) { - rrp->peers->current = 0; - } - } - } } rrp->tried[n] |= m; @@ -352,6 +337,61 @@ failed: } +static ngx_uint_t +ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers) +{ + ngx_uint_t i, n; + ngx_http_upstream_rr_peer_t *peer; + + peer = &peers->peer[0]; + + for ( ;; ) { + + for (i = 0; i < peers->number; i++) { + + if (peer[i].current_weight <= 0) { + continue; + } + + n = i; + + while (i < peers->number - 1) { + + i++; + + if (peer[i].current_weight <= 0) { + continue; + } + + if (peer[n].current_weight * 1000 / peer[i].current_weight + >= peer[n].weight * 1000 / peer[i].weight) + { + return n; + } + + n = i; + } + + if (peer[i].current_weight > 0) { + n = i; + } + + return n; + } + + for (i = 0; i < peers->number; i++) { + if (peer[i].fails == 0) { + peer[i].current_weight += peer[i].weight; + + } else { + /* 1 allows to go to quick recovery when all peers failed */ + peer[i].current_weight = 1; + } + } + } +} + + void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data, ngx_uint_t state) @@ -385,8 +425,14 @@ ngx_http_upstream_free_round_robin_peer( peer->fails++; peer->accessed = now; - if (peer->current_weight > 1) { - peer->current_weight /= 2; + peer->current_weight -= peer->weight / peer->max_fails; + + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "free rr peer failed: %ui %i", + rrp->current, peer->current_weight); + + if (peer->current_weight < 0) { + peer->current_weight = 0; } /* ngx_unlock_mutex(rrp->peers->mutex); */ diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h --- a/src/http/ngx_http_upstream_round_robin.h +++ b/src/http/ngx_http_upstream_round_robin.h @@ -18,8 +18,8 @@ typedef struct { socklen_t socklen; ngx_str_t name; - ngx_uint_t current_weight; - ngx_uint_t weight; + ngx_int_t current_weight; + ngx_int_t weight; ngx_uint_t fails; time_t accessed; @@ -29,15 +29,13 @@ typedef struct { ngx_uint_t down; /* unsigned down:1; */ -#if (NGX_SSL) +#if (NGX_HTTP_SSL) ngx_ssl_session_t *ssl_session; /* local to a process */ #endif } ngx_http_upstream_rr_peer_t; typedef struct { - ngx_uint_t current; - ngx_uint_t number; ngx_uint_t last_cached; diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c --- a/src/http/ngx_http_variables.c +++ b/src/http/ngx_http_variables.c @@ -13,6 +13,8 @@ static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); +static void ngx_http_variable_request_set(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); static void ngx_http_variable_request_set_size(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, @@ -39,6 +41,8 @@ static ngx_int_t ngx_http_variable_serve ngx_http_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); +static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r, @@ -155,9 +159,14 @@ static ngx_http_variable_t ngx_http_cor offsetof(ngx_http_request_t, args), NGX_HTTP_VAR_NOCACHABLE, 0 }, - { ngx_string("args"), NULL, ngx_http_variable_request, + { ngx_string("args"), + ngx_http_variable_request_set, + ngx_http_variable_request, offsetof(ngx_http_request_t, args), - NGX_HTTP_VAR_NOCACHABLE, 0 }, + NGX_HTTP_VAR_CHANGABLE|NGX_HTTP_VAR_NOCACHABLE, 0 }, + + { ngx_string("is_args"), NULL, ngx_http_variable_is_args, + 0, NGX_HTTP_VAR_NOCACHABLE, 0 }, { ngx_string("request_filename"), NULL, ngx_http_variable_request_filename, 0, @@ -501,6 +510,19 @@ ngx_http_variable_request(ngx_http_reque static void +ngx_http_variable_request_set(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + ngx_str_t *s; + + s = (ngx_str_t *) ((char *) r + data); + + s->len = v->len; + s->data = v->data; +} + + +static void ngx_http_variable_request_set_size(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { @@ -860,6 +882,27 @@ ngx_http_variable_scheme(ngx_http_reques static ngx_int_t +ngx_http_variable_is_args(ngx_http_request_t *r, + ngx_http_variable_value_t *v, uintptr_t data) +{ + v->valid = 1; + v->no_cachable = 0; + v->not_found = 0; + + if (r->args.len == 0) { + v->len = 0; + v->data = NULL; + return NGX_OK; + } + + v->len = 1; + v->data = (u_char *) "?"; + + return NGX_OK; +} + + +static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { @@ -883,7 +926,9 @@ ngx_http_variable_document_root(ngx_http return NGX_ERROR; } - if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, &path) == NGX_ERROR) { + if (ngx_conf_full_name((ngx_cycle_t *) ngx_cycle, &path, 0) + == NGX_ERROR) + { return NGX_ERROR; } diff --git a/src/mail/ngx_mail_proxy_module.c b/src/mail/ngx_mail_proxy_module.c --- a/src/mail/ngx_mail_proxy_module.c +++ b/src/mail/ngx_mail_proxy_module.c @@ -866,9 +866,11 @@ ngx_mail_proxy_handler(ngx_event_t *ev) c->log->action = "proxying"; - if ((s->connection->read->eof || s->proxy->upstream.connection->read->eof) - && s->buffer->pos == s->buffer->last - && s->proxy->buffer->pos == s->proxy->buffer->last) + if ((s->connection->read->eof && s->buffer->pos == s->buffer->last) + || (s->proxy->upstream.connection->read->eof + && s->proxy->buffer->pos == s->proxy->buffer->last) + || (s->connection->read->eof + && s->proxy->upstream.connection->read->eof)) { action = c->log->action; c->log->action = NULL; diff --git a/src/os/unix/ngx_aio_write_chain.c b/src/os/unix/ngx_aio_write_chain.c --- a/src/os/unix/ngx_aio_write_chain.c +++ b/src/os/unix/ngx_aio_write_chain.c @@ -21,7 +21,7 @@ ngx_aio_write_chain(ngx_connection_t *c, /* the maximum limit size is the maximum size_t value - the page size */ - if (limit == 0 || limit > NGX_MAX_SIZE_T_VALUE - ngx_pagesize) { + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; } diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h --- a/src/os/unix/ngx_freebsd_config.h +++ b/src/os/unix/ngx_freebsd_config.h @@ -102,7 +102,7 @@ pid_t rfork_thread(int flags, void *stac extern char **environ; -extern char *malloc_options; +extern char *malloc_options; #endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/os/unix/ngx_freebsd_sendfile_chain.c --- a/src/os/unix/ngx_freebsd_sendfile_chain.c +++ b/src/os/unix/ngx_freebsd_sendfile_chain.c @@ -72,7 +72,7 @@ ngx_freebsd_sendfile_chain(ngx_connectio /* the maximum limit size is the maximum size_t value - the page size */ - if (limit == 0 || limit > NGX_MAX_SIZE_T_VALUE - ngx_pagesize) { + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; } diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c --- a/src/os/unix/ngx_linux_sendfile_chain.c +++ b/src/os/unix/ngx_linux_sendfile_chain.c @@ -62,7 +62,7 @@ ngx_linux_sendfile_chain(ngx_connection_ /* the maximum limit size is 2G-1 - the page size */ - if (limit == 0 || limit > NGX_SENDFILE_LIMIT - ngx_pagesize) { + if (limit == 0 || limit > (off_t) (NGX_SENDFILE_LIMIT - ngx_pagesize)) { limit = NGX_SENDFILE_LIMIT - ngx_pagesize; } diff --git a/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/os/unix/ngx_solaris_sendfilev_chain.c --- a/src/os/unix/ngx_solaris_sendfilev_chain.c +++ b/src/os/unix/ngx_solaris_sendfilev_chain.c @@ -67,7 +67,7 @@ ngx_solaris_sendfilev_chain(ngx_connecti /* the maximum limit size is the maximum size_t value - the page size */ - if (limit == 0 || limit > NGX_MAX_SIZE_T_VALUE - ngx_pagesize) { + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; } diff --git a/src/os/unix/ngx_writev_chain.c b/src/os/unix/ngx_writev_chain.c --- a/src/os/unix/ngx_writev_chain.c +++ b/src/os/unix/ngx_writev_chain.c @@ -48,7 +48,7 @@ ngx_writev_chain(ngx_connection_t *c, ng /* the maximum limit size is the maximum size_t value - the page size */ - if (limit == 0 || limit > NGX_MAX_SIZE_T_VALUE - ngx_pagesize) { + if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; }