@@ -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,32 @@ 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
+
1881
+ return ;
1882
+ }
1883
+ }
1884
+ }
1885
+ #endif
1886
+
1856
1887
optlen = sizeof (other_val );
1857
1888
1858
1889
if (getsockopt (php_sock -> bsd_socket , level , optname , (char * )& other_val , & optlen ) != 0 ) {
@@ -2004,6 +2035,23 @@ PHP_FUNCTION(socket_set_option)
2004
2035
}
2005
2036
#endif
2006
2037
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
+
2007
2055
default :
2008
2056
default_case :
2009
2057
convert_to_long (arg4 );
0 commit comments