diff options
author | Wez Furlong <wez@php.net> | 2002-10-05 10:35:13 +0000 |
---|---|---|
committer | Wez Furlong <wez@php.net> | 2002-10-05 10:35:13 +0000 |
commit | 077fe52d8b650b5d1739aa55ab90f6ab6ad8461b (patch) | |
tree | 90af179612cfc891683ba1fbf5ba8d66874b93bf /main/user_streams.c | |
parent | 945ccfa76a8453ffc8fe4e514ef593c95fe377eb (diff) | |
download | php-git-077fe52d8b650b5d1739aa55ab90f6ab6ad8461b.tar.gz |
This seems to resolve the issues with fgets.
I've moved EOF detection into the streams layer; a stream reader
implementation should set stream->eof when it detects EOF.
Fixed test for user streams - it still fails but that is due to an output
buffering bug.
Diffstat (limited to 'main/user_streams.c')
-rw-r--r-- | main/user_streams.c | 88 |
1 files changed, 42 insertions, 46 deletions
diff --git a/main/user_streams.c b/main/user_streams.c index 0688fbd596..bf7d141126 100644 --- a/main/user_streams.c +++ b/main/user_streams.c @@ -431,65 +431,61 @@ static size_t php_userstreamop_read(php_stream *stream, char *buf, size_t count int call_result; size_t didread = 0; php_userstream_data_t *us = (php_userstream_data_t *)stream->abstract; + zval *zcount; assert(us != NULL); - if (buf == NULL && count == 0) { - ZVAL_STRINGL(&func_name, USERSTREAM_EOF, sizeof(USERSTREAM_EOF)-1, 0); + ZVAL_STRINGL(&func_name, USERSTREAM_READ, sizeof(USERSTREAM_READ)-1, 0); - call_result = call_user_function_ex(NULL, + MAKE_STD_ZVAL(zcount); + ZVAL_LONG(zcount, count); + args[0] = &zcount; + + call_result = call_user_function_ex(NULL, &us->object, &func_name, &retval, - 0, NULL, 0, NULL TSRMLS_CC); - - if (call_result == SUCCESS && retval != NULL && zval_is_true(retval)) - didread = 0; - else { - if (call_result == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_EOF " is not implemented! Assuming EOF", - us->wrapper->classname); - } + 1, args, + 0, NULL TSRMLS_CC); - didread = EOF; + if (call_result == SUCCESS && retval != NULL) { + convert_to_string(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", + us->wrapper->classname, didread - count, didread, count); + didread = count; } + if (didread > 0) + memcpy(buf, Z_STRVAL_P(retval), didread); + } else if (call_result == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_READ " is not implemented!", + us->wrapper->classname); + } + zval_ptr_dtor(&zcount); - } else { - zval *zcount; - - ZVAL_STRINGL(&func_name, USERSTREAM_READ, sizeof(USERSTREAM_READ)-1, 0); - - MAKE_STD_ZVAL(zcount); - ZVAL_LONG(zcount, count); - args[0] = &zcount; - - call_result = call_user_function_ex(NULL, - &us->object, - &func_name, - &retval, - 1, args, - 0, NULL TSRMLS_CC); - - if (call_result == SUCCESS && retval != NULL) { - convert_to_string(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", - us->wrapper->classname, didread - count, didread, count); - didread = count; - } - if (didread > 0) - memcpy(buf, Z_STRVAL_P(retval), didread); - } else if (call_result == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_READ " is not implemented!", + if (retval) + zval_ptr_dtor(&retval); + + /* since the user stream has no way of setting the eof flag directly, we need to ask it if we hit eof */ + + ZVAL_STRINGL(&func_name, USERSTREAM_EOF, sizeof(USERSTREAM_EOF)-1, 0); + + call_result = call_user_function_ex(NULL, + &us->object, + &func_name, + &retval, + 0, NULL, 0, NULL TSRMLS_CC); + + if (!(call_result == SUCCESS && retval != NULL && zval_is_true(retval))) { + if (call_result == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s::" USERSTREAM_EOF " is not implemented! Assuming EOF", us->wrapper->classname); } - zval_ptr_dtor(&zcount); + + stream->eof = 1; } - - if (retval) - zval_ptr_dtor(&retval); - + return didread; } |