Skip to content

Commit 95a9e55

Browse files
devnexenkrakjoe
authored andcommitted
Pull #6989 FreeBSD defines SO_ACCEPTFILTER
1 parent 13d396b commit 95a9e55

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed

.cirrus.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ task:
1010
install_script:
1111
#- sed -i -e 's/quarterly/latest/g' /etc/pkg/FreeBSD.conf
1212
#- pkg upgrade -y
13+
- kldload accf_http
1314
- pkg install -y autoconf bison gmake re2c icu libiconv png freetype2 enchant2 bzip2 krb5 t1lib gmp tidyp libsodium libzip libxml2 libxslt openssl oniguruma pkgconf webp
1415
script:
1516
- ./buildconf -f

UPGRADING

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,9 @@ PHP 8.1 UPGRADE NOTES
404404
- OpenSSL:
405405
. The OpenSSL extension now requires at least OpenSSL version 1.0.2.
406406

407+
- Sockets:
408+
. FreeBSD defines SO_ACCEPTFILTER
409+
407410
- Standard:
408411
. --with-password-argon2 now uses pkg-config to detect libargon2. As such,
409412
an alternative libargon2 location should now be specified using

ext/sockets/sockets.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ static PHP_MINIT_FUNCTION(sockets)
535535
REGISTER_LONG_CONSTANT("SO_LISTENQLIMIT", SO_LISTENQLIMIT, CONST_CS | CONST_PERSISTENT);
536536
REGISTER_LONG_CONSTANT("SO_LISTENQLEN", SO_LISTENQLEN, CONST_CS | CONST_PERSISTENT);
537537
REGISTER_LONG_CONSTANT("SO_USER_COOKIE", SO_USER_COOKIE, CONST_CS | CONST_PERSISTENT);
538+
REGISTER_LONG_CONSTANT("SO_ACCEPTFILTER", SO_ACCEPTFILTER, CONST_CS | CONST_PERSISTENT);
538539
#endif
539540
REGISTER_LONG_CONSTANT("SOL_SOCKET", SOL_SOCKET, CONST_CS | CONST_PERSISTENT);
540541
REGISTER_LONG_CONSTANT("SOMAXCONN", SOMAXCONN, CONST_CS | CONST_PERSISTENT);
@@ -1818,6 +1819,23 @@ PHP_FUNCTION(socket_get_option)
18181819
add_assoc_long(return_value, "sec", tv.tv_sec);
18191820
add_assoc_long(return_value, "usec", tv.tv_usec);
18201821
return;
1822+
#ifdef SO_ACCEPTFILTER
1823+
case SO_ACCEPTFILTER: {
1824+
1825+
struct accept_filter_arg af = {0};
1826+
optlen = sizeof(af);
1827+
1828+
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&af, &optlen) != 0) {
1829+
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1830+
RETURN_FALSE;
1831+
}
1832+
1833+
array_init(return_value);
1834+
1835+
add_assoc_string(return_value, "af_name", af.af_name);
1836+
return;
1837+
}
1838+
#endif
18211839
}
18221840
}
18231841

@@ -1958,6 +1976,20 @@ PHP_FUNCTION(socket_set_option)
19581976
}
19591977
#endif
19601978

1979+
#ifdef SO_ACCEPTFILTER
1980+
case SO_ACCEPTFILTER: {
1981+
if (Z_TYPE_P(arg4) != IS_STRING) {
1982+
php_error_docref(NULL, E_WARNING, "Invalid filter argument type");
1983+
RETURN_FALSE;
1984+
}
1985+
struct accept_filter_arg af = {0};
1986+
strlcpy(af.af_name, Z_STRVAL_P(arg4), sizeof(af.af_name));
1987+
opt_ptr = ⁡
1988+
optlen = sizeof(af);
1989+
break;
1990+
}
1991+
#endif
1992+
19611993
default:
19621994
default_case:
19631995
convert_to_long(arg4);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--TEST--
2+
Test if socket_set_option() works, option:SO_ACCEPTFILTER
3+
--DESCRIPTION--
4+
-wrong params
5+
-set/get params comparison
6+
-l_linger not given
7+
--SKIPIF--
8+
<?php
9+
if (!extension_loaded('sockets')) {
10+
die('SKIP sockets extension not available.');
11+
}
12+
if (strpos(PHP_OS, 'FreeBSD') === false) {
13+
die('SKIP on non FreeBSD platforms');
14+
}
15+
?>
16+
--FILE--
17+
<?php
18+
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
19+
20+
if (!$socket) {
21+
die('Unable to create AF_INET socket [socket]');
22+
}
23+
try {
24+
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ACCEPTFILTER, 1));
25+
} catch (\ValueError $e) {
26+
echo $e->getMessage() . \PHP_EOL;
27+
}
28+
socket_listen($socket);
29+
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ACCEPTFILTER, "httpready"));
30+
var_dump(socket_get_option( $socket, SOL_SOCKET, SO_ACCEPTFILTER));
31+
socket_close($socket);
32+
?>
33+
--EXPECTF--
34+
Warning: socket_set_option(): Invalid filter argument type in %s on line %d
35+
bool(false)
36+
bool(true)
37+
array(1) {
38+
["af_name"]=>
39+
string(9) "httpready"
40+
}

0 commit comments

Comments
 (0)