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.
#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