# HG changeset patch # User Igor Sysoev # Date 1100898000 -10800 # Node ID 74b1868dd3cd3b10a7fe45b36f9590034842cbde # Parent 0503cb60c4e470446e7ce67b27cad6bf00301785 nginx 0.1.8 *) Bugfix: in the ngx_http_autoindex_module if the long file names were in the listing. *) Feature: the "^~" modifier in the location directive. *) Feature: the proxy_max_temp_file_size directive. diff --git a/CHANGES b/CHANGES --- a/CHANGES +++ b/CHANGES @@ -1,8 +1,18 @@ + +Changes with nginx 0.1.8 20 Nov 2004 + + *) Bugfix: in the ngx_http_autoindex_module if the long file names were + in the listing. + + *) Feature: the "^~" modifier in the location directive. + + *) Feature: the proxy_max_temp_file_size directive. + Changes with nginx 0.1.7 12 Nov 2004 *) Bugfix: on FreeBSD the segmentation fault may occure if the size of - the transferred file was changed; bug appeared in 0.1.2. + the transferred file was changed; bug appeared in 0.1.5. Changes with nginx 0.1.6 11 Nov 2004 diff --git a/CHANGES.ru b/CHANGES.ru --- a/CHANGES.ru +++ b/CHANGES.ru @@ -1,9 +1,19 @@ + +Изменения в nginx 0.1.8 20.11.2004 + + *) Исправление: ошибка в модуле ngx_http_autoindex_module при показе + длинных имён файлов. + + *) Добавление: модификатор "^~" в директиве location. + + *) Добавление: директива proxy_max_temp_file_size. + Изменения в nginx 0.1.7 12.11.2004 *) Исправление: при использовании sendfile, если передаваемый файл менялся, то мог произойти segmentation fault на FreeBSD; ошибка - появилась в 0.1.2. + появилась в 0.1.5. Изменения в nginx 0.1.6 11.11.2004 diff --git a/auto/cc/conf b/auto/cc/conf --- a/auto/cc/conf +++ b/auto/cc/conf @@ -52,11 +52,12 @@ else . auto/cc/icc ;; -# ccc) + ccc) # # Compaq C V6.5-207 # # . auto/cc/ccc -# ;; + ngx_include_opt="-I " + ;; # acc) # # aCC: HP ANSI C++ B3910B A.03.55.02 @@ -95,7 +96,7 @@ if [ "$PLATFORM" != win32 ]; then if test -n "$NGX_LD_OPT"; then ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\" - ngx_feature_name=DUMMY + ngx_feature_name="DUMMY" ngx_feature_run=no ngx_feature_incs= ngx_feature_libs= @@ -110,7 +111,7 @@ if [ "$PLATFORM" != win32 ]; then fi ngx_feature="gcc variadic macros" - ngx_feature_name=HAVE_GCC_VARIADIC_MACROS + ngx_feature_name="HAVE_GCC_VARIADIC_MACROS" ngx_feature_run=yes ngx_feature_incs="#include #define var(dummy, args...) sprintf(args)" @@ -122,7 +123,7 @@ if [ "$PLATFORM" != win32 ]; then ngx_feature="C99 variadic macros" - ngx_feature_name=HAVE_C99_VARIADIC_MACROS + ngx_feature_name="HAVE_C99_VARIADIC_MACROS" ngx_feature_run=yes ngx_feature_incs="#include #define var(dummy, ...) sprintf(__VA_ARGS__)" @@ -132,4 +133,16 @@ if [ "$PLATFORM" != win32 ]; then if (buf[0] != '1') return 1" . auto/feature + +# ngx_feature="inline" +# ngx_feature_name="DUMMY" +# ngx_feature_run=no +# ngx_feature_incs="int inline f(void) { return 1 }" +# ngx_feature_libs= +# ngx_feature_test= +# . auto/feature +# +# if [ $ngx_found = yes ]; then +# fi + fi diff --git a/auto/cc/gcc b/auto/cc/gcc --- a/auto/cc/gcc +++ b/auto/cc/gcc @@ -3,7 +3,7 @@ # gcc 2.7.2.3, 2.8.1, 2.95.4, -# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4 +# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4, 3.4.2 # Solaris 7's /usr/ccs/bin/as does not support "-pipe" diff --git a/auto/install b/auto/install --- a/auto/install +++ b/auto/install @@ -3,6 +3,7 @@ cat << END >> $MAKEFILE + install: test -d $PREFIX || mkdir -p $PREFIX diff --git a/auto/lib/md5/make b/auto/lib/md5/make --- a/auto/lib/md5/make +++ b/auto/lib/md5/make @@ -2,35 +2,21 @@ # Copyright (C) Igor Sysoev -case "$CC" in +case "$NGX_CC_NAME" in - cl) - makefile=makefile.msvc - opt="CPU_OPT=$CPU_OPT LIBC=$LIBC MD5_ASM=$MD5_ASM" - ;; - - wcl386) - makefile=makefile.owc - opt="CPU_OPT=$CPU_OPT" + msvc*) + ngx_makefile=makefile.msvc + ngx_opt="CPU_OPT=$CPU_OPT LIBC=$LIBC MD5_ASM=$MD5_ASM" ;; - bcc32) - makefile=makefile.bcc - opt="-DCPU_OPT=$CPU_OPT -DMD5_ASM=$MD5_ASM" + owc*) + ngx_makefile=makefile.owc + ngx_opt="CPU_OPT=$CPU_OPT" ;; -esac - - -case $PLATFORM in - - win32) - line=`echo $MD5/md5.lib: | sed -e "s/\//$ngx_regex_dirsep/g"` - echo "$line" >> $MAKEFILE - ;; - - *) - echo "$MD5/libmd5.a:" >> $MAKEFILE + bcc) + ngx_makefile=makefile.bcc + ngx_opt="-DCPU_OPT=$CPU_OPT -DMD5_ASM=$MD5_ASM" ;; esac @@ -42,12 +28,16 @@ done=NO case $PLATFORM in win32) - md5=`echo $MD5 | sed -e "s/\//$ngx_regex_dirsep/g"` + cp auto/lib/md5/$ngx_makefile $MD5 + + cat << END >> $NGX_MAKEFILE - cp auto/lib/md5/$makefile $MD5 - echo " cd $md5" >> $MAKEFILE - echo " \$(MAKE) -f $makefile $opt" >> $MAKEFILE - echo " cd ..\\..\\.." >> $MAKEFILE +`echo "$MD5/md5.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` + cd `echo $MD5 | sed -e "s/\//$ngx_regex_dirsep/g"` + \$(MAKE) -f $ngx_makefile $ngx_opt + cd ..\\..\\.. + +END done=YES ;; @@ -55,13 +45,15 @@ case $PLATFORM in SunOS:*:i86pc) if [ $MD5_ASM = YES ]; then - MD5_OPT="CFLAGS=\"$MD5_OPT -DSOL -DMD5_ASM -DL_ENDIAN\"" + cat << END >> $NGX_MAKEFILE - echo " cd $MD5 \\" >> $MAKEFILE - echo " && \$(MAKE) $MD5_OPT \\" >> $MAKEFILE - echo " MD5_ASM_OBJ=asm/mx86-sol.o \\" >> $MAKEFILE - echo " CC=\"\$(CC)\" CPP=\"\$(CPP)\" \\" >> $MAKEFILE - echo " libmd5.a" >> $MAKEFILE +$MD5/libmd5.a: $NGX_MAKEFILE + cd $MD5 \\ + && \$(MAKE) CFLAGS="$MD5_OPT -DSOL -DMD5_ASM -DL_ENDIAN" \\ + CC="\$(CC)" CPP="\$(CPP)" \\ + MD5_ASM_OBJ=asm/mx86-sol.o clean libmd5.a + +END done=YES fi @@ -73,13 +65,15 @@ case $PLATFORM in *:i386 | *:i686) if [ $MD5_ASM = YES ]; then - MD5_OPT="CFLAGS=\"$MD5_OPT -DELF -DMD5_ASM -DL_ENDIAN\"" + cat << END >> $NGX_MAKEFILE - echo " cd $MD5 \\" >> $MAKEFILE - echo " && \$(MAKE) $MD5_OPT \\" >> $MAKEFILE - echo " MD5_ASM_OBJ=asm/mx86-elf.o \\" >> $MAKEFILE - echo " CC=\"\$(CC)\" CPP=\"\$(CPP)\" \\" >> $MAKEFILE - echo " libmd5.a" >> $MAKEFILE +$MD5/libmd5.a: $NGX_MAKEFILE + cd $MD5 \\ + && \$(MAKE) CFLAGS="$MD5_OPT -DELF -DMD5_ASM -DL_ENDIAN" \\ + CC="\$(CC)" CPP="\$(CPP)" \\ + MD5_ASM_OBJ=asm/mx86-elf.o clean libmd5.a + +END done=YES fi @@ -89,10 +83,14 @@ esac if [ $done = NO ]; then - echo " cd $MD5 \\" >> $MAKEFILE - echo " && \$(MAKE) CFLAGS=\"$MD5_OPT\" \\" >> $MAKEFILE - echo " MD5_ASM_OBJ= CC=\"\$(CC)\" libmd5.a" >> $MAKEFILE + + cat << END >> $NGX_MAKEFILE + +$MD5/libmd5.a: $NGX_MAKEFILE + cd $MD5 \\ + && \$(MAKE) CFLAGS="$MD5_OPT" \\ + CC="\$(CC)" MD5_ASM_OBJ= clean libmd5.a + +END + fi - - -echo >> $MAKEFILE diff --git a/auto/lib/pcre/make b/auto/lib/pcre/make --- a/auto/lib/pcre/make +++ b/auto/lib/pcre/make @@ -2,21 +2,21 @@ # Copyright (C) Igor Sysoev -case "$CC" in +case "$NGX_CC_NAME" in - cl) - makefile=makefile.msvc - opt="CPU_OPT=$CPU_OPT LIBC=$LIBC" + msvc*) + ngx_makefile=makefile.msvc + ngx_opt="CPU_OPT=$CPU_OPT LIBC=$LIBC" ;; - wcl386) - makefile=makefile.owc - opt="CPU_OPT=$CPU_OPT" + owc*) + ngx_makefile=makefile.owc + ngx_opt="CPU_OPT=$CPU_OPT" ;; - bcc32) - makefile=makefile.bcc - opt="-DCPU_OPT=$CPU_OPT" + bcc) + ngx_makefile=makefile.bcc + ngx_opt="-DCPU_OPT=$CPU_OPT" ;; esac @@ -27,39 +27,45 @@ case $PLATFORM in win32) cp auto/lib/pcre/patch.pcre.in $PCRE cp auto/lib/pcre/patch.config.in $PCRE - cp auto/lib/pcre/$makefile $PCRE + cp auto/lib/pcre/$ngx_makefile $PCRE - pcre=`echo $PCRE | sed -e "s/\//$ngx_regex_dirsep/g"` - line=`echo $PCRE/pcre.h: | sed -e "s/\//$ngx_regex_dirsep/g"` + ngx_pcre=`echo $PCRE | sed -e "s/\//$ngx_regex_dirsep/g"` + + cat << END >> $NGX_MAKEFILE - echo "$line" >> $MAKEFILE - echo " cd $pcre" >> $MAKEFILE - echo " \$(MAKE) -f $makefile pcre.h" >> $MAKEFILE - echo " cd ..\\..\\.." >> $MAKEFILE - echo >> $MAKEFILE +`echo "$PCRE/pcre.h: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` + cd $ngx_pcre + \$(MAKE) -f $ngx_makefile pcre.h + cd ..\\..\\.. + - line="$PCRE/pcre.lib: $PCRE/pcre.h" - line=`echo $line | sed -e "s/\//$ngx_regex_dirsep/g"` +`echo "$PCRE/pcre.lib: $PCRE/pcre.h" | sed -e "s/\//$ngx_regex_dirsep/g"` + cd $ngx_pcre + \$(MAKE) -f $ngx_makefile $ngx_opt + cd ..\\..\\.. - echo "$line" >> $MAKEFILE - echo " cd $pcre" >> $MAKEFILE - echo " \$(MAKE) -f $makefile $opt" >> $MAKEFILE - echo " cd ..\\..\\.." >> $MAKEFILE +END + ;; *) - PCRE_OPT="CFLAGS=\"$PCRE_OPT\"" + cat << END >> $NGX_MAKEFILE + +$PCRE/pcre.h: $NGX_MAKEFILE + cd $PCRE \\ + && if [ -f Makefile ]; then \$(MAKE) distclean; fi - echo "$PCRE/pcre.h:" >> $MAKEFILE - echo " cd $PCRE \\" >> $MAKEFILE - echo " && CC=\"\$(CC)\" $PCRE_OPT \\" >> $MAKEFILE - echo " ./configure --disable-shared" >> $MAKEFILE - echo >> $MAKEFILE - echo "$PCRE/.libs/libpcre.a: $PCRE/pcre.h" >> $MAKEFILE - echo " cd $PCRE \\" >> $MAKEFILE - echo " && \$(MAKE) libpcre.la" >> $MAKEFILE + cd $PCRE \\ + && CC="\$(CC)" CFLAGS="$PCRE_OPT" \\ + ./configure --disable-shared + + +$PCRE/.libs/libpcre.a: $PCRE/pcre.h + cd $PCRE \\ + && \$(MAKE) libpcre.la + +END + ;; esac - -echo >> $MAKEFILE diff --git a/auto/lib/zlib/make b/auto/lib/zlib/make --- a/auto/lib/zlib/make +++ b/auto/lib/zlib/make @@ -2,36 +2,22 @@ # Copyright (C) Igor Sysoev -case "$CC" in +case "$NGX_CC_NAME" in - cl) - makefile=makefile.msvc - opt="CPU_OPT=$CPU_OPT LIBC=$LIBC" + msvc*) + ngx_makefile=makefile.msvc + ngx_opt="CPU_OPT=$CPU_OPT LIBC=$LIBC" ;; - wcl386) - makefile=makefile.owc - opt="CPU_OPT=$CPU_OPT" - ;; - - bcc32) - makefile=makefile.bcc - opt="-DCPU_OPT=$CPU_OPT" + owc*) + ngx_makefile=makefile.owc + ngx_opt="CPU_OPT=$CPU_OPT" ;; -esac - - -case $PLATFORM in - - win32) - line=`echo $ZLIB/zlib.lib: | sed -e "s/\//$ngx_regex_dirsep/g"` - echo "$line" >> $MAKEFILE - ;; - - *) - echo "$ZLIB/libz.a:" >> $MAKEFILE + bcc) + ngx_makefile=makefile.bcc + ngx_opt="-DCPU_OPT=$CPU_OPT" ;; esac @@ -43,12 +29,16 @@ done=NO case $PLATFORM in win32) - zlib=`echo $ZLIB | sed -e "s/\//$ngx_regex_dirsep/g"` + cp auto/lib/zlib/$ngx_makefile $ZLIB + + cat << END >> $NGX_MAKEFILE - cp auto/lib/zlib/$makefile $ZLIB - echo " cd $zlib" >> $MAKEFILE - echo " \$(MAKE) -f $makefile $opt" >> $MAKEFILE - echo " cd ..\\..\\.." >> $MAKEFILE +`echo "$ZLIB/zlib.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` + cd `echo $ZLIB | sed -e "s/\//$ngx_regex_dirsep/g"` + \$(MAKE) -f $ngx_makefile $ngx_opt + cd ..\\..\\.. + +END done=YES ;; @@ -59,23 +49,35 @@ case $PLATFORM in *:i386 | *:i686) case $ZLIB_ASM in pentium) - echo " cd $ZLIB \\" >> $MAKEFILE - echo " && cp contrib/asm586/match.S . \\" >> $MAKEFILE - echo " && CFLAGS=\"$ZLIB_OPT -DASMV\" \\" >> $MAKEFILE - echo " CC=\"\$(CC)\" \\" >> $MAKEFILE - echo " ./configure \\" >> $MAKEFILE - echo " && \$(MAKE) OBJA=match.o libz.a" >> $MAKEFILE + + cat << END >> $NGX_MAKEFILE + +$ZLIB/libz.a: $NGX_MAKEFILE + cd $ZLIB \\ + && make clean \\ + && cp contrib/asm586/match.S . \\ + && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\ + ./configure \\ + && \$(MAKE) OBJA=match.o libz.a + +END done=YES ;; pentiumpro) - echo " cd $ZLIB \\" >> $MAKEFILE - echo " && cp contrib/asm686/match.S . \\" >> $MAKEFILE - echo " && CFLAGS=\"$ZLIB_OPT -DASMV\" \\" >> $MAKEFILE - echo " CC=\"\$(CC)\" \\" >> $MAKEFILE - echo " ./configure \\" >> $MAKEFILE - echo " && \$(MAKE) OBJA=match.o libz.a" >> $MAKEFILE + + cat << END >> $NGX_MAKEFILE + +$ZLIB/libz.a: $NGX_MAKEFILE + cd $ZLIB \\ + && make clean \\ + && cp contrib/asm686/match.S . \\ + && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\ + ./configure \\ + && \$(MAKE) OBJA=match.o libz.a + +END done=YES ;; @@ -97,11 +99,16 @@ esac if [ $done = NO ]; then - echo " cd $ZLIB \\" >> $MAKEFILE - echo " && CFLAGS=\"$ZLIB_OPT\" CC=\"\$(CC)\" \\" >> $MAKEFILE - echo " ./configure \\" >> $MAKEFILE - echo " && \$(MAKE) libz.a" >> $MAKEFILE + + cat << END >> $NGX_MAKEFILE + +$ZLIB/libz.a: $NGX_MAKEFILE + cd $ZLIB \\ + && make clean \\ + && CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\ + ./configure \\ + && \$(MAKE) libz.a + +END + fi - - -echo >> $MAKEFILE diff --git a/auto/make b/auto/make --- a/auto/make +++ b/auto/make @@ -12,7 +12,7 @@ ngx_objs_dir=$NGX_OBJS$ngx_regex_dirsep ngx_use_pch=`echo $NGX_USE_PCH | sed -e "s/\//$ngx_regex_dirsep/g"` -cat << END >> $NGX_MAKEFILE +cat << END > $NGX_MAKEFILE CC = $CC CFLAGS = $CFLAGS @@ -49,7 +49,7 @@ ngx_all_srcs="$CORE_SRCS" # the core dependences and include pathes -ngx_deps=`echo $CORE_DEPS $NGX_PCH \ +ngx_deps=`echo $CORE_DEPS $NGX_AUTO_CONFIG_H $NGX_PCH \ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ -e "s/\//$ngx_regex_dirsep/g"` diff --git a/auto/modules b/auto/modules --- a/auto/modules +++ b/auto/modules @@ -7,6 +7,7 @@ if [ $EVENT_SELECT = NO -a $EVENT_FOUND fi if [ $EVENT_SELECT = YES ]; then + have=HAVE_SELECT . auto/have CORE_SRCS="$CORE_SRCS $SELECT_SRCS" EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE" fi @@ -17,6 +18,7 @@ if [ $EVENT_POLL = NO -a $EVENT_FOUND = fi if [ $EVENT_POLL = YES ]; then + have=HAVE_POLL . auto/have CORE_SRCS="$CORE_SRCS $POLL_SRCS" EVENT_MODULES="$EVENT_MODULES $POLL_MODULE" fi diff --git a/auto/options b/auto/options --- a/auto/options +++ b/auto/options @@ -52,6 +52,8 @@ HTTP_PROXY=YES IMAP=NO +MODULES= + USE_PCRE=NO PCRE=NONE PCRE_OPT= @@ -118,6 +120,8 @@ do --with-imap) IMAP=YES ;; + --with-module=*) NGX_MODULES="$NGX_MODULES $values" ;; + --with-cc=*) CC="$value" ;; --with-cpp=*) CPP="$value" ;; --with-cc-opt=*) NGX_CC_OPT="$value" ;; diff --git a/auto/os/freebsd b/auto/os/freebsd --- a/auto/os/freebsd +++ b/auto/os/freebsd @@ -97,9 +97,20 @@ fi if [ $EVENT_AIO = YES ]; then - have=HAVE_AIO . auto/have - EVENT_MODULES="$EVENT_MODULES $AIO_MODULE" - CORE_SRCS="$CORE_SRCS $AIO_SRCS" -else - have=HAVE_AIO . auto/nohave + if [ \( $version -lt 500000 -a $version -ge 430000 \) \ + -o $version -ge 500014 ] + then + have=HAVE_AIO . auto/have + EVENT_MODULES="$EVENT_MODULES $AIO_MODULE" + CORE_SRCS="$CORE_SRCS $AIO_SRCS" + else + +cat << END + +$0: error: the kqueue does not support AIO on this FreeBSD version + +END + + exit 1 + fi fi diff --git a/auto/os/linux b/auto/os/linux --- a/auto/os/linux +++ b/auto/os/linux @@ -48,7 +48,7 @@ fi ngx_feature="epoll" ngx_feature_name="epoll" -ngx_feature_run=yes +ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_libs= ngx_feature_test="int efd = 0, fd = 1, n; diff --git a/auto/unix b/auto/unix --- a/auto/unix +++ b/auto/unix @@ -73,6 +73,15 @@ ngx_param=TIME_T_LEN; ngx_value=$ngx_max # syscalls, libc calls and some features +ngx_feature="setproctitle()" +ngx_feature_name="HAVE_SETPROCTITLE" +ngx_feature_run=no +ngx_feature_incs= +ngx_feature_libs= +ngx_feature_test="setproctitle(\"test\");" +. auto/feature + + ngx_feature="pread()" ngx_feature_name="pread" ngx_feature_run=no diff --git a/configure b/configure --- a/configure +++ b/configure @@ -11,6 +11,8 @@ test -d $OBJS || mkdir $OBJS echo > $NGX_AUTO_HEADERS_H echo > $NGX_AUTO_CONFIG_H +echo > $NGX_AUTOCONF_ERR + if [ $DEBUG = YES ]; then have=NGX_DEBUG . auto/have 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_VER "nginx/0.1.7" +#define NGINX_VER "nginx/0.1.8" #define NGINX_VAR "NGINX" #define NGX_NEWPID_EXT ".newbin" diff --git a/src/core/ngx_array.h b/src/core/ngx_array.h --- a/src/core/ngx_array.h +++ b/src/core/ngx_array.h @@ -26,7 +26,7 @@ void ngx_destroy_array(ngx_array_t *a); void *ngx_push_array(ngx_array_t *a); -ngx_inline static ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, +static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) { if (!(array->elts = ngx_palloc(pool, n * size))) { 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 @@ -109,7 +109,7 @@ typedef long ngx_flag_t; /* TODO: auto_conf: ngx_inline inline __inline __inline__ */ #ifndef ngx_inline -#define ngx_inline inline +#define ngx_inline __inline #endif #define NGX_ACCEPT_THRESHOLD 100 diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c --- a/src/core/ngx_connection.c +++ b/src/core/ngx_connection.c @@ -299,7 +299,7 @@ void ngx_close_listening_sockets(ngx_cyc } } - if (ngx_close_socket(ls[i].fd) == -1) { + if (ngx_close_socket(fd) == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, ngx_close_socket_n " %V failed", &ls[i].addr_text); } diff --git a/src/core/ngx_crc.h b/src/core/ngx_crc.h --- a/src/core/ngx_crc.h +++ b/src/core/ngx_crc.h @@ -10,7 +10,7 @@ /* 32-bit crc16 */ -ngx_inline static uint32_t ngx_crc(char *data, size_t len) +static ngx_inline uint32_t ngx_crc(char *data, size_t len) { uint32_t sum; diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c --- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c @@ -49,6 +49,8 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t ngx_list_part_t *part; ngx_open_file_t *file; ngx_listening_t *ls, *nls; + ngx_core_conf_t *ccf; + ngx_event_conf_t *ecf; ngx_core_module_t *module; log = old_cycle->log; @@ -204,6 +206,16 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t if (!failed) { + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, + ngx_core_module); + + if (ngx_create_pathes(cycle, ccf->user) == NGX_ERROR) { + failed = 1; + } + } + + + if (!failed) { /* open the new files */ @@ -421,6 +433,13 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t } } + + ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); + + ngx_log_error(NGX_LOG_INFO, cycle->log, 0, + "using the \"%s\" event method", ecf->name); + + /* close and delete stuff that lefts from an old cycle */ /* close the unneeded listening sockets */ @@ -697,16 +716,6 @@ void ngx_reopen_files(ngx_cycle_t *cycle } #else if (user != (ngx_uid_t) -1) { - if (chown((const char *) file[i].name.data, user, -1) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chown \"%s\" failed", file[i].name.data); - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - } if (ngx_file_info((const char *) file[i].name.data, &fi) == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, @@ -720,14 +729,27 @@ void ngx_reopen_files(ngx_cycle_t *cycle } } + if (fi.st_uid != user) { + if (chown((const char *) file[i].name.data, user, -1) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "chown(\"%s\", %d) failed", + file[i].name.data, user); + + if (ngx_close_file(fd) == NGX_FILE_ERROR) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + ngx_close_file_n " \"%s\" failed", + file[i].name.data); + } + } + } + if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) { fi.st_mode |= (S_IRUSR|S_IWUSR); if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chmod \"%s\" failed", - file[i].name.data); + "chmod() \"%s\" failed", file[i].name.data); if (ngx_close_file(fd) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, 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 @@ -12,9 +12,9 @@ static ngx_uint_t ngx_temp_number; static ngx_uint_t ngx_random; -int ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) +ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) { - int rc; + ngx_int_t rc; if (tf->file.fd == NGX_INVALID_FILE) { rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool, @@ -33,16 +33,17 @@ int ngx_write_chain_to_temp_file(ngx_tem } -int ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, - ngx_pool_t *pool, int persistent) +ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, + ngx_pool_t *pool, int persistent) { - int num; - ngx_err_t err; + ngx_err_t err; + uint32_t num; file->name.len = path->name.len + 1 + path->len + 10; - ngx_test_null(file->name.data, ngx_palloc(pool, file->name.len + 1), - NGX_ERROR); + if (!(file->name.data = ngx_palloc(pool, file->name.len + 1))) { + return NGX_ERROR; + } #if 0 for (i = 0; i < file->name.len; i++) { @@ -52,11 +53,11 @@ int ngx_create_temp_file(ngx_file_t *fil ngx_memcpy(file->name.data, path->name.data, path->name.len); - num = ngx_next_temp_number(0); + num = (uint32_t) ngx_next_temp_number(0); for ( ;; ) { ngx_sprintf(file->name.data + path->name.len + 1 + path->len, - "%010ud%Z", num); + "%010ui%Z", num); ngx_create_hashed_filename(file, path); @@ -85,7 +86,8 @@ int ngx_create_temp_file(ngx_file_t *fil #if (NGX_WIN32) && err != NGX_ENOTDIR #endif - )) { + )) + { ngx_log_error(NGX_LOG_CRIT, file->log, err, ngx_open_tempfile_n " \"%s\" failed", file->name.data); @@ -101,8 +103,7 @@ int ngx_create_temp_file(ngx_file_t *fil void ngx_create_hashed_filename(ngx_file_t *file, ngx_path_t *path) { - int i, name, pos; - size_t level; + ngx_uint_t i, name, pos, level; name = file->name.len; pos = path->name.len + 1; @@ -127,7 +128,7 @@ void ngx_create_hashed_filename(ngx_file } -int ngx_create_path(ngx_file_t *file, ngx_path_t *path) +ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path) { int i, pos; ngx_err_t err; @@ -189,32 +190,28 @@ char *ngx_conf_set_path_slot(ngx_conf_t { char *p = conf; - ngx_int_t level; + ssize_t level; ngx_uint_t i, n; ngx_str_t *value; - ngx_path_t *path, **pp; + ngx_path_t *path, **pp, **slot; - pp = (ngx_path_t **) (p + cmd->offset); + slot = (ngx_path_t **) (p + cmd->offset); - if (*pp) { + if (*slot) { return "is duplicate"; } - /* TODO: check duplicate in cf->cycle->pathes */ - - ngx_test_null(path, ngx_pcalloc(cf->pool, sizeof(ngx_path_t)), - NGX_CONF_ERROR); + if (!(path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)))) { + return NGX_CONF_ERROR; + } - *pp = path; - - ngx_test_null(pp, ngx_push_array(&cf->cycle->pathes), NGX_CONF_ERROR); - *pp = path; - - value = (ngx_str_t *) cf->args->elts; + value = cf->args->elts; path->name = value[1]; - path->len = 0; + path->gc_handler = (ngx_gc_handler_pt) cmd->post; + path->conf_file = cf->conf_file->file.name.data; + path->line = cf->conf_file->line; for (i = 0, n = 2; n < cf->args->nelts; i++, n++) { level = ngx_atoi(value[n].data, value[n].len); @@ -230,7 +227,102 @@ char *ngx_conf_set_path_slot(ngx_conf_t path->level[i++] = 0; } - path->gc_handler = (ngx_gc_handler_pt) cmd->post; + + pp = cf->cycle->pathes.elts; + for (i = 0; i < cf->cycle->pathes.nelts; i++) { + if (pp[i]->name.len == path->name.len + && ngx_strcmp(pp[i]->name.data, path->name.data) == 0) + { + for (n = 0; n < 3; n++) { + if (pp[i]->level[n] != path->level[n]) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "the same \"%V\" path name in %s:%ui " + "has the different levels than", + &pp[i]->name, pp[i]->conf_file, pp[i]->line); + return NGX_CONF_ERROR; + } + + if (pp[i]->level[n] == 0) { + break; + } + } + + *slot = pp[i]; + + return NGX_CONF_OK; + } + } + + *slot = path; + + + if (!(pp = ngx_array_push(&cf->cycle->pathes))) { + return NGX_CONF_ERROR; + } + + *pp = path; return NGX_CONF_OK; } + + +ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user) +{ + ngx_err_t err; + ngx_uint_t i; + ngx_path_t **path; +#if !(NGX_WIN32) + ngx_file_info_t fi; +#endif + + path = cycle->pathes.elts; + for (i = 0; i < cycle->pathes.nelts; i++) { + + if (ngx_create_dir(path[i]->name.data) == NGX_FILE_ERROR) { + err = ngx_errno; + if (err != NGX_EEXIST) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, err, + ngx_create_dir_n " \"%s\" failed", + path[i]->name.data); + return NGX_ERROR; + } + } + + if (user == (ngx_uid_t) -1) { + continue; + } + +#if !(NGX_WIN32) + + if (ngx_file_info((const char *) path[i]->name.data, &fi) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + ngx_file_info_n " \"%s\" failed", path[i]->name.data); + return NGX_ERROR; + } + + if (fi.st_uid != user) { + if (chown((const char *) path[i]->name.data, user, -1) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "chown(\"%s\", %d) failed", + path[i]->name.data, user); + return NGX_ERROR; + } + } + + if ((fi.st_mode & (S_IRUSR|S_IWUSR|S_IXUSR)) + != (S_IRUSR|S_IWUSR|S_IXUSR)) + { + fi.st_mode |= (S_IRUSR|S_IWUSR|S_IXUSR); + + if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "chmod() \"%s\" failed", path[i]->name.data); + return NGX_ERROR; + } + } + +#endif + } + + return NGX_OK; +} 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 @@ -17,44 +17,48 @@ typedef struct ngx_path_s ngx_path_t; struct ngx_file_s { - ngx_fd_t fd; - ngx_str_t name; - ngx_file_info_t info; + ngx_fd_t fd; + ngx_str_t name; + ngx_file_info_t info; - off_t offset; - off_t sys_offset; + off_t offset; + off_t sys_offset; - ngx_log_t *log; + ngx_log_t *log; - ngx_uint_t valid_info:1; /* unsigned valid_info:1; */ + ngx_uint_t valid_info:1; /* unsigned valid_info:1; */ }; #define NGX_MAX_PATH_LEVEL 3 struct ngx_path_s { ngx_str_t name; - u_int len; - u_int level[3]; + ngx_uint_t len; + ngx_uint_t level[3]; ngx_gc_handler_pt gc_handler; + + u_char *conf_file; + ngx_uint_t line; }; typedef struct { - ngx_file_t file; - off_t offset; - ngx_path_t *path; - ngx_pool_t *pool; - char *warn; + ngx_file_t file; + off_t offset; + ngx_path_t *path; + ngx_pool_t *pool; + char *warn; - unsigned persistent:1; + unsigned persistent:1; } ngx_temp_file_t; -int ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain); -int ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, - ngx_pool_t *pool, int persistent); +ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain); +ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, + ngx_pool_t *pool, int persistent); void ngx_create_hashed_filename(ngx_file_t *file, ngx_path_t *path); -int ngx_create_path(ngx_file_t *file, ngx_path_t *path); +ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path); +ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user); void ngx_init_temp_number(); ngx_uint_t ngx_next_temp_number(ngx_uint_t collision); diff --git a/src/core/ngx_garbage_collector.c b/src/core/ngx_garbage_collector.c --- a/src/core/ngx_garbage_collector.c +++ b/src/core/ngx_garbage_collector.c @@ -9,71 +9,8 @@ #include -int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name, - ngx_dir_t *dir); - -static int ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level); - - - -#if 0 - -{ - ngx_test_null(cycle->timer_events, - ngx_alloc(sizeof(ngx_event_t) * TIMERS, cycle->log), - NGX_ERROR); - - ngx_event_timer_init(cycle); -} - - -void garbage_collector() -{ - ngx_msec_t timer; - struct timeval tv; - ngx_epoch_msec_t delta; - - for ( ;; ) { - timer = ngx_event_find_timer(); - - ngx_gettimeofday(&tv); - delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; - - msleep(timer); - - ngx_gettimeofday(&tv); - - ngx_cached_time = tv.tv_sec; - ngx_time_update(); - - delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; - - ngx_event_expire_timers((ngx_msec_t) delta); - } -} - -#endif - - -void stub_init(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_gc_t ctx; - ngx_path_t **path; - - path = cycle->pathes.elts; - for (i = 0; i < cycle->pathes.nelts; i++) { - ctx.path = path[i]; - ctx.log = cycle->log; - ctx.handler = path[i]->gc_handler; - - ngx_collect_garbage(&ctx, &path[i]->name, 0); - } -} - - -static int ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level) +ngx_int_t ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level) { int rc; u_char *last; @@ -224,7 +161,8 @@ static int ngx_collect_garbage(ngx_gc_t } else { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, - "\"%s\" has unknown file type, deleting", fname.data); + "the file \"%s\" has unknown type, deleting", + fname.data); if (ngx_delete_file(fname.data) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, @@ -249,8 +187,8 @@ static int ngx_collect_garbage(ngx_gc_t } -int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name, - ngx_dir_t *dir) +ngx_int_t ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name, + ngx_dir_t *dir) { /* * We use mtime only and do not use atime because: @@ -264,7 +202,7 @@ int ngx_garbage_collector_temp_handler(n } ngx_log_error(NGX_LOG_NOTICE, ctx->log, 0, - "delete stale temporary \"%s\"", name->data); + "delete the stale temporary file \"%s\"", name->data); if (ngx_delete_file(name->data) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, diff --git a/src/core/ngx_garbage_collector.h b/src/core/ngx_garbage_collector.h --- a/src/core/ngx_garbage_collector.h +++ b/src/core/ngx_garbage_collector.h @@ -23,8 +23,9 @@ struct ngx_gc_s { }; -int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name, - ngx_dir_t *dir); +ngx_int_t ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level); +ngx_int_t ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name, + ngx_dir_t *dir); #endif /* _NGX_GARBAGE_COLLECTOR_H_INCLUDED_ */ diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -20,7 +20,7 @@ */ -ngx_inline static size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len) +static ngx_inline size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len) { size_t n; ngx_uint_t c1, c2; diff --git a/src/core/ngx_list.h b/src/core/ngx_list.h --- a/src/core/ngx_list.h +++ b/src/core/ngx_list.h @@ -30,7 +30,7 @@ typedef struct { } ngx_list_t; -ngx_inline static ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, +static ngx_inline ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size) { if (!(list->part.elts = ngx_palloc(pool, n * size))) { 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 @@ -155,8 +155,15 @@ static void ngx_log_write(ngx_log_t *log errstr[len++] = CR; errstr[len++] = LF; + WriteFile(log->file->fd, errstr, len, &written, NULL); +#if 0 + if (WriteFile(log->file->fd, errstr, len, &written, NULL) == 0) { + ngx_message_box("nginx", MB_OK, ngx_errno, "WriteFile() failed"); + } +#endif + #else if (len == NGX_MAX_ERROR_STR) { @@ -164,6 +171,7 @@ static void ngx_log_write(ngx_log_t *log } errstr[len++] = LF; + write(log->file->fd, errstr, len); #endif diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c --- a/src/core/ngx_output_chain.c +++ b/src/core/ngx_output_chain.c @@ -12,7 +12,7 @@ #define NGX_NONE 1 -ngx_inline static ngx_int_t +static ngx_inline ngx_int_t ngx_output_chain_need_to_copy(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf); static ngx_int_t ngx_output_chain_copy_buf(ngx_buf_t *dst, ngx_buf_t *src, ngx_uint_t sendfile); @@ -188,7 +188,7 @@ ngx_int_t ngx_output_chain(ngx_output_ch } -ngx_inline static ngx_int_t +static ngx_inline ngx_int_t ngx_output_chain_need_to_copy(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf) { if (ngx_buf_special(buf)) { diff --git a/src/core/ngx_rbtree.c b/src/core/ngx_rbtree.c --- a/src/core/ngx_rbtree.c +++ b/src/core/ngx_rbtree.c @@ -20,12 +20,12 @@ #define ngx_rbt_copy_color(n1, n2) (n1->color = n2->color) -ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root, - ngx_rbtree_t *sentinel, - ngx_rbtree_t *node); -ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root, - ngx_rbtree_t *sentinel, - ngx_rbtree_t *node); +static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root, + ngx_rbtree_t *sentinel, + ngx_rbtree_t *node); +static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root, + ngx_rbtree_t *sentinel, + ngx_rbtree_t *node); void ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel, @@ -289,9 +289,9 @@ void ngx_rbtree_delete(ngx_rbtree_t **ro } -ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root, - ngx_rbtree_t *sentinel, - ngx_rbtree_t *node) +static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root, + ngx_rbtree_t *sentinel, + ngx_rbtree_t *node) { ngx_rbtree_t *temp; @@ -319,9 +319,9 @@ ngx_inline void ngx_rbtree_left_rotate(n } -ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root, - ngx_rbtree_t *sentinel, - ngx_rbtree_t *node) +static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root, + ngx_rbtree_t *sentinel, + ngx_rbtree_t *node) { ngx_rbtree_t *temp; diff --git a/src/core/ngx_rbtree.h b/src/core/ngx_rbtree.h --- a/src/core/ngx_rbtree.h +++ b/src/core/ngx_rbtree.h @@ -29,7 +29,7 @@ void ngx_rbtree_delete(ngx_rbtree_t **ro ngx_rbtree_t *node); -ngx_inline static ngx_rbtree_t *ngx_rbtree_min(ngx_rbtree_t *node, +static ngx_inline ngx_rbtree_t *ngx_rbtree_min(ngx_rbtree_t *node, ngx_rbtree_t *sentinel) { while (node->left != sentinel) { diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c --- a/src/core/ngx_string.c +++ b/src/core/ngx_string.c @@ -135,6 +135,11 @@ u_char *ngx_vsnprintf(u_char *buf, size_ fmt++; continue; + case 'm': + width = NGX_INT_T_LEN; + fmt++; + continue; + case 'X': hexadecimal = 2; sign = 0; 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 @@ -12,31 +12,12 @@ #define DEFAULT_CONNECTIONS 512 +extern ngx_module_t ngx_kqueue_module; +extern ngx_module_t ngx_devpoll_module; +extern ngx_module_t ngx_epoll_module; +extern ngx_module_t ngx_rtsig_module; extern ngx_module_t ngx_select_module; -extern ngx_event_module_t ngx_select_module_ctx; - -#if (HAVE_KQUEUE) -#include -#endif - -#if (HAVE_DEVPOLL) -extern ngx_module_t ngx_devpoll_module; -extern ngx_event_module_t ngx_devpoll_module_ctx; -#endif -#if (HAVE_EPOLL) -extern ngx_module_t ngx_epoll_module; -extern ngx_event_module_t ngx_epoll_module_ctx; -#endif - -#if (HAVE_RTSIG) -extern ngx_module_t ngx_rtsig_module; -extern ngx_event_module_t ngx_rtsig_module_ctx; -#endif - -#if (HAVE_AIO) -#include -#endif static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle); static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle); @@ -631,13 +612,13 @@ static char *ngx_event_use(ngx_conf_t *c && old_ecf->use != ecf->use) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "when the server runs without a master process " - "the \"%V\" event type must be the same as " - "in previous configuration - \"%s\" " - "and it can not be changed on the fly, " - "to change it you need to stop server " - "and start it again", - &value[1], old_ecf->name); + "when the server runs without a master process " + "the \"%V\" event type must be the same as " + "in previous configuration - \"%s\" " + "and it can not be changed on the fly, " + "to change it you need to stop server " + "and start it again", + &value[1], old_ecf->name); return NGX_CONF_ERROR; } @@ -726,99 +707,122 @@ static void *ngx_event_create_conf(ngx_c static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) { ngx_event_conf_t *ecf = conf; + + int fd, rtsig; + ngx_int_t i, connections; + ngx_module_t *module; + ngx_core_conf_t *ccf; + ngx_event_module_t *event_module; + + connections = NGX_CONF_UNSET_UINT; + module = NULL; + rtsig = 0; + fd = 0; + +#if (HAVE_EPOLL) && !(TEST_BUILD_EPOLL) + + fd = epoll_create(100); + + if (fd != -1) { + close(fd); + connections = DEFAULT_CONNECTIONS; + module = &ngx_epoll_module; + + } else if (ngx_errno != NGX_ENOSYS) { + connections = DEFAULT_CONNECTIONS; + module = &ngx_epoll_module; + } + +#endif + #if (HAVE_RTSIG) - ngx_core_conf_t *ccf; + + if (module == NULL) { + connections = DEFAULT_CONNECTIONS; + module = &ngx_rtsig_module; + rtsig = 1; + } + +#endif + +#if (HAVE_DEVPOLL) + + connections = DEFAULT_CONNECTIONS; + module = &ngx_devpoll_module; + #endif #if (HAVE_KQUEUE) - ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS); - ngx_conf_init_unsigned_value(ecf->use, ngx_kqueue_module.ctx_index); - ngx_conf_init_ptr_value(ecf->name, ngx_kqueue_module_ctx.name->data); - -#elif (HAVE_DEVPOLL) - - ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS); - ngx_conf_init_unsigned_value(ecf->use, ngx_devpoll_module.ctx_index); - ngx_conf_init_ptr_value(ecf->name, ngx_devpoll_module_ctx.name->data); - -#elif (HAVE_EPOLL) + connections = DEFAULT_CONNECTIONS; + module = &ngx_kqueue_module; - ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS); - ngx_conf_init_unsigned_value(ecf->use, ngx_epoll_module.ctx_index); - ngx_conf_init_ptr_value(ecf->name, ngx_epoll_module_ctx.name->data); - -#elif (HAVE_RTSIG) +#endif - ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS); - ngx_conf_init_unsigned_value(ecf->use, ngx_rtsig_module.ctx_index); - ngx_conf_init_ptr_value(ecf->name, ngx_rtsig_module_ctx.name->data); +#if (HAVE_SELECT) -#elif (HAVE_SELECT) + if (module == NULL) { #if (NGX_WIN32) - ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS); + connections = DEFAULT_CONNECTIONS; #else - ngx_conf_init_unsigned_value(ecf->connections, - FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE : DEFAULT_CONNECTIONS); + connections = FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE: + DEFAULT_CONNECTIONS; +#endif + module = &ngx_select_module; + } + #endif - ngx_conf_init_unsigned_value(ecf->use, ngx_select_module.ctx_index); - ngx_conf_init_ptr_value(ecf->name, ngx_select_module_ctx.name->data); - -#else - - ngx_int_t i, m; - ngx_event_module_t *module; - - m = -1; - module = NULL; + if (module == NULL) { + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->type == NGX_EVENT_MODULE) { + event_module = ngx_modules[i]->ctx; - for (i = 0; ngx_modules[i]; i++) { - if (ngx_modules[i]->type == NGX_EVENT_MODULE) { - module = ngx_modules[i]->ctx; + if (ngx_strcmp(event_module->name->data, event_core_name.data) + == 0) + { + continue; + } - if (ngx_strcmp(module->name->data, event_core_name.data) == 0) { - continue; + module = ngx_modules[i]; + break; } - - m = ngx_modules[i]->ctx_index; - break; } } - if (m == -1) { + if (module == NULL) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found"); return NGX_CONF_ERROR; } - ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS); + ngx_conf_init_unsigned_value(ecf->connections, connections); + cycle->connection_n = ecf->connections; - ngx_conf_init_unsigned_value(ecf->use, m); - ngx_conf_init_ptr_value(ecf->name, module->name->data); + ngx_conf_init_unsigned_value(ecf->use, module->ctx_index); -#endif - - cycle->connection_n = ecf->connections; + event_module = module->ctx; + ngx_conf_init_ptr_value(ecf->name, event_module->name->data); ngx_conf_init_value(ecf->multi_accept, 0); ngx_conf_init_value(ecf->accept_mutex, 1); ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500); -#if (HAVE_RTSIG) - if (ecf->use == ngx_rtsig_module.ctx_index && ecf->accept_mutex == 0) { - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, - ngx_core_module); - if (ccf->worker_processes) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "the \"rtsig\" method requires " - "\"accept_mutex\" to be on"); - return NGX_CONF_ERROR; - } + + if (!rtsig || ecf->accept_mutex) { + return NGX_CONF_OK; } -#endif + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - return NGX_CONF_OK; + if (ccf->worker_processes == 0) { + return NGX_CONF_OK; + } + + ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, + "the \"rtsig\" method requires \"accept_mutex\" to be on"); + + return NGX_CONF_ERROR; } 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 @@ -496,7 +496,7 @@ ngx_int_t ngx_send_lowat(ngx_connection_ -ngx_inline static int ngx_handle_read_event(ngx_event_t *rev, u_int flags) +static ngx_inline ngx_int_t ngx_handle_read_event(ngx_event_t *rev, u_int flags) { if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { @@ -540,7 +540,7 @@ ngx_inline static int ngx_handle_read_ev } -ngx_inline static int ngx_handle_level_read_event(ngx_event_t *rev) +static ngx_inline ngx_int_t ngx_handle_level_read_event(ngx_event_t *rev) { if (ngx_event_flags & NGX_USE_LEVEL_EVENT) { if (!rev->active && !rev->ready) { @@ -566,7 +566,8 @@ ngx_inline static int ngx_handle_level_r } -ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, size_t lowat) +static ngx_inline ngx_int_t ngx_handle_write_event(ngx_event_t *wev, + size_t lowat) { ngx_connection_t *c; @@ -622,7 +623,7 @@ ngx_inline static int ngx_handle_write_e } -ngx_inline static int ngx_handle_level_write_event(ngx_event_t *wev) +static ngx_inline ngx_int_t ngx_handle_level_write_event(ngx_event_t *wev) { if (ngx_event_flags & NGX_USE_LEVEL_EVENT) { if (!wev->active && !wev->ready) { diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c --- a/src/event/ngx_event_pipe.c +++ b/src/event/ngx_event_pipe.c @@ -14,10 +14,10 @@ static ngx_int_t ngx_event_pipe_read_ups static ngx_int_t ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p); static ngx_int_t ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p); -ngx_inline static void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf); -ngx_inline static void ngx_event_pipe_free_shadow_raw_buf(ngx_chain_t **free, +static ngx_inline void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf); +static ngx_inline void ngx_event_pipe_free_shadow_raw_buf(ngx_chain_t **free, ngx_buf_t *buf); -ngx_inline static void ngx_event_pipe_add_free_buf(ngx_chain_t **chain, +static ngx_inline void ngx_event_pipe_add_free_buf(ngx_chain_t **chain, ngx_chain_t *cl); static ngx_int_t ngx_event_pipe_drain_chains(ngx_event_pipe_t *p); @@ -676,7 +676,7 @@ ngx_int_t ngx_event_pipe_copy_input_filt } -ngx_inline static void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf) +static ngx_inline void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf) { ngx_buf_t *b, *next; @@ -706,7 +706,7 @@ ngx_inline static void ngx_event_pipe_re } -ngx_inline static void ngx_event_pipe_free_shadow_raw_buf(ngx_chain_t **free, +static ngx_inline void ngx_event_pipe_free_shadow_raw_buf(ngx_chain_t **free, ngx_buf_t *buf) { ngx_buf_t *s; @@ -735,7 +735,7 @@ ngx_inline static void ngx_event_pipe_fr } -ngx_inline static void ngx_event_pipe_add_free_buf(ngx_chain_t **chain, +static ngx_inline void ngx_event_pipe_add_free_buf(ngx_chain_t **chain, ngx_chain_t *cl) { if (*chain == NULL) { diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h @@ -42,7 +42,7 @@ extern ngx_thread_volatile ngx_rbtree_t extern ngx_rbtree_t ngx_event_timer_sentinel; -ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) +static ngx_inline void ngx_event_del_timer(ngx_event_t *ev) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, "event timer del: %d: %d", @@ -68,7 +68,7 @@ ngx_inline static void ngx_event_del_tim } -ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) +static ngx_inline void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) { ngx_int_t key; diff --git a/src/http/modules/ngx_http_autoindex_handler.c b/src/http/modules/ngx_http_autoindex_handler.c --- a/src/http/modules/ngx_http_autoindex_handler.c +++ b/src/http/modules/ngx_http_autoindex_handler.c @@ -304,10 +304,9 @@ static ngx_int_t ngx_http_autoindex_hand + 1 /* 1 is for "/" */ + entry[i].name.len + entry[i].escape + sizeof("\">") - 1 - + NGX_HTTP_AUTOINDEX_NAME_LEN + + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof(">") - 2 + sizeof("") - 1 - + 1 - + sizeof("28-Sep-1970 12:00 ") - 1 + + sizeof(" 28-Sep-1970 12:00 ") - 1 + sizeof("1023G") - 1 + 2; } diff --git a/src/http/modules/ngx_http_range_filter.c b/src/http/modules/ngx_http_range_filter.c --- a/src/http/modules/ngx_http_range_filter.c +++ b/src/http/modules/ngx_http_range_filter.c @@ -340,7 +340,7 @@ static ngx_int_t ngx_http_range_header_f return NGX_ERROR; } - boundary = ngx_next_temp_number(0); + boundary = (uint32_t) ngx_next_temp_number(0); /* * The boundary header of the range: diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c --- a/src/http/modules/proxy/ngx_http_proxy_handler.c +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c @@ -165,6 +165,13 @@ static ngx_command_t ngx_http_proxy_com offsetof(ngx_http_proxy_loc_conf_t, temp_path), (void *) ngx_garbage_collector_temp_handler }, + { ngx_string("proxy_max_temp_file_size"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_size_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_proxy_loc_conf_t, max_temp_file_size), + NULL }, + { ngx_string("proxy_temp_file_write_size"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_conf_set_size_slot, @@ -954,12 +961,7 @@ static void *ngx_http_proxy_create_loc_c conf->read_timeout = NGX_CONF_UNSET_MSEC; conf->busy_buffers_size = NGX_CONF_UNSET_SIZE; - /* - * "proxy_max_temp_file_size" is hardcoded to 1G for reverse proxy, - * it should be configurable in the generic proxy - */ - conf->max_temp_file_size = 1024 * 1024 * 1024; - + conf->max_temp_file_size = NGX_CONF_UNSET_SIZE; conf->temp_file_write_size = NGX_CONF_UNSET_SIZE; /* "proxy_cyclic_temp_file" is disabled */ @@ -1059,11 +1061,25 @@ static char *ngx_http_proxy_merge_loc_co prev->max_temp_file_size, NGX_CONF_UNSET_SIZE); if (conf->max_temp_file_size == NGX_CONF_UNSET_SIZE) { - conf->max_temp_file_size = 2 * size; + + /* + * "proxy_max_temp_file_size" is set to 1G for reverse proxy, + * it should be much less in the generic proxy + */ + + conf->max_temp_file_size = 1024 * 1024 * 1024; - } else if (conf->max_temp_file_size < size) { +#if 0 + conf->max_temp_file_size = 2 * size; +#endif + + + } else if (conf->max_temp_file_size != 0 + && conf->max_temp_file_size < size) + { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_max_temp_file_size\" must be equal or bigger than " + "\"proxy_max_temp_file_size\" must be equal to zero to disable " + "the temporary files usage or must be equal or bigger than " "maximum of the value of \"proxy_header_buffer_size\" and " "one of the \"proxy_buffers\""); 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 @@ -13,7 +13,8 @@ #define NGX_HTTP_LOCATION_EXACT 1 #define NGX_HTTP_LOCATION_AUTO_REDIRECT 2 -#define NGX_HTTP_LOCATION_REGEX 3 +#define NGX_HTTP_LOCATION_NOREGEX 3 +#define NGX_HTTP_LOCATION_REGEX 4 static void ngx_http_phase_event_handler(ngx_event_t *rev); @@ -564,12 +565,13 @@ static ngx_int_t ngx_http_find_location( ngx_array_t *locations, size_t len) { ngx_int_t n, rc; - ngx_uint_t i, found; + ngx_uint_t i, found, noregex; ngx_http_core_loc_conf_t *clcf, **clcfp; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "find location"); found = 0; + noregex = 0; clcfp = locations->elts; for (i = 0; i < locations->nelts; i++) { @@ -619,6 +621,7 @@ static ngx_int_t ngx_http_find_location( } r->loc_conf = clcfp[i]->loc_conf; + noregex = clcfp[i]->noregex; found = 1; } } @@ -637,6 +640,10 @@ static ngx_int_t ngx_http_find_location( #if (NGX_PCRE) + if (noregex) { + return NGX_HTTP_LOCATION_NOREGEX; + } + /* regex matches */ for (/* void */; i < locations->nelts; i++) { @@ -1069,6 +1076,13 @@ static char *ngx_location_block(ngx_conf clcf->name = value[2]; clcf->exact_match = 1; + } else if (value[1].len == 2 + && value[1].data[0] == '^' + && value[1].data[1] == '~') + { + clcf->name = value[2]; + clcf->noregex = 1; + } else if ((value[1].len == 1 && value[1].data[0] == '~') || (value[1].len == 2 && value[1].data[0] == '~' 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 @@ -142,6 +142,8 @@ struct ngx_http_core_loc_conf_s { #endif unsigned exact_match:1; + unsigned noregex:1; + unsigned auto_redirect:1; unsigned alias:1; diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -34,6 +34,7 @@ typedef int ngx_err_t; #define NGX_ETIMEDOUT ETIMEDOUT #define NGX_ECONNREFUSED ECONNREFUSED #define NGX_EHOSTUNREACH EHOSTUNREACH +#define NGX_ENOSYS ENOSYS #define NGX_ECANCELED ECANCELED #define NGX_ENOMOREFILES 0 diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -109,7 +109,7 @@ ssize_t ngx_write_file(ngx_file_t *file, } -int ngx_open_tempfile(u_char *name, ngx_uint_t persistent) +ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent) { ngx_fd_t fd; @@ -216,7 +216,7 @@ ssize_t ngx_write_chain_to_file(ngx_file } -int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) +ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) { dir->dir = opendir((const char *) name->data); diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h --- a/src/os/unix/ngx_files.h +++ b/src/os/unix/ngx_files.h @@ -37,7 +37,7 @@ #define ngx_delete_file_n "unlink()" -int ngx_open_tempfile(u_char *name, ngx_uint_t persistent); +ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent); #define ngx_open_tempfile_n "open()" @@ -77,7 +77,7 @@ ssize_t ngx_write_chain_to_file(ngx_file #define NGX_DIR_MASK_LEN 0 -int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); +ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); #define ngx_open_dir_n "opendir()" 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 @@ -60,41 +60,23 @@ #include -#ifndef HAVE_SELECT -#define HAVE_SELECT 1 -#endif - - -#ifndef HAVE_POLL -#define HAVE_POLL 1 -#endif #if (HAVE_POLL) #include #endif - /* FreeBSD aio supported via kqueue */ - -#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ - || __FreeBSD_version >= 500014 - -#ifndef HAVE_AIO -#define HAVE_AIO 1 -#endif - -#endif #if (HAVE_AIO) #include #endif -#if defined SO_ACCEPTFILTER && !defined HAVE_DEFERRED_ACCEPT -#define HAVE_DEFERRED_ACCEPT 1 +#if (HAVE_KQUEUE) +#include #endif -#if (HAVE_KQUEUE) -#include +#if defined SO_ACCEPTFILTER && !defined HAVE_DEFERRED_ACCEPT +#define HAVE_DEFERRED_ACCEPT 1 #endif diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -63,19 +63,11 @@ extern ssize_t sendfile(int s, int fd, i #endif - -#ifndef HAVE_SELECT -#define HAVE_SELECT 1 -#endif - - -#ifndef HAVE_POLL -#define HAVE_POLL 1 -#endif #if (HAVE_POLL) #include #endif + #if (HAVE_EPOLL) #include #endif /* HAVE_EPOLL */ diff --git a/src/os/unix/ngx_linux_init.c b/src/os/unix/ngx_linux_init.c --- a/src/os/unix/ngx_linux_init.c +++ b/src/os/unix/ngx_linux_init.c @@ -30,8 +30,9 @@ ngx_os_io_t ngx_os_io = { ngx_int_t ngx_os_init(ngx_log_t *log) { - int name[2]; - size_t len; + int name[2]; + size_t len; + ngx_err_t err; name[0] = CTL_KERN; name[1] = KERN_OSTYPE; @@ -58,10 +59,16 @@ ngx_int_t ngx_os_init(ngx_log_t *log) name[1] = KERN_RTSIGMAX; len = sizeof(ngx_linux_rtsig_max); if (sysctl(name, sizeof(name), &ngx_linux_rtsig_max, &len, NULL, 0) == -1) { - ngx_log_error(NGX_LOG_INFO, log, ngx_errno, - "sysctl(KERN_RTSIGMAX) failed"); + err = ngx_errno; + + if (err != NGX_ENOTDIR) { + ngx_log_error(NGX_LOG_ALERT, log, err, + "sysctl(KERN_RTSIGMAX) failed"); + + return NGX_ERROR; + } + ngx_linux_rtsig_max = 0; - } ngx_init_setproctitle(log); diff --git a/src/os/unix/ngx_posix_config.h b/src/os/unix/ngx_posix_config.h --- a/src/os/unix/ngx_posix_config.h +++ b/src/os/unix/ngx_posix_config.h @@ -14,6 +14,11 @@ #endif +#if 0 +#define _REENTRANT +#endif + + #include #include #if (NGX_HAVE_UNISTD_H) @@ -65,14 +70,6 @@ #include -#ifndef HAVE_SELECT -#define HAVE_SELECT 1 -#endif - - -#ifndef HAVE_POLL -#define HAVE_POLL 1 -#endif #if (HAVE_POLL) #include #endif @@ -104,7 +101,11 @@ #endif +#if (NGX_HAVE_SETPROCTITLE) +#define ngx_setproctitle setproctitle +#else #define ngx_setproctitle(title) +#endif #define NGX_POSIX_IO 1 diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -12,15 +12,18 @@ static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type); +static void ngx_start_garbage_collector(ngx_cycle_t *cycle, ngx_int_t type); static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle); static void ngx_master_exit(ngx_cycle_t *cycle); static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data); +static void ngx_worker_process_init(ngx_cycle_t *cycle); static void ngx_channel_handler(ngx_event_t *ev); #if (NGX_THREADS) static void ngx_wakeup_worker_threads(ngx_cycle_t *cycle); static void *ngx_worker_thread_cycle(void *data); #endif +static void ngx_garbage_collector_cycle(ngx_cycle_t *cycle, void *data); ngx_uint_t ngx_process; @@ -109,6 +112,7 @@ void ngx_master_process_cycle(ngx_cycle_ ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN); + ngx_start_garbage_collector(cycle, NGX_PROCESS_RESPAWN); ngx_new_binary = 0; delay = 0; @@ -179,6 +183,7 @@ void ngx_master_process_cycle(ngx_cycle_ if (!ngx_noaccepting) { ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_JUST_RESPAWN); + ngx_start_garbage_collector(cycle, NGX_PROCESS_JUST_RESPAWN); live = 1; ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); @@ -193,6 +198,7 @@ void ngx_master_process_cycle(ngx_cycle_ ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN); + ngx_start_garbage_collector(cycle, NGX_PROCESS_RESPAWN); ngx_noaccepting = 0; continue; @@ -211,6 +217,7 @@ void ngx_master_process_cycle(ngx_cycle_ ngx_core_module); ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_JUST_RESPAWN); + ngx_start_garbage_collector(cycle, NGX_PROCESS_JUST_RESPAWN); live = 1; ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); @@ -220,6 +227,7 @@ void ngx_master_process_cycle(ngx_cycle_ ngx_restart = 0; ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN); + ngx_start_garbage_collector(cycle, NGX_PROCESS_RESPAWN); live = 1; } @@ -352,6 +360,47 @@ static void ngx_start_worker_processes(n } +static void ngx_start_garbage_collector(ngx_cycle_t *cycle, ngx_int_t type) +{ + ngx_int_t i; + ngx_channel_t ch; + + return; + + ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "start garbage collector"); + + ch.command = NGX_CMD_OPEN_CHANNEL; + + ngx_spawn_process(cycle, ngx_garbage_collector_cycle, NULL, + "garbage collector", type); + + ch.pid = ngx_processes[ngx_process_slot].pid; + ch.slot = ngx_process_slot; + ch.fd = ngx_processes[ngx_process_slot].channel[0]; + + for (i = 0; i < ngx_last_process; i++) { + + if (i == ngx_process_slot + || ngx_processes[i].pid == -1 + || ngx_processes[i].channel[0] == -1) + { + continue; + } + + ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d", + ch.slot, ch.pid, ch.fd, + i, ngx_processes[i].pid, + ngx_processes[i].channel[0]); + + /* TODO: NGX_AGAIN */ + + ngx_write_channel(ngx_processes[i].channel[0], + &ch, sizeof(ngx_channel_t), cycle->log); + } +} + + static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) { ngx_int_t i; @@ -558,116 +607,7 @@ static void ngx_master_exit(ngx_cycle_t static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) { - sigset_t set; - ngx_err_t err; - ngx_int_t n; - ngx_uint_t i; - struct timeval tv; - ngx_listening_t *ls; - ngx_core_conf_t *ccf; - ngx_connection_t *c; - - - ngx_gettimeofday(&tv); - - ngx_start_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000; - ngx_old_elapsed_msec = 0; - ngx_elapsed_msec = 0; - - - ngx_process = NGX_PROCESS_WORKER; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (geteuid() == 0) { - if (setgid(ccf->group) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "setgid(%d) failed", ccf->group); - /* fatal */ - exit(2); - } - - if (setuid(ccf->user) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "setuid(%d) failed", ccf->user); - /* fatal */ - exit(2); - } - } - -#if (NGX_HAVE_PR_SET_DUMPABLE) - - /* allow coredump after setuid() in Linux 2.4.x */ - - if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "prctl(PR_SET_DUMPABLE) failed"); - } - -#endif - - sigemptyset(&set); - - if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "sigprocmask() failed"); - } - - ngx_init_temp_number(); - - /* - * disable deleting previous events for the listening sockets because - * in the worker processes there are no events at all at this point - */ - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - ls[i].remain = 0; - } - - for (i = 0; ngx_modules[i]; i++) { - if (ngx_modules[i]->init_process) { - if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) { - /* fatal */ - exit(2); - } - } - } - - for (n = 0; n < ngx_last_process; n++) { - - if (ngx_processes[n].pid == -1) { - continue; - } - - if (n == ngx_process_slot) { - continue; - } - - if (ngx_processes[n].channel[1] == -1) { - continue; - } - - if (close(ngx_processes[n].channel[1]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - } - } - - if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - } - -#if 0 - ngx_last_process = 0; -#endif - - if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT, - ngx_channel_handler) == NGX_ERROR) - { - /* fatal */ - exit(2); - } + ngx_worker_process_init(cycle); ngx_setproctitle("worker process"); @@ -772,12 +712,129 @@ static void ngx_worker_process_cycle(ngx } +static void ngx_worker_process_init(ngx_cycle_t *cycle) +{ + sigset_t set; + ngx_int_t n; + ngx_uint_t i; + struct timeval tv; + ngx_core_conf_t *ccf; + ngx_listening_t *ls; + + ngx_gettimeofday(&tv); + + ngx_start_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000; + ngx_old_elapsed_msec = 0; + ngx_elapsed_msec = 0; + + + ngx_process = NGX_PROCESS_WORKER; + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + + if (geteuid() == 0) { + if (setgid(ccf->group) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "setgid(%d) failed", ccf->group); + /* fatal */ + exit(2); + } + + if (setuid(ccf->user) == -1) { + ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, + "setuid(%d) failed", ccf->user); + /* fatal */ + exit(2); + } + } + +#if (NGX_HAVE_PR_SET_DUMPABLE) + + /* allow coredump after setuid() in Linux 2.4.x */ + + if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "prctl(PR_SET_DUMPABLE) failed"); + } + +#endif + + sigemptyset(&set); + + if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "sigprocmask() failed"); + } + + ngx_init_temp_number(); + + /* + * disable deleting previous events for the listening sockets because + * in the worker processes there are no events at all at this point + */ + ls = cycle->listening.elts; + for (i = 0; i < cycle->listening.nelts; i++) { + ls[i].remain = 0; + } + + for (i = 0; ngx_modules[i]; i++) { + if (ngx_modules[i]->init_process) { + if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) { + /* fatal */ + exit(2); + } + } + } + + for (n = 0; n < ngx_last_process; n++) { + + if (ngx_processes[n].pid == -1) { + continue; + } + + if (n == ngx_process_slot) { + continue; + } + + if (ngx_processes[n].channel[1] == -1) { + continue; + } + + if (close(ngx_processes[n].channel[1]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "close() channel failed"); + } + } + + if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "close() channel failed"); + } + +#if 0 + ngx_last_process = 0; +#endif + + if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT, + ngx_channel_handler) == NGX_ERROR) + { + /* fatal */ + exit(2); + } +} + + static void ngx_channel_handler(ngx_event_t *ev) { ngx_int_t n; ngx_channel_t ch; ngx_connection_t *c; + if (ev->timedout) { + ev->timedout = 0; + return; + } + c = ev->data; ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler"); @@ -834,7 +891,8 @@ static void ngx_channel_handler(ngx_even ngx_processes[ch.slot].channel[0]); if (close(ngx_processes[ch.slot].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "close() failed"); + ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, + "close() channel failed"); } ngx_processes[ch.slot].channel[0] = -1; @@ -896,7 +954,6 @@ static void *ngx_worker_thread_cycle(voi ngx_err_t err; ngx_core_tls_t *tls; ngx_cycle_t *cycle; - struct timeval tv; thr->cv->tid = ngx_thread_self(); @@ -972,3 +1029,51 @@ static void *ngx_worker_thread_cycle(voi } #endif + + +static void ngx_garbage_collector_cycle(ngx_cycle_t *cycle, void *data) +{ + ngx_uint_t i; + ngx_gc_t ctx; + ngx_path_t **path; + ngx_event_t *ev; + + ngx_worker_process_init(cycle); + + ev = &cycle->read_events[ngx_channel]; + + ngx_accept_mutex = NULL; + + ngx_setproctitle("garbage collector"); + +#if 0 + ngx_add_timer(ev, 60 * 1000); +#endif + + for ( ;; ) { + + if (ngx_terminate || ngx_quit) { + ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting"); + exit(0); + } + + if (ngx_reopen) { + ngx_reopen = 0; + ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs"); + ngx_reopen_files(cycle, -1); + } + + path = cycle->pathes.elts; + for (i = 0; i < cycle->pathes.nelts; i++) { + ctx.path = path[i]; + ctx.log = cycle->log; + ctx.handler = path[i]->gc_handler; + + ngx_collect_garbage(&ctx, &path[i]->name, 0); + } + + ngx_add_timer(ev, 60 * 60 * 1000); + + ngx_process_events(cycle); + } +} diff --git a/src/os/unix/ngx_shared.c b/src/os/unix/ngx_shared.c --- a/src/os/unix/ngx_shared.c +++ b/src/os/unix/ngx_shared.c @@ -36,7 +36,7 @@ void *ngx_create_shared_memory(size_t si if (fd == -1) { ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "open(/dev/zero) failed"); + "open(\"/dev/zero\") failed"); return NULL; } @@ -49,7 +49,8 @@ void *ngx_create_shared_memory(size_t si } if (close(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() failed"); + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "close(\"/dev/zero\") failed"); } return p; diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h --- a/src/os/unix/ngx_solaris_config.h +++ b/src/os/unix/ngx_solaris_config.h @@ -49,14 +49,6 @@ #include -#ifndef HAVE_SELECT -#define HAVE_SELECT 1 -#endif - - -#ifndef HAVE_POLL -#define HAVE_POLL 1 -#endif #if (HAVE_POLL) #include #endif diff --git a/src/os/unix/ngx_time.h b/src/os/unix/ngx_time.h --- a/src/os/unix/ngx_time.h +++ b/src/os/unix/ngx_time.h @@ -57,6 +57,7 @@ void ngx_localtime(ngx_tm_t *tm); #define ngx_gettimeofday(tp) gettimeofday(tp, NULL); #define ngx_msleep(ms) usleep(ms * 1000) +#define ngx_sleep(s) sleep(s) #endif /* _NGX_TIME_H_INCLUDED_ */