From 22f88f655075011c357cbdbf63cad09283ae411e Mon Sep 17 00:00:00 2001 From: leitner Date: Fri, 2 Nov 2007 00:39:51 +0000 Subject: [PATCH] add socket_deferaccept --- CHANGES | 1 + socket.h | 11 +++++++++++ socket/socket_deferaccept.c | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 socket/socket_deferaccept.c diff --git a/CHANGES b/CHANGES index 35e2225..2b5acf7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ 0.27: add fmt_strm add iob_addbuf_munmap + add socket_deferaccept 0.26: fix really pathological case where io_timeouted would never diff --git a/socket.h b/socket.h index b357213..7188547 100644 --- a/socket.h +++ b/socket.h @@ -50,6 +50,17 @@ int socket_mchopcount6(int s,char hops); int socket_mcloop4(int s,char hops); int socket_mcloop6(int s,char hops); +/* please note that these are platform specific. Do not expect them to + * work. You might still get an accept() signalled even though there is + * no data available. So far, DATAIN is supported on FreeBSD and Linux, + * and HTTPIN is supported on FreeBSD. */ +enum defermode { + DATAIN, // only signal accept() if there is data coming in + HTTPIN, // only signal accept() if a HTTP header has come in +}; + +void socket_deferaccept(int s,enum defermode mode); + void socket_tryreservein(int s,int size); const char* socket_getifname(uint32 _interface); diff --git a/socket/socket_deferaccept.c b/socket/socket_deferaccept.c new file mode 100644 index 0000000..1f150db --- /dev/null +++ b/socket/socket_deferaccept.c @@ -0,0 +1,19 @@ +#include "socket.h" + +#include +#include +#include +#include +#include + +void socket_deferaccept(int s,enum defermode mode) { +#ifdef TCP_DEFER_ACCEPT + int one=1; + setsockopt(s,IPPROTO_TCP,TCP_DEFER_ACCEPT,&one,sizeof(one)); +#elif defined(SO_ACCEPTFILTER) + struct accept_filter_arg afa; + memset(&afa,0,sizeof(afa)); + strcpy(afa.af_name,mode==HTTPIN?"httpreader":"dataready"); + setsockopt(sok, SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa)); +#endif +}