wez Wed Sep 18 06:15:40 2002 EDT Added files: /php4/ext/standard/tests/file userstreams.phpt
Modified files: /php4/main user_streams.c Log: Tidy up some user stream code. Add a small test case (not yet complete). Index: php4/main/user_streams.c diff -u php4/main/user_streams.c:1.18 php4/main/user_streams.c:1.19 --- php4/main/user_streams.c:1.18 Sat Sep 7 14:59:18 2002 +++ php4/main/user_streams.c Wed Sep 18 06:15:40 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: user_streams.c,v 1.18 2002/09/07 18:59:18 wez Exp $ */ +/* $Id: user_streams.c,v 1.19 2002/09/18 10:15:40 wez Exp $ */ #include "php.h" #include "php_globals.h" @@ -164,7 +164,7 @@ 4, args, 0, NULL TSRMLS_CC); - if (call_result == SUCCESS && zretval != NULL) { + if (call_result == SUCCESS && zretval != NULL && zval_is_true(zretval)) { /* the stream is now open! */ stream = php_stream_alloc_rel(&php_stream_userspace_ops, us, 0, mode); @@ -177,12 +177,15 @@ stream->wrapperdata = us->object; zval_add_ref(&stream->wrapperdata); } else { - /* destroy the object */ - zval_ptr_dtor(&us->object); - efree(us); + php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "\"%s::" +USERSTREAM_OPEN "\" call failed", + us->wrapper->classname); } /* destroy everything else */ + if (stream == NULL) { + zval_ptr_dtor(&us->object); + efree(us); + } if (zretval) zval_ptr_dtor(&zretval); @@ -266,10 +269,11 @@ 1, args, 0, NULL TSRMLS_CC); - if (call_result == SUCCESS && retval != NULL && Z_TYPE_P(retval) == IS_LONG) + didwrite = 0; + if (call_result == SUCCESS && retval != NULL) { + convert_to_long_ex(&retval); didwrite = Z_LVAL_P(retval); - else - didwrite = 0; + } /* don't allow strange buffer overruns due to bogus return */ if (didwrite > count) { @@ -326,7 +330,8 @@ 1, args, 0, NULL TSRMLS_CC); - if (retval && Z_TYPE_P(retval) == IS_STRING) { + if (call_result == SUCCESS && retval != NULL) { + convert_to_string_ex(&retval); didread = Z_STRLEN_P(retval); if (didread > count) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_READ " - read %d bytes more data than requested (%d read, %d max) - excess data will be lost", @@ -464,6 +469,7 @@ zval **args[2]; size_t didread = 0; php_userstream_data_t *us = (php_userstream_data_t *)stream->abstract; + int call_result; assert(us != NULL); @@ -475,14 +481,15 @@ ZVAL_LONG(zcount, size); args[0] = &zcount; - call_user_function_ex(NULL, + call_result = call_user_function_ex(NULL, &us->object, &func_name, &retval, 1, args, 0, NULL TSRMLS_CC); - if (retval && Z_TYPE_P(retval) == IS_STRING) { + if (retval && call_result == SUCCESS) { + convert_to_string_ex(&retval); didread = Z_STRLEN_P(retval); if (didread > size) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_GETS " - read more data than requested; some data will be lost", Index: php4/ext/standard/tests/file/userstreams.phpt +++ php4/ext/standard/tests/file/userstreams.phpt --TEST-- User-space streams --FILE-- <?php # vim600:syn=php: class uselessstream { } class mystream { function mystream() { echo "MYSTREAM: constructor called!\n"; } var $path; var $mode; var $options; function stream_open($path, $mode, $options, &$opened_path) { $this->path = $path; $this->mode = $mode; $this->options = $options; return true; } } if (@file_register_wrapper("bogus", "class_not_exist")) die("Registered a non-existant class!!!???"); if (!file_register_wrapper("test", "mystream")) die("test wrapper registration failed"); if (!file_register_wrapper("bogon", "uselessstream")) die("bogon wrapper registration failed"); echo "Registered\n"; $b = @fopen("bogon://url", "rb"); if (is_resource($b)) die("Opened a bogon??"); $fp = fopen("test://url", "rb"); if (!is_resource($fp)) die("Failed to open resource"); ?> --EXPECT-- Registered -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php