Compiles and works in initial testing on Linux 2.6 (debian sarge).
--
Brian Akins
Lead Systems Engineer
CNN Internet Technologies
diff -ur httpd-2.0.54/server/listen.c httpd-2.0.54-bakins/server/listen.c
--- httpd-2.0.54/server/listen.c 2005-02-04 15:21:18.000000000 -0500
+++ httpd-2.0.54-bakins/server/listen.c 2005-05-04 15:52:02.477302615 -0400
@@ -161,6 +161,15 @@
}
#endif
+ stat = apr_socket_opt_set(s, APR_TCP_DEFER_ACCEPT, one);
+ if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) {
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p,
+ "make_sock: for address %pI, apr_socket_opt_set: (APR_TCP_DEFER_ACCEPT)",
+ server->bind_addr);
+ apr_socket_close(s);
+ return stat;
+ }
+
#if APR_HAS_SO_ACCEPTFILTER
#ifndef ACCEPT_FILTER_NAME
#define ACCEPT_FILTER_NAME "httpready"
diff -ur httpd-2.0.54/srclib/apr/include/apr_network_io.h httpd-2.0.54-bakins/srclib/apr/include/apr_network_io.h
--- httpd-2.0.54/srclib/apr/include/apr_network_io.h 2005-02-04 15:36:31.000000000 -0500
+++ httpd-2.0.54-bakins/srclib/apr/include/apr_network_io.h 2005-05-04 15:48:22.975516298 -0400
@@ -102,6 +102,10 @@
* IPv6 listening socket.
*/
+#define APR_TCP_DEFER_ACCEPT 32768 /**< Delay accepting of new connections
+ * until data is available.
+ */
+
/** @} */
/** Define what type of socket shutdown should occur. */
diff -ur httpd-2.0.54/srclib/apr/network_io/unix/sockopt.c httpd-2.0.54-bakins/srclib/apr/network_io/unix/sockopt.c
--- httpd-2.0.54/srclib/apr/network_io/unix/sockopt.c 2005-02-04 15:36:31.000000000 -0500
+++ httpd-2.0.54-bakins/srclib/apr/network_io/unix/sockopt.c 2005-05-04 15:49:21.557575142 -0400
@@ -301,6 +301,18 @@
return APR_ENOTIMPL;
#endif
break;
+ case APR_TCP_DEFER_ACCEPT:
+#ifdef TCP_DEFER_ACCEPT:
+ if (on != apr_is_option_set(sock->netmask, APR_TCP_DEFER_ACCEPT)) {
+ if (setsockopt(sock->socketdes, SOL_TCP, TCP_DEFER_ACCEPT, (void *)&one, sizeof(int)) == -1) {
+ return errno;
+ }
+ apr_set_option(&sock->netmask, APR_TCP_DEFER_ACCEPT, on);
+ }
+#else
+ return APR_ENOTIMPL;
+#endif
+ break;
default:
return APR_EINVAL;
}