cataphract Thu, 30 Dec 2010 19:00:19 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=306877
Log: - Do not violate php_stream abstraction and use php_stream_tell instead of accessing the field .position. #Should have no behavior changes. Changed paths: U php/php-src/branches/PHP_5_3/ext/standard/streamsfuncs.c U php/php-src/trunk/ext/standard/streamsfuncs.c Modified: php/php-src/branches/PHP_5_3/ext/standard/streamsfuncs.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/streamsfuncs.c 2010-12-30 18:49:38 UTC (rev 306876) +++ php/php-src/branches/PHP_5_3/ext/standard/streamsfuncs.c 2010-12-30 19:00:19 UTC (rev 306877) @@ -413,29 +413,36 @@ Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string. */ PHP_FUNCTION(stream_get_contents) { - php_stream *stream; - zval *zsrc; - long maxlen = PHP_STREAM_COPY_ALL, pos = -1L; - int len, newlen; - char *contents = NULL; + php_stream *stream; + zval *zsrc; + long maxlen = PHP_STREAM_COPY_ALL, + desiredpos = -1L; + int len, + newlen; + char *contents = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &pos) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &desiredpos) == FAILURE) { RETURN_FALSE; } php_stream_from_zval(stream, &zsrc); - if (pos >= 0) { - int seek_res = 0; - if (pos > stream->position) { + if (desiredpos >= 0) { + int seek_res = 0; + off_t position; + + position = php_stream_tell(stream); + if (position >= 0 && desiredpos > position) { /* use SEEK_CUR to allow emulation in streams that don't support seeking */ - seek_res = php_stream_seek(stream, pos - stream->position, SEEK_CUR); - } else if (pos < stream->position) { - seek_res = php_stream_seek(stream, pos, SEEK_SET); + seek_res = php_stream_seek(stream, desiredpos - position, SEEK_CUR); + } else if (desiredpos < position) { + /* desired position before position or error on tell */ + seek_res = php_stream_seek(stream, desiredpos, SEEK_SET); } if (seek_res != 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek to position %ld in the stream", pos); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Failed to seek to position %ld in the stream", desiredpos); RETURN_FALSE; } } Modified: php/php-src/trunk/ext/standard/streamsfuncs.c =================================================================== --- php/php-src/trunk/ext/standard/streamsfuncs.c 2010-12-30 18:49:38 UTC (rev 306876) +++ php/php-src/trunk/ext/standard/streamsfuncs.c 2010-12-30 19:00:19 UTC (rev 306877) @@ -413,29 +413,36 @@ Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string. */ PHP_FUNCTION(stream_get_contents) { - php_stream *stream; - zval *zsrc; - long maxlen = PHP_STREAM_COPY_ALL, pos = -1L; - int len, newlen; - char *contents = NULL; + php_stream *stream; + zval *zsrc; + long maxlen = PHP_STREAM_COPY_ALL, + desiredpos = -1L; + int len, + newlen; + char *contents = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &pos) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &desiredpos) == FAILURE) { RETURN_FALSE; } php_stream_from_zval(stream, &zsrc); - if (pos >= 0) { - int seek_res = 0; - if (pos > stream->position) { + if (desiredpos >= 0) { + int seek_res = 0; + off_t position; + + position = php_stream_tell(stream); + if (position >= 0 && desiredpos > position) { /* use SEEK_CUR to allow emulation in streams that don't support seeking */ - seek_res = php_stream_seek(stream, pos - stream->position, SEEK_CUR); - } else if (pos < stream->position) { - seek_res = php_stream_seek(stream, pos, SEEK_SET); + seek_res = php_stream_seek(stream, desiredpos - position, SEEK_CUR); + } else if (desiredpos < position) { + /* desired position before position or error on tell */ + seek_res = php_stream_seek(stream, desiredpos, SEEK_SET); } if (seek_res != 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek to position %ld in the stream", pos); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Failed to seek to position %ld in the stream", desiredpos); RETURN_FALSE; } }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php