diff --git a/ext/sockets/config.m4 b/ext/sockets/config.m4 index f637c32b3b6..bf183f5e6e7 100644 --- a/ext/sockets/config.m4 +++ b/ext/sockets/config.m4 @@ -4,7 +4,7 @@ PHP_ARG_ENABLE([sockets], [Enable sockets support])]) if test "$PHP_SOCKETS" != "no"; then - AC_CHECK_FUNCS([hstrerror if_nametoindex if_indextoname sockatmark]) + AC_CHECK_FUNCS([hstrerror if_nametoindex if_indextoname sockatmark accept4]) AC_CHECK_HEADERS([sys/sockio.h linux/filter.h linux/if_packet.h linux/if_ether.h linux/udp.h]) AC_DEFINE([HAVE_SOCKETS], [1], [Define to 1 if the PHP extension 'sockets' is available.]) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 2f2eb3465fd..3ed7d17bba2 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -283,6 +283,19 @@ static bool php_open_listen_sock(php_socket *sock, unsigned short port, int back static bool php_accept_connect(php_socket *in_sock, php_socket *out_sock, struct sockaddr *la, socklen_t *la_len) /* {{{ */ { +#if defined(HAVE_ACCEPT4) + int flags = SOCK_CLOEXEC; + if (!in_sock->blocking) { + flags |= SOCK_NONBLOCK; + } + + out_sock->bsd_socket = accept4(in_sock->bsd_socket, la, la_len, flags); + + if (IS_INVALID_SOCKET(out_sock)) { + PHP_SOCKET_ERROR(out_sock, "unable to accept incoming connection", errno); + return 0; + } +#else out_sock->bsd_socket = accept(in_sock->bsd_socket, la, la_len); if (IS_INVALID_SOCKET(out_sock)) { @@ -292,7 +305,7 @@ static bool php_accept_connect(php_socket *in_sock, php_socket *out_sock, struct #if !defined(PHP_WIN32) /** - * accept4 could had been used but not all platforms support it (e.g. Haiku, solaris < 11.4, ...) + * for fewer and fewer platforms not supporting accept4 syscall we use fcntl instead, * win32, not having any concept of child process, has no need to address it. */ int mode; @@ -310,6 +323,7 @@ static bool php_accept_connect(php_socket *in_sock, php_socket *out_sock, struct return 0; } } +#endif #endif out_sock->error = 0;