@@ -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 < sizeof (struct fil_info ) / optlen ; 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 :
20082055default_case :
20092056 convert_to_long (arg4 );
0 commit comments