pollita         Fri Sep 10 16:45:36 2004 EDT

  Modified files:              
    /php-src    NEWS 
    /php-src/ext/standard       basic_functions.c streamsfuncs.h 
    /php-src/main       php_streams.h 
    /php-src/main/streams       streams.c userspace.c 
  Log:
  Add stream_wrapper_unregister()
  Disables a wrapper (user-defined or built-in) for the life of the request.
  
  Add stream_wrapper_restore()
  Restores the wrapper originally defined at the time the request started
  to the protocol name mentioned.
  
  
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1807&r2=1.1808&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1807 php-src/NEWS:1.1808
--- php-src/NEWS:1.1807 Tue Sep  7 15:27:11 2004
+++ php-src/NEWS        Fri Sep 10 16:45:26 2004
@@ -14,6 +14,8 @@
   . array_intersect_ukey() (Christiano Duarte)
   . stream_context_get_default() (Wez)
   . stream_socket_enable_crypto() (Wez)
+  . stream_wrapper_unregister() (Sara)
+  . stream_wrapper_restore() (Sara)
   . DomDocumentFragment->appendXML() (Christian)
   . SimpleXMLElement->registerXPathNamespace() (Christian)
   . mysqli->client_info property (Georg)
http://cvs.php.net/diff.php/php-src/ext/standard/basic_functions.c?r1=1.685&r2=1.686&ty=u
Index: php-src/ext/standard/basic_functions.c
diff -u php-src/ext/standard/basic_functions.c:1.685 
php-src/ext/standard/basic_functions.c:1.686
--- php-src/ext/standard/basic_functions.c:1.685        Thu Aug 19 11:14:04 2004
+++ php-src/ext/standard/basic_functions.c      Fri Sep 10 16:45:33 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: basic_functions.c,v 1.685 2004/08/19 15:14:04 tony2001 Exp $ */
+/* $Id: basic_functions.c,v 1.686 2004/09/10 20:45:33 pollita Exp $ */
 
 #include "php.h"
 #include "php_streams.h"
@@ -623,6 +623,8 @@
        PHP_FE(stream_get_line,                                                        
                                 NULL)
        PHP_FE(stream_wrapper_register,                                                
                                 NULL)
        PHP_FALIAS(stream_register_wrapper, stream_wrapper_register,                   
 NULL)
+       PHP_FE(stream_wrapper_unregister,                                              
                                 NULL)
+       PHP_FE(stream_wrapper_restore,                                                 
                                 NULL)
        PHP_FE(stream_get_wrappers,                                                    
                                         NULL)
        PHP_FE(stream_get_transports,                                                  
                                 NULL)
        PHP_FE(get_headers,                                                            
                                         NULL)
http://cvs.php.net/diff.php/php-src/ext/standard/streamsfuncs.h?r1=1.9&r2=1.10&ty=u
Index: php-src/ext/standard/streamsfuncs.h
diff -u php-src/ext/standard/streamsfuncs.h:1.9 
php-src/ext/standard/streamsfuncs.h:1.10
--- php-src/ext/standard/streamsfuncs.h:1.9     Thu Jul 22 08:12:28 2004
+++ php-src/ext/standard/streamsfuncs.h Fri Sep 10 16:45:35 2004
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: streamsfuncs.h,v 1.9 2004/07/22 12:12:28 wez Exp $ */
+/* $Id: streamsfuncs.h,v 1.10 2004/09/10 20:45:35 pollita Exp $ */
 
 /* Flags for stream_socket_client */
 #define PHP_STREAM_CLIENT_PERSISTENT   1
@@ -43,6 +43,8 @@
 PHP_FUNCTION(stream_get_line);
 PHP_FUNCTION(stream_get_meta_data);
 PHP_FUNCTION(stream_wrapper_register);
+PHP_FUNCTION(stream_wrapper_unregister);
+PHP_FUNCTION(stream_wrapper_restore);
 PHP_FUNCTION(stream_context_create);
 PHP_FUNCTION(stream_context_set_params);
 PHP_FUNCTION(stream_context_set_option);
http://cvs.php.net/diff.php/php-src/main/php_streams.h?r1=1.95&r2=1.96&ty=u
Index: php-src/main/php_streams.h
diff -u php-src/main/php_streams.h:1.95 php-src/main/php_streams.h:1.96
--- php-src/main/php_streams.h:1.95     Mon Jun 21 17:08:05 2004
+++ php-src/main/php_streams.h  Fri Sep 10 16:45:35 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.95 2004/06/21 21:08:05 pollita Exp $ */
+/* $Id: php_streams.h,v 1.96 2004/09/10 20:45:35 pollita Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -510,6 +510,7 @@
 PHPAPI int php_register_url_stream_wrapper(char *protocol, php_stream_wrapper 
*wrapper TSRMLS_DC);
 PHPAPI int php_unregister_url_stream_wrapper(char *protocol TSRMLS_DC);
 PHPAPI int php_register_url_stream_wrapper_volatile(char *protocol, 
php_stream_wrapper *wrapper TSRMLS_DC);
+PHPAPI int php_unregister_url_stream_wrapper_volatile(char *protocol TSRMLS_DC);
 PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int options, 
char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC);
 PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char 
**path_for_open, int options TSRMLS_DC);
 PHPAPI char *php_stream_locate_eol(php_stream *stream, char *buf, size_t buf_len 
TSRMLS_DC);
@@ -541,6 +542,7 @@
 /* Give other modules access to the url_stream_wrappers_hash and stream_filters_hash 
*/
 PHPAPI HashTable *_php_stream_get_url_stream_wrappers_hash(TSRMLS_D);
 #define php_stream_get_url_stream_wrappers_hash()      
