dmitry          Tue Dec 19 08:59:27 2006 UTC

  Modified files:              
    /php-src/main/streams       php_stream_transport.h transports.c 
                                xp_socket.c 
    /php-src/ext/standard       basic_functions.c file.c streamsfuncs.c 
                                streamsfuncs.h 
    /php-src/ext/standard/tests/network shutdown.phpt 
  Log:
  Added function stream_socket_shutdown(). It is a wraper for system shutdown() 
function, that shut downs part of a full-duplex connection
  
  
http://cvs.php.net/viewvc.cgi/php-src/main/streams/php_stream_transport.h?r1=1.11&r2=1.12&diff_format=u
Index: php-src/main/streams/php_stream_transport.h
diff -u php-src/main/streams/php_stream_transport.h:1.11 
php-src/main/streams/php_stream_transport.h:1.12
--- php-src/main/streams/php_stream_transport.h:1.11    Sun Jan  1 13:09:57 2006
+++ php-src/main/streams/php_stream_transport.h Tue Dec 19 08:59:26 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_stream_transport.h,v 1.11 2006/01/01 13:09:57 sniper Exp $ */
+/* $Id: php_stream_transport.h,v 1.12 2006/12/19 08:59:26 dmitry Exp $ */
 
 #if HAVE_SYS_SOCKET_H
 # include <sys/socket.h>
@@ -104,8 +104,19 @@
  * sending it as OOB data */
 PHPAPI int php_stream_xport_sendto(php_stream *stream, const char *buf, size_t 
buflen,
                long flags, void *addr, socklen_t addrlen TSRMLS_DC);
+
+typedef enum {
+       STREAM_SHUT_RD,
+       STREAM_SHUT_WR,
+       STREAM_SHUT_RDWR
+} stream_shutdown_t;
+
+/* Similar to shutdown() system call; shut down part of a full-duplex
+ * connection */
+PHPAPI int php_stream_xport_shutdown(php_stream *stream, stream_shutdown_t how 
TSRMLS_DC);
 END_EXTERN_C()
 
+
 /* Structure definition for the set_option interface that the above functions 
wrap */
 
 typedef struct _php_stream_xport_param {
@@ -116,11 +127,13 @@
                STREAM_XPORT_OP_GET_NAME,
                STREAM_XPORT_OP_GET_PEER_NAME,
                STREAM_XPORT_OP_RECV,
-               STREAM_XPORT_OP_SEND
+               STREAM_XPORT_OP_SEND,
+               STREAM_XPORT_OP_SHUTDOWN
        } op;
        unsigned int want_addr:1;
        unsigned int want_textaddr:1;
        unsigned int want_errortext:1;
+       stream_shutdown_t how:3;
 
        struct {
                char *name;
http://cvs.php.net/viewvc.cgi/php-src/main/streams/transports.c?r1=1.17&r2=1.18&diff_format=u
Index: php-src/main/streams/transports.c
diff -u php-src/main/streams/transports.c:1.17 
php-src/main/streams/transports.c:1.18
--- php-src/main/streams/transports.c:1.17      Sun Jan  1 13:09:57 2006
+++ php-src/main/streams/transports.c   Tue Dec 19 08:59:26 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: transports.c,v 1.17 2006/01/01 13:09:57 sniper Exp $ */
+/* $Id: transports.c,v 1.18 2006/12/19 08:59:26 dmitry Exp $ */
 
 #include "php.h"
 #include "php_streams_int.h"
@@ -486,6 +486,25 @@
        return -1;
 }
 
+/* Similar to shutdown() system call; shut down part of a full-duplex
+ * connection */
+PHPAPI int php_stream_xport_shutdown(php_stream *stream, stream_shutdown_t how 
TSRMLS_DC)
+{
+       php_stream_xport_param param;
+       int ret = 0;
+
+       memset(&param, 0, sizeof(param));
+
+       param.op = STREAM_XPORT_OP_SHUTDOWN;
+       param.how = how;
+       
+       ret = php_stream_set_option(stream, PHP_STREAM_OPTION_XPORT_API, 0, 
&param);
+
+       if (ret == PHP_STREAM_OPTION_RETURN_OK) {
+               return param.outputs.returncode;
+       }
+       return -1;
+}
 
 /*
  * Local variables:
http://cvs.php.net/viewvc.cgi/php-src/main/streams/xp_socket.c?r1=1.37&r2=1.38&diff_format=u
Index: php-src/main/streams/xp_socket.c
diff -u php-src/main/streams/xp_socket.c:1.37 
php-src/main/streams/xp_socket.c:1.38
--- php-src/main/streams/xp_socket.c:1.37       Wed Oct 11 12:53:38 2006
+++ php-src/main/streams/xp_socket.c    Tue Dec 19 08:59:26 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: xp_socket.c,v 1.37 2006/10/11 12:53:38 tony2001 Exp $ */
+/* $Id: xp_socket.c,v 1.38 2006/12/19 08:59:26 dmitry Exp $ */
 
 #include "php.h"
 #include "ext/standard/file.h"
