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;
     }

Reply via email to