1
0
mirror of https://github.com/php/php-src.git synced 2026-04-24 16:38:25 +02:00

sockets ext for solaris update.

socket filter support, system can support up to 32 filters giving the possibility to retrive the full list.
Closes #8191.
This commit is contained in:
David Carlier
2022-03-11 16:41:33 +00:00
parent baebb730b4
commit 9090e2602e
2 changed files with 51 additions and 0 deletions
+48
View File
@@ -552,6 +552,11 @@ static PHP_MINIT_FUNCTION(sockets)
#ifdef SO_ACCEPTFILTER
REGISTER_LONG_CONSTANT("SO_ACCEPTFILTER", SO_ACCEPTFILTER, CONST_CS | CONST_PERSISTENT);
#endif
#ifdef SOL_FILTER
REGISTER_LONG_CONSTANT("SOL_FILTER", SOL_FILTER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FIL_ATTACH", FIL_ATTACH, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("FIL_DETACH", FIL_DETACH, CONST_CS | CONST_PERSISTENT);
#endif
#ifdef SO_DONTTRUNC
REGISTER_LONG_CONSTANT("SO_DONTTRUNC", SO_DONTTRUNC, CONST_CS | CONST_PERSISTENT);
#endif
@@ -2004,6 +2009,32 @@ PHP_FUNCTION(socket_get_option)
}
}
#ifdef SOL_FILTER
if (level == SOL_FILTER) {
switch (optname) {
case FIL_LIST: {
size_t i;
struct fil_info fi[32] = {{0}};
optlen = sizeof(fi);
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)fi, &optlen) != 0) {
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
RETURN_FALSE;
}
array_init(return_value);
for (i = 0; i < optlen / sizeof(struct fil_info); i++) {
add_index_string(return_value, i, fi[i].fi_name);
}
return;
}
}
}
#endif
optlen = sizeof(other_val);
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) {
@@ -2177,6 +2208,23 @@ PHP_FUNCTION(socket_set_option)
}
#endif
#ifdef FIL_ATTACH
case FIL_ATTACH:
case FIL_DETACH: {
if (level != SOL_FILTER) {
php_error_docref(NULL, E_WARNING, "Invalid level");
RETURN_FALSE;
}
if (Z_TYPE_P(arg4) != IS_STRING) {
php_error_docref(NULL, E_WARNING, "Invalid filter argument type");
RETURN_FALSE;
}
opt_ptr = Z_STRVAL_P(arg4);
optlen = Z_STRLEN_P(arg4);
break;
}
#endif
default:
default_case:
convert_to_long(arg4);