diff options
author | pquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68> | 2004-12-11 09:45:06 +0000 |
---|---|---|
committer | pquerna <pquerna@13f79535-47bb-0310-9956-ffa450edef68> | 2004-12-11 09:45:06 +0000 |
commit | 325cb415d1588a1a43761c3cb0ddd6fa34c889da (patch) | |
tree | fa6d1a43132539e815001bcb56a2866d391ef5ee | |
parent | 27ba830957e2ede777f19c6390ab7e6d9d445794 (diff) | |
download | libapr-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-- | CHANGES | 3 | ||||
-rw-r--r-- | include/apr_network_io.h | 4 | ||||
-rw-r--r-- | network_io/unix/sockopt.c | 15 |
3 files changed, 22 insertions, 0 deletions
@@ -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) { |