@@ -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 :
20082056default_case :
20092057 convert_to_long (arg4 );
0 commit comments