diff options
author | Mark Ellzey <mark.thomas@mandiant.com> | 2012-02-14 18:04:52 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-02-15 21:19:28 -0500 |
commit | 5880e4a1fc41908b8750662c69b1c59639898149 (patch) | |
tree | febea79c61931ea6301cde6c9d5a62b8abac4230 /evutil.c | |
parent | a220a08139890048ac9a11855be5367865ed15f4 (diff) | |
download | libevent-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.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -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) |