From: Willy Tarreau Date: Mon, 22 Oct 2012 17:32:55 +0000 (+0200) Subject: MEDIUM: listener: provide a fallback for accept4() when not supported X-Git-Tag: v1.5-dev13~126 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b3b0d4736f2e27cbbcd2f8f94edad3a1fb1c574;p=thirdparty%2Fhaproxy.git MEDIUM: listener: provide a fallback for accept4() when not supported It happens that on some systems, the libc is recent enough to permit building with accept4() but the kernel does not support it. The result is then a disaster since no connection is accepted. We now detect this and automatically fall back to accept() and fcntl() when this happens. --- diff --git a/src/listener.c b/src/listener.c index c4259bcd5a..6781e587cd 100644 --- a/src/listener.c +++ b/src/listener.c @@ -311,6 +311,11 @@ void listener_accept(int fd) #ifdef USE_ACCEPT4 cfd = accept4(fd, (struct sockaddr *)&addr, &laddr, SOCK_NONBLOCK); + if (unlikely(cfd == -1 && errno == EINVAL)) { + /* unsupported syscall, fallback to normal accept()+fcntl() */ + if ((cfd = accept(fd, (struct sockaddr *)&addr, &laddr)) != -1) + fcntl(cfd, F_SETFL, O_NONBLOCK); + } #else cfd = accept(fd, (struct sockaddr *)&addr, &laddr); #endif