ext/sockets: using accept4 wheneever possible for php_accept_connect helper (#19268)

Haiku now supports it as well now, so we can simplify the workflow a bit for those platforms.
This commit is contained in:
David CARLIER 2025-07-27 20:52:11 +01:00 committed by GitHub
parent 191290e194
commit 068aaed196
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 2 deletions

View file

@ -4,7 +4,7 @@ PHP_ARG_ENABLE([sockets],
[Enable sockets support])]) [Enable sockets support])])
if test "$PHP_SOCKETS" != "no"; then 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_CHECK_HEADERS([sys/sockio.h linux/filter.h linux/if_packet.h linux/if_ether.h linux/udp.h])
AC_DEFINE([HAVE_SOCKETS], [1], AC_DEFINE([HAVE_SOCKETS], [1],
[Define to 1 if the PHP extension 'sockets' is available.]) [Define to 1 if the PHP extension 'sockets' is available.])

View file

@ -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) /* {{{ */ 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); out_sock->bsd_socket = accept(in_sock->bsd_socket, la, la_len);
if (IS_INVALID_SOCKET(out_sock)) { 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) #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. * win32, not having any concept of child process, has no need to address it.
*/ */
int mode; int mode;
@ -310,6 +323,7 @@ static bool php_accept_connect(php_socket *in_sock, php_socket *out_sock, struct
return 0; return 0;
} }
} }
#endif
#endif #endif
out_sock->error = 0; out_sock->error = 0;