aboutsummaryrefslogtreecommitdiffstats
path: root/www
diff options
context:
space:
mode:
authorosa <osa@FreeBSD.org>2009-08-24 18:02:35 +0800
committerosa <osa@FreeBSD.org>2009-08-24 18:02:35 +0800
commit2e111c7edd87c6f0ddee2fee0baefca134896f15 (patch)
tree88fec4fc65b9a335c2bb90674cf20694bf5abe00 /www
parentc2fbd0a8f70ba166b26c7a0baaf12a9ce42e085c (diff)
downloadfreebsd-ports-gnome-2e111c7edd87c6f0ddee2fee0baefca134896f15.tar.gz
freebsd-ports-gnome-2e111c7edd87c6f0ddee2fee0baefca134896f15.tar.zst
freebsd-ports-gnome-2e111c7edd87c6f0ddee2fee0baefca134896f15.zip
Add http_redis module support.
Add experimental file aio support. Do not bump PORTREVISION cause new features are disabled by default.
Diffstat (limited to 'www')
-rw-r--r--www/nginx-devel/Makefile17
-rw-r--r--www/nginx-devel/distinfo3
-rw-r--r--www/nginx-devel/files/extra-patch-aio640
3 files changed, 660 insertions, 0 deletions
diff --git a/www/nginx-devel/Makefile b/www/nginx-devel/Makefile
index 87ef535478bb..eaecd739e359 100644
--- a/www/nginx-devel/Makefile
+++ b/www/nginx-devel/Makefile
@@ -18,6 +18,7 @@ MAINTAINER= osa@FreeBSD.org
COMMENT= Robust and small WWW server
OPTIONS= DEBUG "Enable nginx debugging" off \
+ FILE_AIO "Enable file aio (experimental)" off \
IPV6 "Enable IPv6" off \
GOOGLE_PERFTOOLS "Enable google perftools module" off \
HTTP_MODULE "Enable HTTP module" on \
@@ -48,6 +49,7 @@ OPTIONS= DEBUG "Enable nginx debugging" off \
HTTP_MOGILEFS_MODULE "3rd party mogilefs module" off \
HTTP_MP4_H264_MODULE "3rd party mp4/h264 module" off \
HTTP_NOTICE_MODULE "3rd party notice module" off \
+ HTTP_REDIS_MODULE "3rd party http_redis module" off \
HTTP_RESPONSE_MODULE "3rd party http_response module" off \
HTTP_UPLOAD_MODULE "3rd party upload module" off \
HTTP_UPLOAD_PROGRESS "3rd party upload_progress module" off \
@@ -102,6 +104,10 @@ CONFIGURE_ARGS+=--with-debug
STRIP= #do not strip if nginx with debug information
.endif
+.if defined(WITH_FILE_AIO)
+CONFIGURE_ARGS+=--with-file-aio
+.endif
+
.if defined(WITH_IPV6)
CONFIGURE_ARGS+=--with-ipv6
CATEGORIES+= ipv6
@@ -200,6 +206,14 @@ CONFIGURE_ARGS+=--with-http_random_index_module
CONFIGURE_ARGS+=--with-http_realip_module
.endif
+.if defined(WITH_HTTP_REDIS_MODULE)
+NGINX_REDIS_MODULE_VERSION= 0.1
+MASTER_SITES+= ${MASTER_SITE_LOCAL:S/$/:redis/}
+MASTER_SITE_SUBDIR+= osa/:redis
+DISTFILES+= ngx_http_redis-${NGINX_REDIS_MODULE_VERSION}.tar.gz:redis
+CONFIGURE_ARGS+=--add-module=${WRKDIR}/ngx_http_redis-${NGINX_REDIS_MODULE_VERSION}
+.endif
+
.if defined(WITH_HTTP_RESPONSE_MODULE)
NGINX_RESPONSE_MODULE_VERSION= 0.3
MASTER_SITES+= http://catap.ru/downloads/nginx/:response
@@ -331,6 +345,9 @@ post-patch:
@${REINPLACE_CMD} 's!%%HTTP_PORT%%!${HTTP_PORT}!; \
s!%%PREFIX%%!${PREFIX}!' \
${WRKSRC}/conf/nginx.conf
+.if defined(WITH_FILE_AIO)
+ @${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-aio
+.endif
.if defined(WITH_HTTP_ACCESSKEY_MODULE)
@${REINPLACE_CMD} \
's!$$HTTP_ACCESSKEY_MODULE!ngx_http_accesskey_module!' \
diff --git a/www/nginx-devel/distinfo b/www/nginx-devel/distinfo
index ce6fc1d01e69..3e8993efc38b 100644
--- a/www/nginx-devel/distinfo
+++ b/www/nginx-devel/distinfo
@@ -19,6 +19,9 @@ SIZE (nginx_mp4_streaming_public_20081229.tar.bz2) = 9469
MD5 (nginx-notice-2.tar.gz) = 7253bdd2b88cc981867b72efdc484772
SHA256 (nginx-notice-2.tar.gz) = 682824a9f5187831ee49e5828bafebde5c25706e681d361804f96308f24e58c2
SIZE (nginx-notice-2.tar.gz) = 3253
+MD5 (ngx_http_redis-0.1.tar.gz) = 166fc0e44746cbf6e80a722a01719f6c
+SHA256 (ngx_http_redis-0.1.tar.gz) = dc012006d20287e097459ec32defa932c6694340ce34587aeea8491e1e4da316
+SIZE (ngx_http_redis-0.1.tar.gz) = 4999
MD5 (ngx_http_response-0.3.tar.gz) = 178a8f13a41388ef50b3726fa9fede50
SHA256 (ngx_http_response-0.3.tar.gz) = 0835584029f053051c624adbe33a826ab0205c9d85a02af6019e6b57607e9045
SIZE (ngx_http_response-0.3.tar.gz) = 2244
diff --git a/www/nginx-devel/files/extra-patch-aio b/www/nginx-devel/files/extra-patch-aio
new file mode 100644
index 000000000000..d5ad8f65a486
--- /dev/null
+++ b/www/nginx-devel/files/extra-patch-aio
@@ -0,0 +1,640 @@
+Index: src/http/ngx_http_copy_filter_module.c
+===================================================================
+--- src/http/ngx_http_copy_filter_module.c (revision 2356)
++++ src/http/ngx_http_copy_filter_module.c (working copy)
+@@ -11,9 +11,18 @@
+
+ typedef struct {
+ ngx_bufs_t bufs;
++#if (NGX_HAVE_FILE_AIO)
++ ngx_flag_t aio;
++#endif
+ } ngx_http_copy_filter_conf_t;
+
+
++#if (NGX_HAVE_FILE_AIO)
++static void ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx,
++ ngx_file_t *file);
++static void ngx_http_copy_aio_event_handler(ngx_event_t *ev);
++#endif
++
+ static void *ngx_http_copy_filter_create_conf(ngx_conf_t *cf);
+ static char *ngx_http_copy_filter_merge_conf(ngx_conf_t *cf,
+ void *parent, void *child);
+@@ -29,6 +38,17 @@
+ offsetof(ngx_http_copy_filter_conf_t, bufs),
+ NULL },
+
++#if (NGX_HAVE_FILE_AIO)
++
++ { ngx_string("aio"),
++ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
++ ngx_conf_set_flag_slot,
++ NGX_HTTP_LOC_CONF_OFFSET,
++ offsetof(ngx_http_copy_filter_conf_t, aio),
++ NULL },
++
++#endif
++
+ ngx_null_command
+ };
+
+@@ -104,6 +124,12 @@
+ ctx->output_filter = (ngx_output_chain_filter_pt) ngx_http_next_filter;
+ ctx->filter_ctx = r;
+
++#if (NGX_HAVE_FILE_AIO)
++ if (conf->aio) {
++ ctx->aio = ngx_http_copy_aio_handler;
++ }
++#endif
++
+ r->request_output = 1;
+ }
+
+@@ -125,6 +151,37 @@
+ }
+
+
++#if (NGX_HAVE_FILE_AIO)
++
++static void
++ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)
++{
++ ngx_http_request_t *r;
++
++ r = ctx->filter_ctx;
++
++ file->aio->event->data = r;
++ file->aio->event->handler = ngx_http_copy_aio_event_handler;
++
++ r->connection->write->blocked = 1;
++}
++
++
++static void
++ngx_http_copy_aio_event_handler(ngx_event_t *ev)
++{
++ ngx_http_request_t *r;
++
++ r = ev->data;
++
++ r->connection->write->blocked = 0;
++
++ r->connection->write->handler(r->connection->write);
++}
++
++#endif
++
++
+ static void *
+ ngx_http_copy_filter_create_conf(ngx_conf_t *cf)
+ {
+@@ -136,6 +193,9 @@
+ }
+
+ conf->bufs.num = 0;
++#if (NGX_HAVE_FILE_AIO)
++ conf->aio = NGX_CONF_UNSET;
++#endif
+
+ return conf;
+ }
+@@ -148,6 +208,9 @@
+ ngx_http_copy_filter_conf_t *conf = child;
+
+ ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, 1, 32768);
++#if (NGX_HAVE_FILE_AIO)
++ ngx_conf_merge_value(conf->aio, prev->aio, 0);
++#endif
+
+ return NULL;
+ }
+Index: src/http/ngx_http_request.c
+===================================================================
+--- src/http/ngx_http_request.c (revision 2356)
++++ src/http/ngx_http_request.c (working copy)
+@@ -1868,6 +1868,11 @@
+ return;
+ }
+
++ if (c->write->blocked) {
++ (void) ngx_http_set_write_handler(r);
++ return;
++ }
++
+ ngx_http_close_request(r, 0);
+ return;
+ }
+@@ -1966,7 +1971,7 @@
+ return;
+ }
+
+- if (r->buffered || c->buffered || r->postponed) {
++ if (r->buffered || c->buffered || r->postponed || c->write->blocked) {
+
+ if (ngx_http_set_write_handler(r) != NGX_OK) {
+ ngx_http_close_request(r, 0);
+@@ -2100,7 +2105,7 @@
+ }
+
+ } else {
+- if (wev->delayed) {
++ if (wev->delayed || wev->blocked) {
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
+ "http writer delayed");
+
+Index: src/event/ngx_event.h
+===================================================================
+--- src/event/ngx_event.h (revision 2356)
++++ src/event/ngx_event.h (working copy)
+@@ -67,6 +67,7 @@
+ unsigned timer_set:1;
+
+ unsigned delayed:1;
++ unsigned blocked:1;
+
+ unsigned read_discarded:1;
+
+Index: src/os/unix/ngx_file_aio_read.c
+===================================================================
+--- src/os/unix/ngx_file_aio_read.c (revision 0)
++++ src/os/unix/ngx_file_aio_read.c (revision 0)
+@@ -0,0 +1,116 @@
++
++/*
++ * Copyright (C) Igor Sysoev
++ */
++
++
++#include <ngx_config.h>
++#include <ngx_core.h>
++#include <ngx_event.h>
++
++#if (NGX_HAVE_KQUEUE)
++#include <ngx_kqueue_module.h>
++#endif
++
++
++ssize_t
++ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
++{
++ int n;
++ ngx_event_t *ev;
++ ngx_file_aio_ident_t *aio;
++
++ aio = file->aio;
++ ev = aio->event;
++
++ if (!ev->ready) {
++ ngx_log_error(NGX_LOG_ALERT, file->log, 0, "second aio post");
++ return NGX_AGAIN;
++ }
++
++ ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
++ "complete:%d size:%z", ev->complete, size);
++
++ if (!ev->complete) {
++ aio->aiocb.aio_fildes = file->fd;
++ aio->aiocb.aio_offset = offset;
++ aio->aiocb.aio_buf = buf;
++ aio->aiocb.aio_nbytes = size;
++
++#if (NGX_HAVE_KQUEUE)
++ aio->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
++ aio->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
++ aio->aiocb.aio_sigevent.sigev_value.sigval_ptr = ev;
++#endif
++
++ n = aio_read(&aio->aiocb);
++
++ if (n == -1) {
++ n = ngx_errno;
++
++ if (n == NGX_EAGAIN || n == NGX_ENOSYS) {
++ return NGX_BUSY;
++ }
++
++ ngx_log_error(NGX_LOG_CRIT, file->log, n, "aio_read() failed");
++ return NGX_ERROR;
++ }
++
++ ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
++ "aio_read: fd:%d %d", file->fd, n);
++
++ ev->active = 1;
++ ev->ready = 0;
++ }
++
++ ev->complete = 0;
++
++ n = aio_error(&aio->aiocb);
++
++ ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
++ "aio_error: fd:%d %d", file->fd, n);
++
++ if (n == -1) {
++ ngx_log_error(NGX_LOG_ALERT, file->log, ngx_errno,
++ "aio_error() failed");
++ return NGX_ERROR;
++ }
++
++ if (n != 0) {
++ if (n == NGX_EINPROGRESS) {
++ if (ev->ready) {
++ ngx_log_error(NGX_LOG_ALERT, file->log, n,
++ "aio_read() still in progress");
++ ev->ready = 0;
++ }
++ return NGX_AGAIN;
++ }
++
++ ngx_log_error(NGX_LOG_CRIT, file->log, n, "aio_read() failed");
++ ev->ready = 0;
++ return NGX_ERROR;
++ }
++
++ n = aio_return(&aio->aiocb);
++
++ if (n == -1) {
++ ngx_log_error(NGX_LOG_ALERT, file->log, ngx_errno,
++ "aio_return() failed");
++ ev->ready = 0;
++ return NGX_ERROR;
++ }
++
++ ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0,
++ "aio_return: fd:%d %d", file->fd, n);
++
++ if (n == 0) {
++ ev->ready = 0;
++
++ } else {
++ ev->ready = 1;
++ }
++
++ ev->active = 0;
++
++ return n;
++}
+Index: src/os/unix/ngx_posix_config.h
+===================================================================
+--- src/os/unix/ngx_posix_config.h (revision 2356)
++++ src/os/unix/ngx_posix_config.h (working copy)
+@@ -112,6 +112,11 @@
+ #endif
+
+
++#if (NGX_HAVE_FILE_AIO)
++#include <aio.h>
++#endif
++
++
+ #define NGX_LISTEN_BACKLOG 511
+
+
+Index: src/os/unix/ngx_linux_config.h
+===================================================================
+--- src/os/unix/ngx_linux_config.h (revision 2356)
++++ src/os/unix/ngx_linux_config.h (working copy)
+@@ -81,6 +81,11 @@
+ #endif
+
+
++#if (NGX_HAVE_FILE_AIO)
++#include <aio.h>
++#endif
++
++
+ #define NGX_LISTEN_BACKLOG 511
+
+
+Index: src/os/unix/ngx_freebsd_config.h
+===================================================================
+--- src/os/unix/ngx_freebsd_config.h (revision 2356)
++++ src/os/unix/ngx_freebsd_config.h (working copy)
+@@ -73,13 +73,13 @@
+ #endif
+
+
+-#if (NGX_HAVE_AIO)
+-#include <aio.h>
++#if (NGX_HAVE_KQUEUE)
++#include <sys/event.h>
+ #endif
+
+
+-#if (NGX_HAVE_KQUEUE)
+-#include <sys/event.h>
++#if (NGX_HAVE_FILE_AIO || NGX_HAVE_AIO)
++#include <aio.h>
+ #endif
+
+
+Index: src/os/unix/ngx_solaris_config.h
+===================================================================
+--- src/os/unix/ngx_solaris_config.h (revision 2356)
++++ src/os/unix/ngx_solaris_config.h (working copy)
+@@ -62,24 +62,24 @@
+ #endif
+
+
+-#if (NGX_HAVE_SENDFILE)
+-#include <sys/sendfile.h>
++#if (NGX_HAVE_DEVPOLL)
++#include <sys/ioctl.h>
++#include <sys/devpoll.h>
+ #endif
+
+
+-#if (NGX_HAVE_AIO)
+-#include <aio.h>
++#if (NGX_HAVE_EVENTPORT)
++#include <port.h>
+ #endif
+
+
+-#if (NGX_HAVE_DEVPOLL)
+-#include <sys/ioctl.h>
+-#include <sys/devpoll.h>
++#if (NGX_HAVE_SENDFILE)
++#include <sys/sendfile.h>
+ #endif
+
+
+-#if (NGX_HAVE_EVENTPORT)
+-#include <port.h>
++#if (NGX_HAVE_FILE_AIO)
++#include <aio.h>
+ #endif
+
+
+Index: src/os/unix/ngx_files.h
+===================================================================
+--- src/os/unix/ngx_files.h (revision 2356)
++++ src/os/unix/ngx_files.h (working copy)
+@@ -287,4 +287,12 @@
+ #define ngx_set_stderr_n "dup2(STDERR_FILENO)"
+
+
++#if (NGX_HAVE_FILE_AIO)
++
++ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size,
++ off_t offset);
++
++#endif
++
++
+ #endif /* _NGX_FILES_H_INCLUDED_ */
+Index: src/core/ngx_output_chain.c
+===================================================================
+--- src/core/ngx_output_chain.c (revision 2356)
++++ src/core/ngx_output_chain.c (working copy)
+@@ -28,6 +28,11 @@
+ #define NGX_NONE 1
+
+
++#if (NGX_HAVE_FILE_AIO)
++static ssize_t ngx_aio_read_file(ngx_output_chain_ctx_t *ctx, ngx_buf_t *src,
++ ngx_buf_t *dst, size_t size);
++#endif
++
+ static ngx_inline ngx_int_t
+ ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf);
+ static ngx_int_t ngx_output_chain_add_copy(ngx_pool_t *pool,
+@@ -519,8 +524,30 @@
+
+ #endif
+
++#if (NGX_HAVE_FILE_AIO)
++
++ if (ctx->aio) {
++ n = ngx_aio_read_file(ctx, src, dst, size);
++
++ if (n == NGX_AGAIN) {
++ return (ngx_int_t) n;
++ }
++
++ } else {
++ n = NGX_BUSY;
++ }
++
++ if (n == NGX_BUSY) {
++ n = ngx_read_file(src->file, dst->pos, (size_t) size,
++ src->file_pos);
++ }
++
++#else
++
+ n = ngx_read_file(src->file, dst->pos, (size_t) size, src->file_pos);
+
++#endif
++
+ #if (NGX_HAVE_ALIGNED_DIRECTIO)
+
+ if (ctx->unaligned) {
+@@ -545,12 +572,6 @@
+ return (ngx_int_t) n;
+ }
+
+-#if (NGX_FILE_AIO_READ)
+- if (n == NGX_AGAIN) {
+- return (ngx_int_t) n;
+- }
+-#endif
+-
+ if (n != size) {
+ ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0,
+ ngx_read_file_n " read only %z of %O from \"%s\"",
+@@ -585,6 +606,45 @@
+ }
+
+
++#if (NGX_HAVE_FILE_AIO)
++
++static ssize_t
++ngx_aio_read_file(ngx_output_chain_ctx_t *ctx, ngx_buf_t *src, ngx_buf_t *dst,
++ size_t size)
++{
++ ssize_t n;
++ ngx_file_t *file;
++
++ file = src->file;
++
++ if (file->aio == NULL) {
++ file->aio = ngx_pcalloc(ctx->pool, sizeof(ngx_file_aio_ident_t));
++ if (file->aio == NULL) {
++ return NGX_ERROR;
++ }
++
++ file->aio->event = ngx_pcalloc(ctx->pool, sizeof(ngx_event_t));
++ if (file->aio->event == NULL) {
++ return NGX_ERROR;
++ }
++
++ file->aio->event->ready = 1;
++ file->aio->event->log = file->log;
++ file->aio->fd = file->fd;
++ }
++
++ n = ngx_file_aio_read(src->file, dst->pos, size, src->file_pos);
++
++ if (n == NGX_AGAIN) {
++ ctx->aio(ctx, src->file);
++ }
++
++ return n;
++}
++
++#endif
++
++
+ ngx_int_t
+ ngx_chain_writer(void *data, ngx_chain_t *in)
+ {
+Index: src/core/ngx_buf.h
+===================================================================
+--- src/core/ngx_buf.h (revision 2356)
++++ src/core/ngx_buf.h (working copy)
+@@ -67,9 +67,16 @@
+ } ngx_bufs_t;
+
+
++typedef struct ngx_output_chain_ctx_s ngx_output_chain_ctx_t;
++
+ typedef ngx_int_t (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *in);
+
+-typedef struct {
++#if (NGX_HAVE_FILE_AIO)
++typedef void (*ngx_output_chain_aio_pt)(ngx_output_chain_ctx_t *ctx,
++ ngx_file_t *file);
++#endif
++
++struct ngx_output_chain_ctx_s {
+ ngx_buf_t *buf;
+ ngx_chain_t *in;
+ ngx_chain_t *free;
+@@ -90,9 +97,13 @@
+
+ ngx_output_chain_filter_pt output_filter;
+ void *filter_ctx;
+-} ngx_output_chain_ctx_t;
+
++#if (NGX_HAVE_FILE_AIO)
++ ngx_output_chain_aio_pt aio;
++#endif
++};
+
++
+ typedef struct {
+ ngx_chain_t *out;
+ ngx_chain_t **last;
+Index: src/core/ngx_file.h
+===================================================================
+--- src/core/ngx_file.h (revision 2356)
++++ src/core/ngx_file.h (working copy)
+@@ -12,6 +12,22 @@
+ #include <ngx_core.h>
+
+
++#if (NGX_HAVE_FILE_AIO)
++
++typedef struct {
++ ngx_connection_t *connection;
++
++ /* STUB: event is pointer because ngx_event_s definition is incomplete */
++ ngx_event_t *event;
++ void *dummy;
++ ngx_fd_t fd;
++
++ struct aiocb aiocb;
++} ngx_file_aio_ident_t;
++
++#endif
++
++
+ struct ngx_file_s {
+ ngx_fd_t fd;
+ ngx_str_t name;
+@@ -22,10 +38,15 @@
+
+ ngx_log_t *log;
+
++#if (NGX_HAVE_FILE_AIO)
++ ngx_file_aio_ident_t *aio;
++#endif
++
+ unsigned valid_info:1;
+ unsigned directio:1;
+ };
+
++
+ #define NGX_MAX_PATH_LEVEL 3
+
+
+Index: auto/os/features
+===================================================================
+--- auto/os/features (revision 2356)
++++ auto/os/features (working copy)
+@@ -274,3 +274,21 @@
+ CORE_LIBS="$CORE_LIBS -lrt"
+ fi
+ fi
++
++
++if [ $NGX_FILE_AIO = YES ]; then
++ ngx_feature="kqueue AIO support"
++ ngx_feature_name="NGX_HAVE_FILE_AIO"
++ ngx_feature_run=no
++ ngx_feature_incs="#include <aio.h>"
++ ngx_feature_path=
++ ngx_feature_libs=
++ ngx_feature_test="int n; struct aiocb iocb;
++ iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
++ n = aio_read(&iocb)"
++ . auto/feature
++
++ if [ $ngx_found = yes ]; then
++ CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS"
++ fi
++fi
+Index: auto/sources
+===================================================================
+--- auto/sources (revision 2356)
++++ auto/sources (working copy)
+@@ -125,6 +125,7 @@
+ src/os/unix/ngx_aio_read_chain.c \
+ src/os/unix/ngx_aio_write_chain.c"
+
++FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"
+
+ UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"
+
+Index: auto/options
+===================================================================
+--- auto/options (revision 2356)
++++ auto/options (working copy)
+@@ -43,6 +43,7 @@
+
+ USE_THREADS=NO
+
++NGX_FILE_AIO=NO
+ NGX_IPV6=NO
+
+ HTTP=YES
+@@ -170,6 +171,7 @@
+ #--with-threads=*) USE_THREADS="$value" ;;
+ #--with-threads) USE_THREADS="pthreads" ;;
+
++ --with-file-aio) NGX_FILE_AIO=YES ;;
+ --with-ipv6) NGX_IPV6=YES ;;
+
+ --without-http) HTTP=NO ;;
+@@ -305,6 +307,7 @@
+ --with-poll_module enable poll module
+ --without-poll_module disable poll module
+
++ --with-file-aio enable file aio support
+ --with-ipv6 enable ipv6 support
+
+ --with-http_ssl_module enable ngx_http_ssl_module