@@ -369,6 +369,24 @@
                                        return PHP_STREAM_OPTION_RETURN_OK;
 
 
+#ifdef HAVE_SHUTDOWN
+# ifndef SHUT_RD
+#  define SHUT_RD 0
+# endif
+# ifndef SHUT_WR
+#  define SHUT_WR 1
+# endif
+# ifndef SHUT_RDWR
+#  define SHUT_RDWR 2
+# endif
+                               case STREAM_XPORT_OP_SHUTDOWN: {
+                                       static const int shutdown_how[] = 
{SHUT_RD, SHUT_WR, SHUT_RDWR};
+
+                                       xparam->outputs.returncode = 
shutdown(sock->socket, shutdown_how[xparam->how]);
+                                       return PHP_STREAM_OPTION_RETURN_OK;
+                               }
+#endif
+                               
                                default:
                                        return PHP_STREAM_OPTION_RETURN_NOTIMPL;
                        }
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.838&r2=1.839&diff_format=u
Index: php-src/ext/standard/basic_functions.c
diff -u php-src/ext/standard/basic_functions.c:1.838 
php-src/ext/standard/basic_functions.c:1.839
--- php-src/ext/standard/basic_functions.c:1.838        Mon Dec 18 22:59:36 2006
+++ php-src/ext/standard/basic_functions.c      Tue Dec 19 08:59:26 2006
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: basic_functions.c,v 1.838 2006/12/18 22:59:36 bjori Exp $ */
+/* $Id: basic_functions.c,v 1.839 2006/12/19 08:59:26 dmitry Exp $ */
 
 #include "php.h"
 #include "php_streams.h"
@@ -2449,6 +2449,14 @@
        ZEND_ARG_INFO(0, filename)
        ZEND_ARG_INFO(0, context)
 ZEND_END_ARG_INFO()
+
+#ifdef HAVE_SHUTDOWN
+static
+ZEND_BEGIN_ARG_INFO(arginfo_stream_socket_shutdown, 0)
+       ZEND_ARG_INFO(0, stream)
+       ZEND_ARG_INFO(0, how)
+ZEND_END_ARG_INFO()
+#endif
 /* }}} */
 /* {{{ string.c */
 static
@@ -3563,6 +3571,9 @@
        PHP_FE(stream_socket_recvfrom,                                          
                                        arginfo_stream_socket_recvfrom)
        PHP_FE(stream_socket_sendto,                                            
                                        arginfo_stream_socket_sendto)
        PHP_FE(stream_socket_enable_crypto,                                     
                                        arginfo_stream_socket_enable_crypto)
+#ifdef HAVE_SHUTDOWN
+       PHP_FE(stream_socket_shutdown,                                          
                                        arginfo_stream_socket_shutdown)
+#endif
 #if HAVE_SOCKETPAIR
        PHP_FE(stream_socket_pair,                                              
                                                arginfo_stream_socket_pair)
 #endif
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.476&r2=1.477&diff_format=u
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.476 php-src/ext/standard/file.c:1.477
--- php-src/ext/standard/file.c:1.476   Tue Dec 12 22:38:30 2006
+++ php-src/ext/standard/file.c Tue Dec 19 08:59:26 2006
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.476 2006/12/12 22:38:30 tony2001 Exp $ */
+/* $Id: file.c,v 1.477 2006/12/19 08:59:26 dmitry Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -227,6 +227,10 @@
        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER",    
STREAM_CRYPTO_METHOD_SSLv23_SERVER,     CONST_CS|CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER",               
STREAM_CRYPTO_METHOD_TLS_SERVER,        CONST_CS|CONST_PERSISTENT);
        
+       REGISTER_LONG_CONSTANT("STREAM_SHUT_RD",        STREAM_SHUT_RD,         
CONST_CS|CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_SHUT_WR",        STREAM_SHUT_WR,         
CONST_CS|CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_SHUT_RDWR",      STREAM_SHUT_RDWR,       
CONST_CS|CONST_PERSISTENT);
+
 #ifdef PF_INET
        REGISTER_LONG_CONSTANT("STREAM_PF_INET", PF_INET, 
CONST_CS|CONST_PERSISTENT);
 #elif defined(AF_INET)
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/streamsfuncs.c?r1=1.96&r2=1.97&diff_format=u
Index: php-src/ext/standard/streamsfuncs.c
diff -u php-src/ext/standard/streamsfuncs.c:1.96 
php-src/ext/standard/streamsfuncs.c:1.97
--- php-src/ext/standard/streamsfuncs.c:1.96    Wed Oct 11 23:20:54 2006
+++ php-src/ext/standard/streamsfuncs.c Tue Dec 19 08:59:26 2006
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: streamsfuncs.c,v 1.96 2006/10/11 23:20:54 pollita Exp $ */
+/* $Id: streamsfuncs.c,v 1.97 2006/12/19 08:59:26 dmitry Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -1645,6 +1645,36 @@
 }
 /* }}} */
 
