summaryrefslogtreecommitdiff
path: root/evutil.c
diff options
context:
space:
mode:
authorMark Ellzey <mark.thomas@mandiant.com>2012-02-14 18:04:52 -0500
committerNick Mathewson <nickm@torproject.org>2012-02-15 21:19:28 -0500
commit5880e4a1fc41908b8750662c69b1c59639898149 (patch)
treefebea79c61931ea6301cde6c9d5a62b8abac4230 /evutil.c
parenta220a08139890048ac9a11855be5367865ed15f4 (diff)
downloadlibevent-5880e4a1fc41908b8750662c69b1c59639898149.tar.gz
Support TCP_DEFER_ACCEPT sockopts for listeners
A listening socket can be enabled with the sockopt TCP_DEFER_ACCEPT. This informs the kernel to not call the user-land accept() until real data has been written to the socket. A new flag LEV_OPT_DEFERRED_ACCEPT has been introduced to automatically set this option. Optionally evutil_make_tcp_listen_socket_deferred() can be called manually. (Tweaked slightly by nickm.)
Diffstat (limited to 'evutil.c')
-rw-r--r--evutil.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/evutil.c b/evutil.c
index bc81a093..c340b54a 100644
--- a/evutil.c
+++ b/evutil.c
@@ -64,6 +64,9 @@
#ifdef _EVENT_HAVE_NETINET_IN6_H
#include <netinet/in6.h>
#endif
+#ifdef _EVENT_HAVE_NETINET_TCP_H
+#include <netinet/tcp.h>
+#endif
#ifdef _EVENT_HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
@@ -365,6 +368,20 @@ evutil_make_listen_socket_reuseable(evutil_socket_t sock)
}
int
+evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock)
+{
+#if defined(_EVENT_HAVE_NETINET_TCP_H) && defined(TCP_DEFER_ACCEPT)
+ int one = 1;
+
+ /* TCP_DEFER_ACCEPT tells the kernel to call defer accept() only after data
+ * has arrived and ready to read */
+ return setsockopt(sock, IPPROTO_TCP, TCP_DEFER_ACCEPT, &one,
+ (ev_socklen_t)sizeof(one));
+#endif
+ return 0;
+}
+
+int
evutil_make_socket_closeonexec(evutil_socket_t fd)
{
#if !defined(_WIN32) && defined(_EVENT_HAVE_SETFD)