wez Thu Feb 13 09:35:48 2003 EDT Modified files: /php4/main network.c Log: Potential fixes for #21809 and #22099. Index: php4/main/network.c diff -u php4/main/network.c:1.85 php4/main/network.c:1.86 --- php4/main/network.c:1.85 Tue Dec 31 10:58:52 2002 +++ php4/main/network.c Thu Feb 13 09:35:47 2003 @@ -16,7 +16,7 @@ | Streams work by Wez Furlong <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: network.c,v 1.85 2002/12/31 15:58:52 sebastian Exp $ */ +/* $Id: network.c,v 1.86 2003/02/13 14:35:47 wez Exp $ */ /*#define DEBUG_MAIN_NETWORK 1*/ @@ -599,6 +599,7 @@ sock->is_blocked = 1; sock->timeout.tv_sec = FG(default_socket_timeout); + sock->timeout.tv_usec = 0; sock->socket = socket; stream = php_stream_alloc_rel(&php_stream_socket_ops, sock, persistent_id, "r+"); @@ -974,6 +975,7 @@ php_netstream_data_t *sock = (php_netstream_data_t*)stream->abstract; fd_set wrfds, efds; int n; + struct timeval timeout; if (close_handle) { #if HAVE_OPENSSL_EXT @@ -990,13 +992,21 @@ /* prevent more data from coming in */ shutdown(sock->socket, SHUT_RD); - /* make sure that the OS sends all data before we close the connection */ + /* try to make sure that the OS sends all data before we close the +connection. + * Essentially, we are waiting for the socket to become writeable, +which means + * that all pending data has been sent. + * We use a small timeout which should encourage the OS to send the +data, + * but at the same time avoid hanging indefintely. + * */ do { FD_ZERO(&wrfds); FD_SET(sock->socket, &wrfds); efds = wrfds; + + timeout.tv_sec = 0; + timeout.tv_usec = 5000; /* arbitrary */ - n = select(sock->socket + 1, NULL, &wrfds, &efds, NULL); + n = select(sock->socket + 1, NULL, &wrfds, &efds, &timeout); } while (n == -1 && php_socket_errno() == EINTR); closesocket(sock->socket);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php