summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68>2004-12-11 09:45:06 +0000
committerpquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68>2004-12-11 09:45:06 +0000
commit325cb415d1588a1a43761c3cb0ddd6fa34c889da (patch)
treefa6d1a43132539e815001bcb56a2866d391ef5ee
parent27ba830957e2ede777f19c6390ab7e6d9d445794 (diff)
downloadlibapr-325cb415d1588a1a43761c3cb0ddd6fa34c889da.tar.gz
Add support for Linux's TCP_DEFER_ACCEPT. Sort of like FreeBSD's accept filters, except defer accept isn't documented, anywhere.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@111595 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--include/apr_network_io.h4
-rw-r--r--network_io/unix/sockopt.c15
3 files changed, 22 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 8c2544c54..41d29a3a7 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
Changes for APR 1.1.0
+ *) Add support for APR_TCP_DEFER_ACCEPT.
+ [Paul Querna]
+
*) rename the apr_file_permissions defines (APR_UREAD,
APR_UWRITE, etc.) to have prefix APR_FPROT_ (keeping the
old defines) [Stas]
diff --git a/include/apr_network_io.h b/include/apr_network_io.h
index 3e1475229..97c18330d 100644
--- a/include/apr_network_io.h
+++ b/include/apr_network_io.h
@@ -94,6 +94,10 @@ extern "C" {
#define APR_IPV6_V6ONLY 16384 /**< Don't accept IPv4 connections on an
* IPv6 listening socket.
*/
+#define APR_TCP_DEFER_ACCEPT 32768 /**< Delay accepting of new connections
+ * until data is available.
+ * @see apr_socket_accept_filter
+ */
/** @} */
diff --git a/network_io/unix/sockopt.c b/network_io/unix/sockopt.c
index 036215f61..35eade085 100644
--- a/network_io/unix/sockopt.c
+++ b/network_io/unix/sockopt.c
@@ -199,6 +199,21 @@ apr_status_t apr_socket_opt_set(apr_socket_t *sock,
return APR_ENOTIMPL;
#endif
break;
+ case APR_TCP_DEFER_ACCEPT:
+#if defined(TCP_DEFER_ACCEPT)
+ if (apr_is_option_set(sock, APR_TCP_DEFER_ACCEPT) != on) {
+ int optlevel = IPPROTO_TCP;
+ int optname = TCP_DEFER_ACCEPT;
+
+ if (setsockopt(sock->socketdes, optlevel, optname,
+ (void *)&on, sizeof(int)) == -1) {
+ return errno;
+ }
+ apr_set_option(sock, APR_TCP_DEFER_ACCEPT, on);
+ }
+#else
+ return APR_ENOTIMPL;
+#endif
case APR_TCP_NODELAY:
#if defined(TCP_NODELAY)
if (apr_is_option_set(sock, APR_TCP_NODELAY) != on) {