summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES12
-rw-r--r--CHANGES.ru12
-rw-r--r--auto/cc/conf23
-rw-r--r--auto/cc/gcc2
-rw-r--r--auto/install1
-rw-r--r--auto/lib/md5/make90
-rw-r--r--auto/lib/pcre/make78
-rw-r--r--auto/lib/zlib/make101
-rw-r--r--auto/make4
-rw-r--r--auto/modules2
-rw-r--r--auto/options4
-rw-r--r--auto/os/freebsd21
-rw-r--r--auto/os/linux2
-rwxr-xr-xauto/unix9
-rwxr-xr-xconfigure2
-rw-r--r--src/core/nginx.h2
-rw-r--r--src/core/ngx_array.h2
-rw-r--r--src/core/ngx_config.h2
-rw-r--r--src/core/ngx_connection.c2
-rw-r--r--src/core/ngx_crc.h2
-rw-r--r--src/core/ngx_cycle.c46
-rw-r--r--src/core/ngx_file.c152
-rw-r--r--src/core/ngx_file.h42
-rw-r--r--src/core/ngx_garbage_collector.c74
-rw-r--r--src/core/ngx_garbage_collector.h5
-rw-r--r--src/core/ngx_inet.c2
-rw-r--r--src/core/ngx_list.h2
-rw-r--r--src/core/ngx_log.c8
-rw-r--r--src/core/ngx_output_chain.c4
-rw-r--r--src/core/ngx_rbtree.c24
-rw-r--r--src/core/ngx_rbtree.h2
-rw-r--r--src/core/ngx_string.c5
-rw-r--r--src/event/ngx_event.c176
-rw-r--r--src/event/ngx_event.h9
-rw-r--r--src/event/ngx_event_pipe.c12
-rw-r--r--src/event/ngx_event_timer.h4
-rw-r--r--src/http/modules/ngx_http_autoindex_handler.c5
-rw-r--r--src/http/modules/ngx_http_range_filter.c2
-rw-r--r--src/http/modules/proxy/ngx_http_proxy_handler.c32
-rw-r--r--src/http/ngx_http_core_module.c18
-rw-r--r--src/http/ngx_http_core_module.h2
-rw-r--r--src/os/unix/ngx_errno.h1
-rw-r--r--src/os/unix/ngx_files.c4
-rw-r--r--src/os/unix/ngx_files.h4
-rw-r--r--src/os/unix/ngx_freebsd_config.h26
-rw-r--r--src/os/unix/ngx_linux_config.h10
-rw-r--r--src/os/unix/ngx_linux_init.c17
-rw-r--r--src/os/unix/ngx_posix_config.h17
-rw-r--r--src/os/unix/ngx_process_cycle.c323
-rw-r--r--src/os/unix/ngx_shared.c5
-rw-r--r--src/os/unix/ngx_solaris_config.h8
-rw-r--r--src/os/unix/ngx_time.h1
52 files changed, 838 insertions, 577 deletions
diff --git a/CHANGES b/CHANGES
index a2826ff6c..fb524c1bf 100644
--- 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
index 3f6d6b3dd..1aabb4949 100644
--- 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
index acb68f8a5..c1f577e4e 100644
--- 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 <stdio.h>
#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 <stdio.h>
#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
index 756e3977a..d5bf1dc3d 100644
--- 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
index 0da9b6dd4..bae092b72 100644
--- 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
index 6e2834e6d..5dfddfa23 100644
--- 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"
+ msvc*)
+ ngx_makefile=makefile.msvc
+ ngx_opt="CPU_OPT=$CPU_OPT LIBC=$LIBC MD5_ASM=$MD5_ASM"
;;
- 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 -DMD5_ASM=$MD5_ASM"
- ;;
-
-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
+
+`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 ..\\..\\..
- cp auto/lib/md5/$makefile $MD5
- echo " cd $md5" >> $MAKEFILE
- echo " \$(MAKE) -f $makefile $opt" >> $MAKEFILE
- echo " cd ..\\..\\.." >> $MAKEFILE
+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
+
+$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
- 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
+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
-fi
+ cat << END >> $NGX_MAKEFILE
+
+$MD5/libmd5.a: $NGX_MAKEFILE
+ cd $MD5 \\
+ && \$(MAKE) CFLAGS="$MD5_OPT" \\
+ CC="\$(CC)" MD5_ASM_OBJ= clean libmd5.a
-echo >> $MAKEFILE
+END
+
+fi
diff --git a/auto/lib/pcre/make b/auto/lib/pcre/make
index 714994df5..a60fedb2d 100644
--- 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"`
- echo "$line" >> $MAKEFILE
- echo " cd $pcre" >> $MAKEFILE
- echo " \$(MAKE) -f $makefile pcre.h" >> $MAKEFILE
- echo " cd ..\\..\\.." >> $MAKEFILE
- echo >> $MAKEFILE
+ cat << END >> $NGX_MAKEFILE
- line="$PCRE/pcre.lib: $PCRE/pcre.h"
- line=`echo $line | sed -e "s/\//$ngx_regex_dirsep/g"`
+`echo "$PCRE/pcre.h: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`
+ cd $ngx_pcre
+ \$(MAKE) -f $ngx_makefile pcre.h
+ cd ..\\..\\..
+
+
+`echo "$PCRE/pcre.lib: $PCRE/pcre.h" | sed -e "s/\//$ngx_regex_dirsep/g"`
+ cd $ngx_pcre
+ \$(MAKE) -f $ngx_makefile $ngx_opt
+ cd ..\\..\\..
+
+END
- echo "$line" >> $MAKEFILE
- echo " cd $pcre" >> $MAKEFILE
- echo " \$(MAKE) -f $makefile $opt" >> $MAKEFILE
- echo " cd ..\\..\\.." >> $MAKEFILE
;;
*)
- PCRE_OPT="CFLAGS=\"$PCRE_OPT\""
-
- 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
+ cat << END >> $NGX_MAKEFILE
+
+$PCRE/pcre.h: $NGX_MAKEFILE
+ cd $PCRE \\
+ && if [ -f Makefile ]; then \$(MAKE) distclean; fi
+
+ 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
index 582276248..2e5ea8420 100644
--- 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"
+ owc*)
+ ngx_makefile=makefile.owc
+ ngx_opt="CPU_OPT=$CPU_OPT"
;;
- bcc32)
- makefile=makefile.bcc
- opt="-DCPU_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
-fi
+ cat << END >> $NGX_MAKEFILE
+
+$ZLIB/libz.a: $NGX_MAKEFILE
+ cd $ZLIB \\
+ && make clean \\
+ && CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
+ ./configure \\
+ && \$(MAKE) libz.a
-echo >> $MAKEFILE
+END
+
+fi
diff --git a/auto/make b/auto/make
index c165078cf..55f36c90f 100644
--- 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
index 39dfa9df2..e9a42e362 100644
--- a/auto/modules
+++ b/auto/modules
@@ -7,6 +7,7 @@ if [ $EVENT_SELECT = NO -a $EVENT_FOUND = NO ]; then
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 = NO ]; then
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
index 72e5b36bf..06488c825 100644
--- 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
index f08ef97b0..ba2e18805 100644
--- 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
index 8518c6170..e4cbd6d03 100644
--- 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 <sys/epoll.h>"
ngx_feature_libs=
ngx_feature_test="int efd = 0, fd = 1, n;
diff --git a/auto/unix b/auto/unix
index af9ee01df..f0e7f2e9d 100755
--- a/auto/unix
+++ b/auto/unix
@@ -73,6 +73,15 @@ ngx_param=TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value
# 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
index b4a0b5680..d5cc7e032 100755
--- 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
index 529c43da5..5f2339b6f 100644
--- 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
index 826395de6..931c7fb50 100644
--- 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
index 9faf00a2d..43fd985a2 100644
--- 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
index 06fd85cde..631cd4fa9 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -299,7 +299,7 @@ void ngx_close_listening_sockets(ngx_cycle_t *cycle)
}
}
- 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
index b78f479e4..73f4cdd67 100644
--- 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
index 85d945809..d91ba8567 100644
--- 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 *old_cycle)
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 *old_cycle)
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 *old_cycle)
}
}
+
+ 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, ngx_uid_t user)
}
#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, ngx_uid_t user)
}
}
+ 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
index 8e1edbd1f..08d9abab5 100644
--- 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_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)
+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 *file, ngx_path_t *path,
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 *file, ngx_path_t *path,
#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 *file, ngx_path_t *path,
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_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)
{
int i, pos;
ngx_err_t err;
@@ -189,32 +190,28 @@ char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
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);
-
- *pp = path;
-
- ngx_test_null(pp, ngx_push_array(&cf->cycle->pathes), NGX_CONF_ERROR);
- *pp = path;
+ if (!(path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)))) {
+ return NGX_CONF_ERROR;
+ }
- 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 *cf, ngx_command_t *cmd, void *conf)
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
index d05b6d72a..94fd8c775 100644
--- 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
index 73f9cc143..fb6ad772d 100644
--- a/src/core/ngx_garbage_collector.c
+++ b/src/core/ngx_garbage_collector.c
@@ -9,71 +9,8 @@
#include <ngx_garbage_collector.h>
-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 *ctx, ngx_str_t *dname, int level)
} 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 *ctx, ngx_str_t *dname, int level)
}
-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(ngx_gc_t *ctx, ngx_str_t *name,
}
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
index 72f97604d..cec3a87de 100644
--- 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
index 5cabb49b5..22a5334c6 100644
--- 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
index 046bdee16..2dd8ab37a 100644
--- 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
index 521ba7aa3..b7198cd7f 100644
--- 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, u_char *errstr, size_t len)
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, u_char *errstr, size_t len)
}
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
index 30dda35be..d2fbf12fb 100644
--- 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_chain_ctx_t *ctx, ngx_chain_t *in)
}
-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
index c94db13e8..ef572895a 100644
--- 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 **root, ngx_rbtree_t *sentinel,
}
-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(ngx_rbtree_t **root,
}
-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
index aa69556f8..d876ec04c 100644
--- a/src/core/ngx_rbtree.h
+++ b/src/core/ngx_rbtree.h
@@ -29,7 +29,7 @@ void ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
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
index 94eadfbe2..4e5d273c3 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -135,6 +135,11 @@ u_char *ngx_vsnprintf(u_char *buf, size_t max, const char *fmt, va_list args)
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
index 563cf4213..b3bf530a3 100644
--- 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_select_module;
-extern ngx_event_module_t ngx_select_module_ctx;
-
-#if (HAVE_KQUEUE)
-#include <ngx_kqueue_module.h>
-#endif
-
-#if (HAVE_DEVPOLL)
+extern ngx_module_t ngx_kqueue_module;
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
+extern ngx_module_t ngx_select_module;
-#if (HAVE_AIO)
-#include <ngx_aio_module.h>
-#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 *cf, ngx_command_t *cmd, void *conf)
&& 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_cycle_t *cycle)
static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
{
ngx_event_conf_t *ecf = conf;
-#if (HAVE_RTSIG)
- ngx_core_conf_t *ccf;
-#endif
-#if (HAVE_KQUEUE)
+ int fd, rtsig;
+ ngx_int_t i, connections;
+ ngx_module_t *module;
+ ngx_core_conf_t *ccf;
+ ngx_event_module_t *event_module;
- 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);
+ connections = NGX_CONF_UNSET_UINT;
+ module = NULL;
+ rtsig = 0;
+ fd = 0;
-#elif (HAVE_DEVPOLL)
+#if (HAVE_EPOLL) && !(TEST_BUILD_EPOLL)
- 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);
+ fd = epoll_create(100);
-#elif (HAVE_EPOLL)
+ if (fd != -1) {
+ close(fd);
+ connections = DEFAULT_CONNECTIONS;
+ module = &ngx_epoll_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);
+ } else if (ngx_errno != NGX_ENOSYS) {
+ connections = DEFAULT_CONNECTIONS;
+ module = &ngx_epoll_module;
+ }
-#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_RTSIG)
-#elif (HAVE_SELECT)
+ if (module == NULL) {
+ connections = DEFAULT_CONNECTIONS;
+ module = &ngx_rtsig_module;
+ rtsig = 1;
+ }
-#if (NGX_WIN32)
- ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS);
-#else
- ngx_conf_init_unsigned_value(ecf->connections,
- FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE : DEFAULT_CONNECTIONS);
#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);
+#if (HAVE_DEVPOLL)
+
+ connections = DEFAULT_CONNECTIONS;
+ module = &ngx_devpoll_module;
+
+#endif
+
+#if (HAVE_KQUEUE)
+ connections = DEFAULT_CONNECTIONS;
+ module = &ngx_kqueue_module;
+
+#endif
+
+#if (HAVE_SELECT)
+
+ if (module == NULL) {
+
+#if (NGX_WIN32)
+ connections = DEFAULT_CONNECTIONS;
#else
+ connections = FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE:
+ DEFAULT_CONNECTIONS;
+#endif
+ module = &ngx_select_module;
+ }
- ngx_int_t i, m;
- ngx_event_module_t *module;
+#endif
- 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->use, m);
- ngx_conf_init_ptr_value(ecf->name, module->name->data);
+ ngx_conf_init_unsigned_value(ecf->connections, connections);
+ cycle->connection_n = ecf->connections;
-#endif
+ ngx_conf_init_unsigned_value(ecf->use, module->ctx_index);
- 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
- return NGX_CONF_OK;
+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+ 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
index 191b492d6..44728e381 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -496,7 +496,7 @@ ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat);
-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_event(ngx_event_t *rev, u_int flags)
}
-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_read_event(ngx_event_t *rev)
}
-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_event(ngx_event_t *wev, size_t lowat)
}
-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
index 273941908..a2edc7129 100644
--- 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_upstream(ngx_event_pipe_t *p);
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_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
}
-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_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_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_free_shadow_raw_buf(ngx_chain_t **free,
}
-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
index 9d6319a34..090d4046a 100644
--- 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 *ngx_event_timer_rbtree;
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_timer(ngx_event_t *ev)
}
-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
index c78d4e616..f5ec9704f 100644
--- 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_handler(ngx_http_request_t *r)
+ 1 /* 1 is for "/" */
+ entry[i].name.len + entry[i].escape
+ sizeof("\">") - 1
- + NGX_HTTP_AUTOINDEX_NAME_LEN
+ + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof("&gt;") - 2
+ sizeof("</a>") - 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
index f96456cef..8f98719a1 100644
--- 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_filter(ngx_http_request_t *r)
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
index 915d378e6..c0a8cf3d9 100644
--- 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_commands[] = {
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_conf(ngx_conf_t *cf)
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_conf(ngx_conf_t *cf,
prev->max_temp_file_size, NGX_CONF_UNSET_SIZE);
if (conf->max_temp_file_size == NGX_CONF_UNSET_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;
+
+#if 0
conf->max_temp_file_size = 2 * size;
+#endif
+
- } else if (conf->max_temp_file_size < size) {
+ } 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
index 29a6f76fc..c764b2a00 100644
--- 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_http_request_t *r,
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(ngx_http_request_t *r,
}
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(ngx_http_request_t *r,
#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_t *cf, ngx_command_t *cmd, void *dummy)
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
index 9a17130b8..a70b472d5 100644
--- 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
index 9a392f822..e87ec5f6f 100644
--- 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
index 7bf5ad124..52aa9b62a 100644
--- 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, u_char *buf, size_t size, off_t offset)
}
-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_t *file, ngx_chain_t *cl,
}
-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
index b789d6184..03de946a3 100644
--- 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_t *file, ngx_chain_t *ce,
#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
index 4840a9970..7f3b286c3 100644
--- a/src/os/unix/ngx_freebsd_config.h
+++ b/src/os/unix/ngx_freebsd_config.h
@@ -60,41 +60,23 @@
#include <ngx_auto_config.h>
-#ifndef HAVE_SELECT
-#define HAVE_SELECT 1
-#endif
-
-
-#ifndef HAVE_POLL
-#define HAVE_POLL 1
-#endif
#if (HAVE_POLL)
#include <poll.h>
#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 <aio.h>
#endif
-#if defined SO_ACCEPTFILTER && !defined HAVE_DEFERRED_ACCEPT
-#define HAVE_DEFERRED_ACCEPT 1
+#if (HAVE_KQUEUE)
+#include <sys/event.h>
#endif
-#if (HAVE_KQUEUE)
-#include <sys/event.h>
+#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
index fb2cbc892..57ee5057e 100644
--- 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, int32_t *offset, size_t size);
#endif
-
-#ifndef HAVE_SELECT
-#define HAVE_SELECT 1
-#endif
-
-
-#ifndef HAVE_POLL
-#define HAVE_POLL 1
-#endif
#if (HAVE_POLL)
#include <poll.h>
#endif
+
#if (HAVE_EPOLL)
#include <sys/epoll.h>
#endif /* HAVE_EPOLL */
diff --git a/src/os/unix/ngx_linux_init.c b/src/os/unix/ngx_linux_init.c
index 3c7d34483..397d342f0 100644
--- 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");
- ngx_linux_rtsig_max = 0;
+ 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
index bac02f7dd..b187236e9 100644
--- 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 <sys/types.h>
#include <sys/time.h>
#if (NGX_HAVE_UNISTD_H)
@@ -65,14 +70,6 @@
#include <ngx_auto_config.h>
-#ifndef HAVE_SELECT
-#define HAVE_SELECT 1
-#endif
-
-
-#ifndef HAVE_POLL
-#define HAVE_POLL 1
-#endif
#if (HAVE_POLL)
#include <poll.h>
#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
index 0447bc4ec..37b2ef193 100644
--- 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_t *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_t *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_t *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_t *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_t *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(ngx_cycle_t *cycle, ngx_int_t 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,15 +607,119 @@ static void ngx_master_exit(ngx_cycle_t *cycle)
static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
+ ngx_worker_process_init(cycle);
+
+ ngx_setproctitle("worker process");
+
+#if (NGX_THREADS)
+
+ if (ngx_time_mutex_init(cycle->log) == NGX_ERROR) {
+ /* fatal */
+ exit(2);
+ }
+
+ if (ngx_threads_n) {
+ if (ngx_init_threads(ngx_threads_n,
+ ccf->thread_stack_size, cycle) == NGX_ERROR)
+ {
+ /* fatal */
+ exit(2);
+ }
+
+ err = ngx_thread_key_create(&ngx_core_tls_key);
+ if (err != 0) {
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
+ ngx_thread_key_create_n " failed");
+ /* fatal */
+ exit(2);
+ }
+
+ for (n = 0; n < ngx_threads_n; n++) {
+
+ if (!(ngx_threads[n].cv = ngx_cond_init(cycle->log))) {
+ /* fatal */
+ exit(2);
+ }
+
+ if (ngx_create_thread((ngx_tid_t *) &ngx_threads[n].tid,
+ ngx_worker_thread_cycle,
+ (void *) &ngx_threads[n], cycle->log) != 0)
+ {
+ /* fatal */
+ exit(2);
+ }
+ }
+ }
+
+#endif
+
+ for ( ;; ) {
+ if (ngx_exiting
+ && ngx_event_timer_rbtree == &ngx_event_timer_sentinel)
+ {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+
+
+#if (NGX_THREADS)
+ ngx_terminate = 1;
+
+ ngx_wakeup_worker_threads(cycle);
+#endif
+
+ /*
+ * we do not destroy cycle->pool here because a signal handler
+ * that uses cycle->log can be called at this point
+ */
+ exit(0);
+ }
+
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
+
+ ngx_process_events(cycle);
+
+ if (ngx_terminate) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+
+#if (NGX_THREADS)
+ ngx_wakeup_worker_threads(cycle);
+#endif
+
+ /*
+ * we do not destroy cycle->pool here because a signal handler
+ * that uses cycle->log can be called at this point
+ */
+ exit(0);
+ }
+
+ if (ngx_quit) {
+ ngx_quit = 0;
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+ "gracefully shutting down");
+ ngx_setproctitle("worker process is shutting down");
+
+ if (!ngx_exiting) {
+ ngx_close_listening_sockets(cycle);
+ ngx_exiting = 1;
+ }
+ }
+
+ if (ngx_reopen) {
+ ngx_reopen = 0;
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
+ ngx_reopen_files(cycle, -1);
+ }
+ }
+}
+
+
+static void ngx_worker_process_init(ngx_cycle_t *cycle)
+{
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_listening_t *ls;
ngx_gettimeofday(&tv);
@@ -649,13 +802,13 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
if (close(ngx_processes[n].channel[1]) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
- "close() failed");
+ "close() channel failed");
}
}
if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
- "close() failed");
+ "close() channel failed");
}
#if 0
@@ -668,107 +821,6 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
/* fatal */
exit(2);
}
-
- ngx_setproctitle("worker process");
-
-#if (NGX_THREADS)
-
- if (ngx_time_mutex_init(cycle->log) == NGX_ERROR) {
- /* fatal */
- exit(2);
- }
-
- if (ngx_threads_n) {
- if (ngx_init_threads(ngx_threads_n,
- ccf->thread_stack_size, cycle) == NGX_ERROR)
- {
- /* fatal */
- exit(2);
- }
-
- err = ngx_thread_key_create(&ngx_core_tls_key);
- if (err != 0) {
- ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
- ngx_thread_key_create_n " failed");
- /* fatal */
- exit(2);
- }
-
- for (n = 0; n < ngx_threads_n; n++) {
-
- if (!(ngx_threads[n].cv = ngx_cond_init(cycle->log))) {
- /* fatal */
- exit(2);
- }
-
- if (ngx_create_thread((ngx_tid_t *) &ngx_threads[n].tid,
- ngx_worker_thread_cycle,
- (void *) &ngx_threads[n], cycle->log) != 0)
- {
- /* fatal */
- exit(2);
- }
- }
- }
-
-#endif
-
- for ( ;; ) {
- if (ngx_exiting
- && ngx_event_timer_rbtree == &ngx_event_timer_sentinel)
- {
- ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
-
-
-#if (NGX_THREADS)
- ngx_terminate = 1;
-
- ngx_wakeup_worker_threads(cycle);
-#endif
-
- /*
- * we do not destroy cycle->pool here because a signal handler
- * that uses cycle->log can be called at this point
- */
- exit(0);
- }
-
- ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
-
- ngx_process_events(cycle);
-
- if (ngx_terminate) {
- ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
-
-#if (NGX_THREADS)
- ngx_wakeup_worker_threads(cycle);
-#endif
-
- /*
- * we do not destroy cycle->pool here because a signal handler
- * that uses cycle->log can be called at this point
- */
- exit(0);
- }
-
- if (ngx_quit) {
- ngx_quit = 0;
- ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
- "gracefully shutting down");
- ngx_setproctitle("worker process is shutting down");
-
- if (!ngx_exiting) {
- ngx_close_listening_sockets(cycle);
- ngx_exiting = 1;
- }
- }
-
- if (ngx_reopen) {
- ngx_reopen = 0;
- ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
- ngx_reopen_files(cycle, -1);
- }
- }
}
@@ -778,6 +830,11 @@ static void ngx_channel_handler(ngx_event_t *ev)
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_event_t *ev)
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(void *data)
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(void *data)
}
#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
index 7f3c5e9be..0edc8cbe1 100644
--- 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 size, ngx_log_t *log)
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 size, ngx_log_t *log)
}
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
index 5d94cdc98..8f1841793 100644
--- a/src/os/unix/ngx_solaris_config.h
+++ b/src/os/unix/ngx_solaris_config.h
@@ -49,14 +49,6 @@
#include <ngx_auto_config.h>
-#ifndef HAVE_SELECT
-#define HAVE_SELECT 1
-#endif
-
-
-#ifndef HAVE_POLL
-#define HAVE_POLL 1
-#endif
#if (HAVE_POLL)
#include <poll.h>
#endif
diff --git a/src/os/unix/ngx_time.h b/src/os/unix/ngx_time.h
index 0ead0d837..a6acf59e3 100644
--- 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_ */