From c0f8d91bde06aeeb53ff16d6c26490f5961f5a31 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Wed, 26 Nov 2003 15:42:18 +0000 Subject: [PATCH] nginx-0.0.1-2003-11-26-18:42:18 import --- auto/fmt/fmt | 6 +++- auto/fmt/xfmt | 6 ++++ auto/func | 12 ++++--- auto/inc | 25 ++++++++++++++ auto/init | 4 +-- auto/os/conf | 9 +++--- auto/os/linux | 16 +++++++++ auto/os/solaris | 18 +++++++++++ auto/sources | 13 ++++++-- auto/types/sizeof | 4 +++ auto/types/typedef | 5 ++- auto/types/uintptr_t | 1 + auto/unix | 45 ++++++++++++++++++-------- src/event/modules/ngx_kqueue_module.c | 7 +++- src/os/unix/ngx_files.c | 2 +- src/os/unix/ngx_freebsd_config.h | 1 + src/os/unix/ngx_freebsd_init.c | 2 +- src/os/unix/ngx_linux.h | 2 +- src/os/unix/ngx_linux_config.h | 5 +++ src/os/unix/ngx_linux_init.c | 4 +-- src/os/unix/ngx_linux_sendfile_chain.c | 15 ++++----- src/os/unix/ngx_os.h | 5 +++ src/os/unix/ngx_solaris_config.h | 14 ++------ src/os/unix/ngx_solaris_init.c | 4 +-- 24 files changed, 167 insertions(+), 58 deletions(-) create mode 100644 auto/fmt/xfmt create mode 100644 auto/inc create mode 100644 auto/os/linux create mode 100644 auto/os/solaris diff --git a/auto/fmt/fmt b/auto/fmt/fmt index bd66b4114..3e19c318f 100644 --- a/auto/fmt/fmt +++ b/auto/fmt/fmt @@ -5,8 +5,12 @@ NGX_FMT=NO for FMT in $NGX_FORMATS do - echo "#include " >> autotest.c + echo "#include " > autotest.c echo "#include " >> autotest.c + echo "#include " >> autotest.c + echo "#include " >> autotest.c + echo "$NGX_INTTYPES_H" >> autotest.c + echo "$NGX_AUTO_CONFIG" >> autotest.c echo "int main() {" >> autotest.c echo "printf(\"${FMT}\", ($NGX_TYPE) $NGX_MAX_SIZE);" >> autotest.c echo "return 0; }" >> autotest.c diff --git a/auto/fmt/xfmt b/auto/fmt/xfmt new file mode 100644 index 000000000..0256c5caa --- /dev/null +++ b/auto/fmt/xfmt @@ -0,0 +1,6 @@ + +echo "#ifndef $NGX_FMT_NAME" >> $NGX_AUTO_CONFIG_H +echo "#define $NGX_FMT_NAME \"$NGX_FMT\"" | sed -e 's/d"$/x"/' \ + >> $NGX_AUTO_CONFIG_H +echo "#endif" >> $NGX_AUTO_CONFIG_H +echo >> $NGX_AUTO_CONFIG_H diff --git a/auto/func b/auto/func index 77216f936..553333dc0 100644 --- a/auto/func +++ b/auto/func @@ -1,19 +1,21 @@ echo "checking for $NGX_FUNC" +func=`echo $NGX_FUNC | sed -e 's/()$//' | tr '[a-z]' '[A-Z]'` + echo "$NGX_UNISTD_H" > autotest.c echo "$NGX_FUNC_INC" >> autotest.c echo "int main() { $NGX_FUNC_TEST; return 0; }" >> autotest.c -eval "${CC} -o autotest autotest.c > /dev/null 2>&1" +eval "$CC $CC_TEST_FLAGS -o autotest autotest.c > /dev/null 2>&1" if [ -x autotest ]; then echo " + $NGX_FUNC found" - echo "#ifndef $NGX_HAVE" >> $NGX_AUTO_CONFIG_H - echo "#define $NGX_HAVE 1" >> $NGX_AUTO_CONFIG_H - echo "#endif" >> $NGX_AUTO_CONFIG_H - echo >> $NGX_AUTO_CONFIG_H + echo "#ifndef HAVE_$func" >> $NGX_AUTO_CONFIG_H + echo "#define HAVE_$func 1" >> $NGX_AUTO_CONFIG_H + echo "#endif" >> $NGX_AUTO_CONFIG_H + echo >> $NGX_AUTO_CONFIG_H else echo " + $NGX_FUNC not found" fi diff --git a/auto/inc b/auto/inc new file mode 100644 index 000000000..1db95f5b1 --- /dev/null +++ b/auto/inc @@ -0,0 +1,25 @@ + +echo "checking for $NGX_INC" + +inc=`echo $NGX_INC | sed -e 's/\./_/' | tr '[a-z]' '[A-Z]'` + +echo "#include <$NGX_INC>" > autotest.c +echo "int main() { return 0; }" >> autotest.c + +eval "${CC} -o autotest autotest.c > /dev/null 2>&1" + +if [ -x autotest ]; then + echo " + $NGX_INC found" + + echo "#ifndef HAVE_$inc" >> $NGX_AUTO_CONFIG_H + echo "#define HAVE_$inc 1" >> $NGX_AUTO_CONFIG_H + echo "#endif" >> $NGX_AUTO_CONFIG_H + echo >> $NGX_AUTO_CONFIG_H + + eval "NGX_$inc='#include <$NGX_INC>'" + +else + echo " + $NGX_INC not found" +fi + +rm autotest* diff --git a/auto/init b/auto/init index 0fd7c5230..962c02e5c 100644 --- a/auto/init +++ b/auto/init @@ -4,6 +4,4 @@ MAKEFILE=$OBJS/Makefile NGX_AUTO_CONFIG_H=$OBJS/ngx_auto_config.h NGX_MODULES_C=$OBJS/ngx_modules.c - -NGX_UNISTD_H="#include " -NGX_INTTYPES_H="#include " +NGX_ERR=autoconf.err diff --git a/auto/os/conf b/auto/os/conf index 0b2a4357e..d0eb7876d 100644 --- a/auto/os/conf +++ b/auto/os/conf @@ -19,13 +19,12 @@ case $PLATFORM in . auto/os/freebsd ;; - Solaris:*) - CC_TEST_FLAGS="-D_FILE_OFFSET_BITS=64" - CORE_LIBS="$CORE_LIBS -lsocket -lnsl" + Linux:*) + . auto/os/linux ;; - Linux:*) - CC_TEST_FLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" + SunOS:*) + . auto/os/solaris ;; win32) diff --git a/auto/os/linux b/auto/os/linux new file mode 100644 index 000000000..a488c4de1 --- /dev/null +++ b/auto/os/linux @@ -0,0 +1,16 @@ + +CORE_INCS="$UNIX_INCS" +CORE_DEPS="$UNIX_DEPS $LINUX_DEPS" +CORE_SRCS="$UNIX_SRCS $LINUX_SRCS $SELECT_SRCS $POLL_SRCS" +EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE $POLL_MODULE" + +ZLIB_LIB="-lz" + + +# TODO check sendfile64() + +#CC_TEST_FLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" +CC_TEST_FLAGS="-D_GNU_SOURCE" + +# STUB +CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS" diff --git a/auto/os/solaris b/auto/os/solaris new file mode 100644 index 000000000..2fe630953 --- /dev/null +++ b/auto/os/solaris @@ -0,0 +1,18 @@ + +CORE_INCS="$UNIX_INCS" +CORE_DEPS="$UNIX_DEPS $SOLARIS_DEPS" +CORE_SRCS="$UNIX_SRCS $SOLARIS_SRCS $SELECT_SRCS $POLL_SRCS" +EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE $POLL_MODULE" + +MD5_LIB="-lmd5" +ZLIB_LIB="-lz" + +CC_TEST_FLAGS="-D_FILE_OFFSET_BITS=64" + +CORE_LIBS="$CORE_LIBS -lsocket -lnsl" + +# STUB +CFLAGS="$CFLAGS -D HAVE_DEVPOLL=1" +EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE" +CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS" +#CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS" diff --git a/auto/sources b/auto/sources index ccaac10b6..2f47d15f4 100644 --- a/auto/sources +++ b/auto/sources @@ -95,14 +95,21 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \ src/os/unix/ngx_process.c \ src/os/unix/ngx_daemon.c" - -LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c - FREEBSD_DEPS=src/os/unix/ngx_freebsd_config.h FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c +LINUX_DEPS=src/os/unix/ngx_linux_config.h +LINUX_SRCS=src/os/unix/ngx_linux_init.c +LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c + + +SOLARIS_DEPS=src/os/unix/ngx_solaris_config.h +SOLARIS_SRCS=src/os/unix/ngx_solaris_init.c +SOLARIS_SENDFILE_SRCS=src/os/unix/ngx_solaris_sendfilev_chain.c + + WIN32_INCS="$CORE_INCS $EVENT_INCS -I src/os/win32" WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \ diff --git a/auto/types/sizeof b/auto/types/sizeof index 8f811136e..2e9e9b2ca 100644 --- a/auto/types/sizeof +++ b/auto/types/sizeof @@ -4,6 +4,10 @@ echo "checking for $NGX_TYPE size" NGX_BYTES= echo "#include " > autotest.c +echo "#include " >> autotest.c +echo "#include " >> autotest.c +echo "$NGX_INTTYPES_H" >> autotest.c +echo "$NGX_AUTO_CONFIG" >> autotest.c echo "int main() {" >> autotest.c echo "printf(\"%d\", sizeof($NGX_TYPE));" >> autotest.c echo "return 0; }" >> autotest.c diff --git a/auto/types/typedef b/auto/types/typedef index a842542df..c3155c450 100644 --- a/auto/types/typedef +++ b/auto/types/typedef @@ -7,10 +7,13 @@ for TYPE in $NGX_TYPE $NGX_TYPES do echo "#include " > autotest.c echo "#include " >> autotest.c + echo "#include " >> autotest.c + echo "#include " >> autotest.c + echo "#include " >> autotest.c echo "$NGX_INTTYPES_H" >> autotest.c echo "int main() { $TYPE i = 0; return 0; }" >> autotest.c - eval "$CC -o autotest autotest.c > /dev/null 2>&1" + eval "$CC -o autotest autotest.c > $NGX_ERR 2>&1" if [ -x autotest ]; then if [ $TYPE = $NGX_TYPE ]; then diff --git a/auto/types/uintptr_t b/auto/types/uintptr_t index 93a01a8fa..7c941c0bf 100644 --- a/auto/types/uintptr_t +++ b/auto/types/uintptr_t @@ -4,6 +4,7 @@ echo 'checking for uintptr_t' FOUND=NO echo "#include " > autotest.c +echo "$NGX_INTTYPES_H" >> autotest.c echo "int main() { uintptr_t i = 0; return 0; }" >> autotest.c eval "$CC -o autotest autotest.c > /dev/null 2>&1" diff --git a/auto/unix b/auto/unix index 5b7b4977e..c9e2a8ee1 100755 --- a/auto/unix +++ b/auto/unix @@ -2,6 +2,8 @@ CC_WARN=$CC NGX_FMT_COLLECT=YES +# C types + NGX_TYPE="int"; . auto/types/sizeof; NGX_FORMATS="%d"; . auto/fmt/fmt @@ -14,6 +16,32 @@ NGX_FORMATS="%lld %qd"; . auto/fmt/fmt NGX_TYPE="void *"; . auto/types/sizeof; NGX_PTR_BYTES=$NGX_BYTES +# headers + +NGX_INC="unistd.h"; . auto/inc +NGX_INC="inttypes.h"; . auto/inc + +#POSIX types + +NGX_AUTO_CONFIG="#include \"$NGX_AUTO_CONFIG_H\"" + +NGX_TYPE="uint64_t" +NGX_TYPES="u_int64_t"; . auto/types/typedef + +NGX_TYPE="socklen_t" +NGX_TYPES="uint32_t"; . auto/types/typedef + +NGX_TYPE="in_addr_t" +NGX_TYPES="uint32_t"; . auto/types/typedef + +NGX_TYPE="rlim_t" +NGX_TYPES="int"; . auto/types/typedef + +. auto/types/uintptr_t + + +# printf() formats + CC_WARN=$CC_STRONG NGX_FMT_COLLECT=NO @@ -40,31 +68,22 @@ NGX_TYPE="rlim_t"; . auto/types/sizeof eval NGX_FORMATS=\${NGX_${NGX_BYTES}_FMT}; . auto/fmt/fmt -CC_WARN=$CC - -NGX_TYPE="uint64_t" -NGX_TYPES="u_int64_t"; . auto/types/typedef - -NGX_TYPE="socklen_t" -NGX_TYPES="u_int32_t"; . auto/types/typedef - -. auto/types/uintptr_t - +# syscalls and libc calls NGX_FUNC_INC= NGX_FUNC_TEST="int fd = 0; char buf[1]; size_t size = 1; ssize_t n; off_t offset = 0; n = pread(fd, buf, size, offset)" -NGX_HAVE=HAVE_PREAD; NGX_FUNC="pread()"; . auto/func +NGX_FUNC="pread()"; . auto/func NGX_FUNC_INC= NGX_FUNC_TEST="int fd = 1; char buf[1]; size_t size = 1; ssize_t n; off_t offset = 0; n = pwrite(fd, buf, size, offset)" -NGX_HAVE=HAVE_PWRITE; NGX_FUNC="pwrite()"; . auto/func +NGX_FUNC="pwrite()"; . auto/func NGX_FUNC_INC="#include " NGX_FUNC_TEST="struct tm t; time_t c=0; localtime_r(&c, &t)" -NGX_HAVE=HAVE_LOCALTIME_R; NGX_FUNC="localtime_r()"; . auto/func +NGX_FUNC="localtime_r()"; . auto/func diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 1f069792a..9371ecee1 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -311,7 +311,12 @@ static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) if (filter == EVFILT_VNODE) { change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND - |NOTE_ATTRIB|NOTE_RENAME|NOTE_REVOKE; + |NOTE_ATTRIB|NOTE_RENAME +#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ + || __FreeBSD_version >= 500018 + |NOTE_REVOKE +#endif + ; change_list[nchanges].data = 0; } else { diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index 7563009da..5d0cd380e 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -11,7 +11,7 @@ ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset) { ssize_t n; - ngx_log_debug(file->log, "read: %d, %x, %d, %qd" _ + ngx_log_debug(file->log, "read: %d, %x, %d, " OFF_T_FMT _ file->fd _ buf _ size _ offset); #if (HAVE_PREAD) diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h index 24fb7b0e8..f208bf16c 100644 --- a/src/os/unix/ngx_freebsd_config.h +++ b/src/os/unix/ngx_freebsd_config.h @@ -79,4 +79,5 @@ #define HAVE_LITTLE_ENDIAN 1 + #endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_freebsd_init.c b/src/os/unix/ngx_freebsd_init.c index 3446382fe..c755a3ec6 100644 --- a/src/os/unix/ngx_freebsd_init.c +++ b/src/os/unix/ngx_freebsd_init.c @@ -22,7 +22,7 @@ ngx_os_io_t ngx_os_io = { NULL, #if (HAVE_SENDFILE) ngx_freebsd_sendfile_chain, - NGX_HAVE_SENDFILE + NGX_IO_SENDFILE #else ngx_writev_chain, 0 diff --git a/src/os/unix/ngx_linux.h b/src/os/unix/ngx_linux.h index 12ccb97d4..0cbb677c8 100644 --- a/src/os/unix/ngx_linux.h +++ b/src/os/unix/ngx_linux.h @@ -2,7 +2,7 @@ #define _NGX_LINUX_H_INCLUDED_ -ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) +ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in); #endif /* _NGX_LINUX_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index 761263f57..59e1b0976 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -4,8 +4,10 @@ #define _GNU_SOURCE /* pread(), pwrite(), gethostname() */ +#if 0 #define _FILE_OFFSET_BITS 64 #define _LARGEFILE_SOURCE +#endif #include @@ -24,8 +26,11 @@ #include #include #include +#include #include +#include #include +#include /* TCP_CORK */ #include #include #include diff --git a/src/os/unix/ngx_linux_init.c b/src/os/unix/ngx_linux_init.c index 86b98aa80..387a49143 100644 --- a/src/os/unix/ngx_linux_init.c +++ b/src/os/unix/ngx_linux_init.c @@ -11,8 +11,8 @@ ngx_os_io_t ngx_os_io = { ngx_unix_recv, NULL, NULL, - ngx_writev_chain, - NGX_HAVE_ZEROCOPY + ngx_linux_sendfile_chain, + NGX_IO_SENDFILE }; diff --git a/src/os/unix/ngx_linux_sendfile_chain.c b/src/os/unix/ngx_linux_sendfile_chain.c index 31bcf3d6a..0b8e41792 100644 --- a/src/os/unix/ngx_linux_sendfile_chain.c +++ b/src/os/unix/ngx_linux_sendfile_chain.c @@ -8,7 +8,7 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) { int rc; char *prev; - off_t fprev; + off_t offset; size_t size, fsize, sent; ngx_int_t use_cork, eintr; struct iovec *iov; @@ -16,7 +16,7 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) ngx_hunk_t *file; ngx_array_t header; ngx_event_t *wev; - ngx_chain_t *cl; + ngx_chain_t *cl, *tail; wev = c->write; @@ -24,8 +24,6 @@ ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in) return in; } - cork = 0; - do { file = NULL; fsize = 0; @@ -84,20 +82,20 @@ ngx_log_debug(c->log, "CORK"); file = cl->hunk; fsize = (size_t) (file->file_last - file->file_pos); - fprev = file->file_last; + offset = file->file_last; cl = cl->next; /* coalesce the neighbouring file hunks */ while (cl && (cl->hunk->type & NGX_HUNK_FILE)) { if (file->file->fd != cl->hunk->file->fd - || fprev != cl->hunk->file_pos) + || offset != cl->hunk->file_pos) { break; } fsize += (size_t) (cl->hunk->file_last - cl->hunk->file_pos); - fprev = cl->hunk->file_last; + offset = cl->hunk->file_last; cl = cl->next; } } @@ -110,7 +108,8 @@ ngx_log_debug(c->log, "CORK"); tail = cl; if (fsize) { - rc = sendfile(c->fd, file->file->fd, file->file_pos, fsize); + offset = file->file_pos; + rc = sendfile(c->fd, file->file->fd, &offset, fsize); if (rc == -1) { err = ngx_errno; diff --git a/src/os/unix/ngx_os.h b/src/os/unix/ngx_os.h index 658c0a400..1cc597b20 100644 --- a/src/os/unix/ngx_os.h +++ b/src/os/unix/ngx_os.h @@ -57,4 +57,9 @@ extern int rotate; #endif +#ifdef __linux__ +#include +#endif + + #endif /* _NGX_OS_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h index 57ef672e5..078d8d07c 100644 --- a/src/os/unix/ngx_solaris_config.h +++ b/src/os/unix/ngx_solaris_config.h @@ -17,8 +17,9 @@ #include #include #include - #include +#include +#include #include /* FIONBIO */ #include /* INFTIM */ #include @@ -26,16 +27,7 @@ #include #include #include - - -#if 0 -#define OFF_FMT "%lld" -#define SIZE_FMT "%d" -#define SIZEX_FMT "%x" -#define TIME_FMT "%ld" -#define PID_FMT "%ld" -#define RLIM_FMT "%lu" -#endif +#include #ifndef HAVE_SELECT diff --git a/src/os/unix/ngx_solaris_init.c b/src/os/unix/ngx_solaris_init.c index c593ed936..3b1383887 100644 --- a/src/os/unix/ngx_solaris_init.c +++ b/src/os/unix/ngx_solaris_init.c @@ -13,7 +13,7 @@ ngx_os_io_t ngx_os_io = { NULL, NULL, ngx_writev_chain, - NGX_HAVE_ZEROCOPY + 0 }; @@ -40,7 +40,7 @@ int ngx_os_init(ngx_log_t *log) return NGX_ERROR; } - ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %s %s" + ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %s %s", ngx_solaris_sysname, ngx_solaris_release); ngx_log_error(NGX_LOG_INFO, log, 0, "version: %s",