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