_php_stream_get_url_stream_wrappers_hash(TSRMLS_C)
+PHPAPI HashTable *php_stream_get_url_stream_wrappers_hash_global(void);
 PHPAPI HashTable *_php_get_stream_filters_hash(TSRMLS_D);
 #define php_get_stream_filters_hash()  _php_get_stream_filters_hash(TSRMLS_C)
 PHPAPI HashTable *php_get_stream_filters_hash_global();
http://cvs.php.net/diff.php/php-src/main/streams/streams.c?r1=1.63&r2=1.64&ty=u
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.63 php-src/main/streams/streams.c:1.64
--- php-src/main/streams/streams.c:1.63 Wed Sep  8 14:42:15 2004
+++ php-src/main/streams/streams.c      Fri Sep 10 16:45:35 2004
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.63 2004/09/08 18:42:15 pollita Exp $ */
+/* $Id: streams.c,v 1.64 2004/09/10 20:45:35 pollita Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -54,6 +54,11 @@
        return (FG(stream_wrappers) ? FG(stream_wrappers) : &url_stream_wrappers_hash);
 }
 
+PHPAPI HashTable *php_stream_get_url_stream_wrappers_hash_global(void)
+{
+       return &url_stream_wrappers_hash;
+}
+
 static int _php_stream_release_context(list_entry *le, void *pContext TSRMLS_DC)
 {
        if (le->ptr == pContext) {
@@ -1417,6 +1422,18 @@
        return zend_hash_add(FG(stream_wrappers), protocol, strlen(protocol), wrapper, 
sizeof(*wrapper), NULL);
 }
 
+PHPAPI int php_unregister_url_stream_wrapper_volatile(char *protocol TSRMLS_DC)
+{
+       if (!FG(stream_wrappers)) {
+               php_stream_wrapper tmpwrapper;
+
+               FG(stream_wrappers) = emalloc(sizeof(HashTable));
+               zend_hash_init(FG(stream_wrappers), 0, NULL, NULL, 1);
+               zend_hash_copy(FG(stream_wrappers), &url_stream_wrappers_hash, NULL, 
&tmpwrapper, sizeof(php_stream_wrapper));
+       }
+
+       return zend_hash_del(FG(stream_wrappers), protocol, strlen(protocol));
+}
 /* }}} */
 
 /* {{{ php_stream_locate_url_wrapper */
http://cvs.php.net/diff.php/php-src/main/streams/userspace.c?r1=1.26&r2=1.27&ty=u
Index: php-src/main/streams/userspace.c
diff -u php-src/main/streams/userspace.c:1.26 php-src/main/streams/userspace.c:1.27
--- php-src/main/streams/userspace.c:1.26       Mon Jun 21 14:58:55 2004
+++ php-src/main/streams/userspace.c    Fri Sep 10 16:45:35 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: userspace.c,v 1.26 2004/06/21 18:58:55 pollita Exp $ */
+/* $Id: userspace.c,v 1.27 2004/09/10 20:45:35 pollita Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -437,6 +437,62 @@
 }
 /* }}} */
 
+/* {{{ bool stream_wrapper_unregister(string protocol)
+       Unregister a wrapper for the life of the current request. */
+PHP_FUNCTION(stream_wrapper_unregister)
+{
+       char *protocol;
+       int protocol_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &protocol, 
&protocol_len) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       if (php_unregister_url_stream_wrapper_volatile(protocol TSRMLS_CC) == FAILURE) 
{
+               /* We failed */
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to unregister 
protocol %s://", protocol);
+               RETURN_FALSE;
+       }
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ bool stream_wrapper_restore(string protocol)
+       Restore the original protocol handler, overriding if necessary */
+PHP_FUNCTION(stream_wrapper_restore)
+{
+       char *protocol;
+       int protocol_len;
+       php_stream_wrapper *wrapper = NULL;
+       HashTable *global_wrapper_hash;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &protocol, 
&protocol_len) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       global_wrapper_hash = php_stream_get_url_stream_wrappers_hash_global();
+       if (php_stream_get_url_stream_wrappers_hash() == global_wrapper_hash) {
+               php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s:// was never changed, 
nothing to restore", protocol);
+               RETURN_TRUE;
+       }
+
+       if ((zend_hash_find(global_wrapper_hash, protocol, protocol_len, 
(void**)&wrapper) == FAILURE) || !wrapper) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s:// never existed, 
nothing to restore", protocol);
+               RETURN_FALSE;
+       }
+
+       /* A failure here could be okay given that the protocol might have been merely 
unregistered */
+       php_unregister_url_stream_wrapper_volatile(protocol TSRMLS_CC);
+
+       if (php_register_url_stream_wrapper_volatile(protocol, wrapper TSRMLS_CC) == 
FAILURE) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to restore 
original %s:// wrapper", protocol);
+               RETURN_FALSE;
+       }       
+
+       RETURN_TRUE;
+}
+/* }}} */
 
 static size_t php_userstreamop_write(php_stream *stream, const char *buf, size_t 
count TSRMLS_DC)
 {

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

Reply via email to