From 6b3b0d4736f2e27cbbcd2f8f94edad3a1fb1c574 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 22 Oct 2012 19:32:55 +0200 Subject: [PATCH] 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. --- src/listener.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/listener.c b/src/listener.c index c4259bcd5..6781e587c 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