@@ -536,6 +536,11 @@ static PHP_MINIT_FUNCTION(sockets)
536
536
#ifdef SO_ACCEPTFILTER
537
537
REGISTER_LONG_CONSTANT ("SO_ACCEPTFILTER" , SO_ACCEPTFILTER , CONST_CS | CONST_PERSISTENT );
538
538
#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
539
544
#ifdef SO_DONTTRUNC
540
545
REGISTER_LONG_CONSTANT ("SO_DONTTRUNC" , SO_DONTTRUNC , CONST_CS | CONST_PERSISTENT );
541
546
#endif
@@ -1853,6 +1858,31 @@ PHP_FUNCTION(socket_get_option)
1853
1858
}
1854
1859
}
1855
1860
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
+
1856
1886
optlen = sizeof (other_val );
1857
1887
1858
1888
if (getsockopt (php_sock -> bsd_socket , level , optname , (char * )& other_val , & optlen ) != 0 ) {
@@ -2004,6 +2034,23 @@ PHP_FUNCTION(socket_set_option)
2004
2034
}
2005
2035
#endif
2006
2036
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
+
2007
2054
default :
2008
2055
default_case :
2009
2056
convert_to_long (arg4 );
0 commit comments