diff --git a/auto/func b/auto/func index fcbbe0183..3f12b7890 100644 --- a/auto/func +++ b/auto/func @@ -5,10 +5,11 @@ echo "checking for $ngx_func" >> $NGX_ERR ngx_found=no -func=`echo $ngx_func | sed -e 's/()$//' | tr '[a-z]' '[A-Z]'` +func=`echo $ngx_func | sed -e 's/()$//' | tr '[a-z.]' '[A-Z_]'` cat << END > $NGX_AUTOTEST.c +#include $NGX_UNISTD_H $ngx_func_inc diff --git a/auto/os/conf b/auto/os/conf index 94fdbcd56..623ba3129 100644 --- a/auto/os/conf +++ b/auto/os/conf @@ -45,4 +45,10 @@ case $PLATFORM in CORE_LIBS="$CORE_LIBS ws2_32.lib" ;; + *) + CORE_INCS="$UNIX_INCS" + CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" + CORE_SRCS="$UNIX_SRCS" + ;; + esac diff --git a/auto/os/freebsd b/auto/os/freebsd index 53d732207..5fa8e33e3 100644 --- a/auto/os/freebsd +++ b/auto/os/freebsd @@ -66,6 +66,3 @@ if [ $EVENT_AIO = YES ]; then else have=HAVE_AIO . auto/nohave fi - - -have=HAVE_MSGHDR_MSG_CONTROL . auto/have diff --git a/auto/os/linux b/auto/os/linux index 6a9b8b559..c34fba1ac 100644 --- a/auto/os/linux +++ b/auto/os/linux @@ -77,6 +77,3 @@ ngx_func_test="prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)" if [ $ngx_found = yes ]; then have=HAVE_PR_SET_DUMPABLE . auto/have fi - - -have=HAVE_MSGHDR_MSG_CONTROL . auto/have diff --git a/auto/sources b/auto/sources index c48443392..a49cca0b3 100644 --- a/auto/sources +++ b/auto/sources @@ -125,6 +125,8 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \ src/os/unix/ngx_posix_init.c \ src/os/unix/ngx_process_cycle.c" +POSIX_DEPS=src/os/unix/ngx_posix_config.h + 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 diff --git a/auto/unix b/auto/unix index c150f2e9c..183a5039e 100755 --- a/auto/unix +++ b/auto/unix @@ -41,8 +41,7 @@ ngx_types="int"; . auto/types/typedef ngx_func="sin_len" -ngx_func_inc="#include -#include +ngx_func_inc="#include #include " ngx_func_test="struct sockaddr_in sa; sa.sin_len = 5" @@ -122,3 +121,15 @@ ngx_func="memalign()" ngx_func_inc="#include " ngx_func_test="void *p; p = memalign(4096, 4096)" . auto/func + + +ngx_func="msghdr.msg_control" +ngx_func_inc="#include " +ngx_func_test="struct msghdr msg; msg.msg_control = NULL" +. auto/func + + +ngx_func="FIONBIO" +ngx_func_inc="#include " +ngx_func_test="int i; i = FIONBIO" +. auto/func diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h index 02983151a..57039b9fe 100644 --- a/src/core/ngx_config.h +++ b/src/core/ngx_config.h @@ -22,17 +22,11 @@ #elif defined _WIN32 - -/* STUB to allocate a big ngx_connections */ -#undef FD_SETSIZE -#define FD_SETSIZE 1024 - #include #else /* posix */ - -#include +#include #endif diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 39fb3f76f..93b3cf3e7 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -596,12 +596,14 @@ static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf) /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */ +#if !(WIN32) if ((unsigned) ecf->connections > FD_SETSIZE) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "the maximum number of files " "supported by select() is " ngx_value(FD_SETSIZE)); return NGX_CONF_ERROR; } +#endif return NGX_CONF_OK; } diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index a1153a6dd..d669182a0 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -658,8 +658,12 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) #elif (HAVE_SELECT) +#if (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_value(ecf->use, ngx_select_module.ctx_index); ngx_conf_init_ptr_value(ecf->name, ngx_select_module_ctx.name->data); diff --git a/src/http/modules/ngx_http_gzip_filter.c b/src/http/modules/ngx_http_gzip_filter.c index cc7ba9c28..0e02015ca 100644 --- a/src/http/modules/ngx_http_gzip_filter.c +++ b/src/http/modules/ngx_http_gzip_filter.c @@ -668,7 +668,15 @@ static int ngx_http_gzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in) trailer->crc32 = ctx->crc32; trailer->zlen = ctx->zin; #else - /* STUB */ Oops ! + trailer->crc32[0] = ctx->crc32 & 0xff; + trailer->crc32[1] = (ctx->crc32 >> 8) & 0xff; + trailer->crc32[2] = (ctx->crc32 >> 16) & 0xff; + trailer->crc32[3] = (ctx->crc32 >> 24) & 0xff; + + trailer->zlen[0] = ctx->zin & 0xff; + trailer->zlen[1] = (ctx->zin >> 8) & 0xff; + trailer->zlen[2] = (ctx->zin >> 16) & 0xff; + trailer->zlen[3] = (ctx->zin >> 24) & 0xff; #endif ctx->zstream.avail_in = 0; diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h index f0a8430fe..ce77ab938 100644 --- a/src/os/unix/ngx_freebsd_config.h +++ b/src/os/unix/ngx_freebsd_config.h @@ -2,35 +2,38 @@ #define _NGX_FREEBSD_CONFIG_H_INCLUDED_ +#include +#include #include -#include /* offsetof() */ -#include #include +#include /* offsetof() */ #include +#include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* TCP_NOPUSH */ -#include #include #include -#include #include -#include /* setproctitle() brefore 4.1 */ + +#include +#include /* FIONBIO */ +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include /* setproctitle() before 4.1 */ #include +#include +#include /* TCP_NOPUSH */ #include @@ -89,11 +92,6 @@ pid_t rfork_thread(int flags, void *stack, int (*func)(void *arg), void *arg); #endif -#ifndef HAVE_FIONBIO -#define HAVE_FIONBIO 1 -#endif - - /* STUB: autoconf */ #define ngx_setproctitle setproctitle diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index 95cf54a34..2b6eb9cb3 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -8,35 +8,43 @@ #define _LARGEFILE_SOURCE -#include -#include /* offsetof() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* TCP_CORK */ -#include +#include +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include #include #include -#include #include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include /* tzset() */ +#include +#include +#include /* TCP_CORK */ + + +/* Linux has no so autoconfigure does not find FIONBIO */ +#ifndef HAVE_FIONBIO +#define HAVE_FIONBIO 1 +#endif #include @@ -80,11 +88,6 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); #endif -#ifndef HAVE_FIONBIO -#define HAVE_FIONBIO 1 -#endif - - #ifndef HAVE_SELECT_CHANGE_TIMEOUT #define HAVE_SELECT_CHANGE_TIMEOUT 1 #endif diff --git a/src/os/unix/ngx_posix_config.h b/src/os/unix/ngx_posix_config.h new file mode 100644 index 000000000..e6da52ffa --- /dev/null +++ b/src/os/unix/ngx_posix_config.h @@ -0,0 +1,55 @@ +#ifndef _NGX_POSIX_CONFIG_H_INCLUDED_ +#define _NGX_POSIX_CONFIG_H_INCLUDED_ + + +#include +#include +#include +#include +#include /* offsetof() */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include /* FIONBIO */ +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + + +#ifndef HAVE_SELECT +#define HAVE_SELECT 1 +#endif + + +#ifndef HAVE_POLL +#define HAVE_POLL 1 +#endif +#if (HAVE_POLL) +#include +#endif + + +#define ngx_setproctitle(title) + + +#define NGX_POSIX_IO 1 + + +#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c index e2ed96a90..f94ffffc6 100644 --- a/src/os/unix/ngx_posix_init.c +++ b/src/os/unix/ngx_posix_init.c @@ -7,6 +7,26 @@ int ngx_max_sockets; int ngx_inherited_nonblocking; +#if (NGX_POSIX_IO) + +ngx_os_io_t ngx_os_io = { + ngx_unix_recv, + ngx_readv_chain, + NULL, + ngx_writev_chain, + 0 +}; + + +int ngx_os_init(ngx_log_t *log) +{ + return ngx_posix_init(log); +} + + +#endif + + void ngx_signal_handler(int signo); diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 81af78fca..3d05a35ea 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -6,6 +6,7 @@ static void ngx_execute_proc(ngx_cycle_t *cycle, void *data); +ngx_int_t ngx_current_slot; ngx_int_t ngx_last_process; ngx_socket_t ngx_channel; ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; @@ -44,6 +45,7 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, } ngx_channel = ngx_processes[s].channel[1]; + ngx_current_slot = s; pid = fork(); diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h index 1ce39e5f6..9b7ae4448 100644 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h @@ -49,6 +49,7 @@ ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); void ngx_process_get_status(void); extern ngx_pid_t ngx_pid; +extern ngx_int_t ngx_current_slot; extern ngx_int_t ngx_last_process; extern ngx_socket_t ngx_channel; extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c index d30e73812..262b769a4 100644 --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -527,10 +527,16 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) } } - for (n = 0; n < ngx_last_process; n++) { + for (n = 0; n <= ngx_last_process; n++) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "close channel %d", ngx_processes[n].channel[1]); + if (n == ngx_current_slot) { + if (close(ngx_processes[n].channel[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "close() failed"); + } + + continue; + } if (close(ngx_processes[n].channel[1]) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, @@ -538,11 +544,6 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) } } - if (close(ngx_processes[ngx_last_process].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - } - #if 0 ngx_last_process = 0; #endif @@ -737,7 +738,7 @@ ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, msg.msg_controllen = 0; } else { - msg.msg_control = &cm; + msg.msg_control = (caddr_t) &cm; msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int); cm.cmsg_len = sizeof(struct cmsghdr) + sizeof(int); @@ -802,7 +803,7 @@ ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, msg.msg_iovlen = 1; #if (HAVE_MSGHDR_MSG_CONTROL) - msg.msg_control = &cm; + msg.msg_control = (caddr_t) &cm; msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int); #else msg.msg_accrights = (caddr_t) &fd; @@ -830,7 +831,7 @@ ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, #if (HAVE_MSGHDR_MSG_CONTROL) if (ch->command == NGX_CMD_OPEN_CHANNEL) { - cm = msg.msg_control; + cm = (struct cmsghdr *) msg.msg_control; if (cm == NULL) { ngx_log_error(NGX_LOG_ALERT, log, 0, diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h index 431841cff..b1e71cd4e 100644 --- a/src/os/unix/ngx_solaris_config.h +++ b/src/os/unix/ngx_solaris_config.h @@ -6,34 +6,41 @@ #define _REENTRANT -#define _FILE_OFFSET_BITS 64 /* must be before sys/types.h */ +#define _FILE_OFFSET_BITS 64 /* must be before */ +#include +#include #include -#include -#include /* offsetof() */ -#include #include +#include /* offsetof() */ #include +#include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include /* FIONBIO */ -#include -#include -#include #include #include -#include #include +#include +#include /* FIONBIO */ +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* IOV_MAX */ +#include + #include @@ -66,11 +73,6 @@ #endif -#ifndef HAVE_FIONBIO -#define HAVE_FIONBIO 1 -#endif - - #define ngx_setproctitle(title)