@@ -402,7 +402,7 @@ static inline void sub_times(struct timeval a, struct timeval b, struct timeval
402402 * */
403403/* {{{ php_network_bind_socket_to_local_addr */
404404php_socket_t php_network_bind_socket_to_local_addr (const char * host , unsigned port ,
405- int socktype , long sockopts , zend_string * * error_string , int * error_code
405+ int socktype , long sockopts , long linger , zend_string * * error_string , int * error_code
406406 )
407407{
408408 int num_addrs , n , err = 0 ;
@@ -470,6 +470,15 @@ php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned po
470470 setsockopt (sock , IPPROTO_TCP , TCP_NODELAY , (char * )& sockoptval , sizeof (sockoptval ));
471471 }
472472#endif
473+ #ifdef SO_LINGER
474+ if (sockopts & STREAM_SOCKOP_SO_LINGER ) {
475+ struct linger val = {
476+ .l_onoff = (linger > 0 ),
477+ .l_linger = (int )linger
478+ };
479+ setsockopt (sock , IPPROTO_TCP , SO_LINGER , (char * )& val , sizeof (val ));
480+ }
481+ #endif
473482
474483 n = bind (sock , sa , socklen );
475484
@@ -766,7 +775,8 @@ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock,
766775/* {{{ php_network_connect_socket_to_host */
767776php_socket_t php_network_connect_socket_to_host (const char * host , unsigned short port ,
768777 int socktype , int asynchronous , struct timeval * timeout , zend_string * * error_string ,
769- int * error_code , const char * bindto , unsigned short bindport , long sockopts
778+ int * error_code , const char * bindto , unsigned short bindport , long sockopts ,
779+ long linger
770780 )
771781{
772782 int num_addrs , n , fatal = 0 ;
@@ -896,6 +906,17 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short
896906 setsockopt (sock , IPPROTO_TCP , TCP_NODELAY , (char * )& val , sizeof (val ));
897907 }
898908 }
909+ #endif
910+ #ifdef SO_LINGER
911+ {
912+ if (sockopts & STREAM_SOCKOP_SO_LINGER ) {
913+ struct linger val = {
914+ .l_onoff = linger > 0 ,
915+ .l_linger = (int )linger
916+ };
917+ setsockopt (sock , IPPROTO_TCP , SO_LINGER , (char * )& val , sizeof (val ));
918+ }
919+ }
899920#endif
900921 n = php_network_connect_socket (sock , sa , socklen , asynchronous ,
901922 timeout ? & working_timeout : NULL ,
0 commit comments