+#ifdef HAVE_SHUTDOWN
+/* {{{ proto int stream_socket_shutdown(resource stream, int how)
+       causes all or part of a full-duplex connection on the socket associated
+       with stream to be shut down.  If how is SHUT_RD,  further receptions 
will
+       be disallowed. If how is SHUT_WR, further transmissions will be 
disallowed.
+       If how is SHUT_RDWR,  further  receptions and transmissions will be
+       disallowed. */
+PHP_FUNCTION(stream_socket_shutdown)
+{
+       long how;
+       zval *zstream;
+       php_stream *stream;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zstream, 
&how) == FAILURE) {
+               RETURN_FALSE;
+       }
+       
+       if (how != STREAM_SHUT_RD &&
+           how != STREAM_SHUT_WR &&
+           how != STREAM_SHUT_RDWR) {
+               RETURN_FALSE;
+       }
+
+       php_stream_from_zval(stream, &zstream);
+
+       RETURN_BOOL(php_stream_xport_shutdown(stream, (stream_shutdown_t)how 
TSRMLS_CC) == 0);
+}
+#endif
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 4
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/streamsfuncs.h?r1=1.17&r2=1.18&diff_format=u
Index: php-src/ext/standard/streamsfuncs.h
diff -u php-src/ext/standard/streamsfuncs.h:1.17 
php-src/ext/standard/streamsfuncs.h:1.18
--- php-src/ext/standard/streamsfuncs.h:1.17    Mon Oct  9 02:48:06 2006
+++ php-src/ext/standard/streamsfuncs.h Tue Dec 19 08:59:26 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: streamsfuncs.h,v 1.17 2006/10/09 02:48:06 pollita Exp $ */
+/* $Id: streamsfuncs.h,v 1.18 2006/12/19 08:59:26 dmitry Exp $ */
 
 /* Flags for stream_socket_client */
 #define PHP_STREAM_CLIENT_PERSISTENT   1
@@ -54,6 +54,7 @@
 PHP_FUNCTION(stream_filter_remove);
 PHP_FUNCTION(stream_encoding);
 PHP_FUNCTION(stream_socket_enable_crypto);
+PHP_FUNCTION(stream_socket_shutdown);
 PHP_FUNCTION(stream_socket_pair);
 PHP_FUNCTION(stream_resolve_include_path);
 
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/network/shutdown.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/standard/tests/network/shutdown.phpt
diff -u /dev/null php-src/ext/standard/tests/network/shutdown.phpt:1.2
--- /dev/null   Tue Dec 19 08:59:27 2006
+++ php-src/ext/standard/tests/network/shutdown.phpt    Tue Dec 19 08:59:26 2006
@@ -0,0 +1,65 @@
+--TEST--
+stream_socket_shutdown() test on IPv4 TCP Loopback
+--SKIPIF--
+<?php
+       function_exists('stream_socket_shutdown') or die('skip 
stream_socket_shutdown() is not supported.');
+?>
+--FILE--
+<?php
+       /* Setup socket server */
+       $server = stream_socket_server('tcp://127.0.0.1:31337');
+       if (!$server) {
+               die('Unable to create AF_INET socket [server]');
+       }
+
+       /* Connect and send request 1 */
+       $client1 = stream_socket_client('tcp://127.0.0.1:31337');
+       if (!$client1) {
+               die('Unable to create AF_INET socket [client]');
+       }
+       @fwrite($client1, "Client 1\n");
+       stream_socket_shutdown($client1, STREAM_SHUT_WR);
+       @fwrite($client1, "Error 1\n");
+
+       /* Connect and send request 2 */
+       $client2 = stream_socket_client('tcp://127.0.0.1:31337');
+       if (!$client2) {
+               die('Unable to create AF_INET socket [client]');
+       }
+       @fwrite($client2, "Client 2\n");
+       stream_socket_shutdown($client2, STREAM_SHUT_WR);
+       @fwrite($client2, "Error 2\n");
+
+       /* Accept connection 1 */
+       $socket = stream_socket_accept($server);
+       if (!$socket) {
+               die('Unable to accept connection');
+       }
+       @fwrite($socket, fgets($socket));
+       @fwrite($socket, fgets($socket));
+       fclose($socket);
+
+       /* Read Response 1 */
+       echo fgets($client1);
+       echo fgets($client1);
+
+       /* Accept connection 2 */
+       $socket = stream_socket_accept($server);
+       if (!$socket) {
+               die('Unable to accept connection');
+       }
+       @fwrite($socket, fgets($socket));
+       @fwrite($socket, fgets($socket));
+       fclose($socket);
+
+       /* Read Response 2 */
+       echo fgets($client2);
+       echo fgets($client2);
+
+       fclose($client1);
+       fclose($client2);
+       fclose($server);
+?>
+--EXPECT--
+Client 1
+Client 2

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to