wez Thu Nov 27 12:39:02 2003 EDT Modified files: /php-src/main php_streams.h /php-src/main/streams transports.c xp_socket.c Log: port "liveness" checks and a couple of other things from the 4.3 branch. Liveness checks are used to validate persistent socket connects when they are re-used. Index: php-src/main/php_streams.h diff -u php-src/main/php_streams.h:1.84 php-src/main/php_streams.h:1.85 --- php-src/main/php_streams.h:1.84 Mon Nov 3 09:12:45 2003 +++ php-src/main/php_streams.h Thu Nov 27 12:39:01 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams.h,v 1.84 2003/11/03 14:12:45 derick Exp $ */ +/* $Id: php_streams.h,v 1.85 2003/11/27 17:39:01 wez Exp $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H @@ -358,6 +358,10 @@ #define PHP_STREAM_OPTION_META_DATA_API 11 /* ptrparam is a zval* to which to add meta data information */ #define php_stream_populate_meta_data(stream, zv) (_php_stream_set_option((stream), PHP_STREAM_OPTION_META_DATA_API, 0, zv TSRMLS_CC) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0) +/* Check if the stream is still "live"; for sockets/pipes this means the socket + * is still connected; for files, this does not really have meaning */ +#define PHP_STREAM_OPTION_CHECK_LIVENESS 12 /* no parameters */ + #define PHP_STREAM_OPTION_RETURN_OK 0 /* option set OK */ #define PHP_STREAM_OPTION_RETURN_ERR -1 /* problem setting option */ #define PHP_STREAM_OPTION_RETURN_NOTIMPL -2 /* underlying stream does not implement; streams can handle it instead */ Index: php-src/main/streams/transports.c diff -u php-src/main/streams/transports.c:1.6 php-src/main/streams/transports.c:1.7 --- php-src/main/streams/transports.c:1.6 Wed Jul 2 17:11:35 2003 +++ php-src/main/streams/transports.c Thu Nov 27 12:39:01 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: transports.c,v 1.6 2003/07/02 21:11:35 wez Exp $ */ +/* $Id: transports.c,v 1.7 2003/11/27 17:39:01 wez Exp $ */ #include "php.h" #include "php_streams_int.h" @@ -74,8 +74,10 @@ if (persistent_id) { switch(php_stream_from_persistent_id(persistent_id, &stream TSRMLS_CC)) { case PHP_STREAM_PERSISTENT_SUCCESS: - /* TODO: check if the socket is still live */ - return stream; + if (PHP_STREAM_OPTION_RETURN_OK == php_stream_set_option(stream, PHP_STREAM_OPTION_CHECK_LIVENESS, 0, NULL)) { + return stream; + } + /* fall through */ case PHP_STREAM_PERSISTENT_FAILURE: default: Index: php-src/main/streams/xp_socket.c diff -u php-src/main/streams/xp_socket.c:1.15 php-src/main/streams/xp_socket.c:1.16 --- php-src/main/streams/xp_socket.c:1.15 Wed Oct 8 06:55:51 2003 +++ php-src/main/streams/xp_socket.c Thu Nov 27 12:39:01 2003 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: xp_socket.c,v 1.15 2003/10/08 10:55:51 wez Exp $ */ +/* $Id: xp_socket.c,v 1.16 2003/11/27 17:39:01 wez Exp $ */ #include "php.h" #include "ext/standard/file.h" @@ -148,15 +148,9 @@ if (close_handle) { if (sock->socket != -1) { +#ifdef PHP_WIN32 /* prevent more data from coming in */ - -#ifdef AF_UNIX - if (stream->ops != &php_stream_unix_socket_ops && stream->ops != &php_stream_unixdg_socket_ops) { -#endif - shutdown(sock->socket, SHUT_RD); -#ifdef AF_UNIX - } -#endif + shutdown(sock->socket, SHUT_RD); /* 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 @@ -174,6 +168,7 @@ n = select(sock->socket + 1, NULL, &wrfds, &efds, &timeout); } while (n == -1 && php_socket_errno() == EINTR); +#endif closesocket(sock->socket); sock->socket = -1; @@ -205,6 +200,28 @@ php_stream_xport_param *xparam; switch(option) { + case PHP_STREAM_OPTION_CHECK_LIVENESS: + { + fd_set rfds; + struct timeval tv = {0,0}; + char buf; + int alive = 1; + + if (sock->socket == -1) { + alive = 0; + } else { + FD_ZERO(&rfds); + FD_SET(sock->socket, &rfds); + + if (select(sock->socket + 1, &rfds, NULL, NULL, &tv) > 0 && FD_ISSET(sock->socket, &rfds)) { + if (0 == recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) && php_socket_errno() != EAGAIN) { + alive = 0; + } + } + } + return alive ? PHP_STREAM_OPTION_RETURN_OK : PHP_STREAM_OPTION_RETURN_ERR; + } + case PHP_STREAM_OPTION_BLOCKING: oldmode = sock->is_blocked;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php