Skip to content

Commit 8dd8262

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 8dd8262

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

ext/sockets/sockets.c

Lines changed: 47 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,31 @@ 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+
return;
1881+
}
1882+
}
1883+
}
1884+
#endif
1885+
18561886
optlen = sizeof(other_val);
18571887

18581888
if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&other_val, &optlen) != 0) {
@@ -2004,6 +2034,23 @@ PHP_FUNCTION(socket_set_option)
20042034
}
20052035
#endif
20062036

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

0 commit comments

Comments
 (0)