Skip to content

Commit cfc35c3

Browse files
committed
sockets ext for solaris update.
socket filter support, system can support up to 32 filters giving the possibility to retrive the full list.
1 parent 0db03c4 commit cfc35c3

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

ext/sockets/sockets.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,11 @@ static PHP_MINIT_FUNCTION(sockets)
536536
#ifdef SO_ACCEPTFILTER
537537
REGISTER_LONG_CONSTANT("SO_ACCEPTFILTER", SO_ACCEPTFILTER, CONST_CS | CONST_PERSISTENT);
538538
#endif
539+
#ifdef SOL_FILTER
540+
REGISTER_LONG_CONSTANT("SOL_FILTER", SOL_FILTER, CONST_CS | CONST_PERSISTENT);
541+
REGISTER_LONG_CONSTANT("FIL_ATTACH", FIL_ATTACH, CONST_CS | CONST_PERSISTENT);
542+
REGISTER_LONG_CONSTANT("FIL_DETACH", FIL_DETACH, CONST_CS | CONST_PERSISTENT);
543+
#endif
539544
#ifdef SO_DONTTRUNC
540545
REGISTER_LONG_CONSTANT("SO_DONTTRUNC", SO_DONTTRUNC, CONST_CS | CONST_PERSISTENT);
541546
#endif
@@ -1853,6 +1858,32 @@ PHP_FUNCTION(socket_get_option)
18531858
}
18541859
}
18551860

1861+
#ifdef SOL_FILTER
1862+
if (level == SOL_FILTER) {
1863+
switch (optname) {
1864+
1865+
case FIL_LIST: {
1866+
size_t i;
1867+
struct fil_info fi[32] = {{0}};
1868+
optlen = sizeof(fi);
1869+
1870+
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)fi, &optlen) != 0) {
1871+
PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno);
1872+
RETURN_FALSE;
1873+
}
1874+
1875+
array_init(return_value);
1876+
1877+
for (i = 0; i < optlen / sizeof(struct fil_info); i++) {
1878+
add_index_string(return_value, i, fi[i].fi_name);
1879+
}
1880+
1881+
return;
1882+
}
1883+
}
1884+
}
1885+
#endif
1886+
18561887
optlen = sizeof(other_val);
18571888

18581889
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) {
@@ -2004,6 +2035,23 @@ PHP_FUNCTION(socket_set_option)
20042035
}
20052036
#endif
20062037

2038+
#ifdef FIL_ATTACH
2039+
case FIL_ATTACH:
2040+
case FIL_DETACH: {
2041+
if (level != SOL_FILTER) {
2042+
php_error_docref(NULL, E_WARNING, "Invalid level");
2043+
RETURN_FALSE;
2044+
}
2045+
if (Z_TYPE_P(arg4) != IS_STRING) {
2046+
php_error_docref(NULL, E_WARNING, "Invalid filter argument type");
2047+
RETURN_FALSE;
2048+
}
2049+
opt_ptr = Z_STRVAL_P(arg4);
2050+
optlen = Z_STRLEN_P(arg4);
2051+
break;
2052+
}
2053+
#endif
2054+
20072055
default:
20082056
default_case:
20092057
convert_to_long(arg4);

0 commit comments

Comments
 (0)