diff options
author | Gustavo André dos Santos Lopes <cataphract@php.net> | 2010-12-30 19:00:19 +0000 |
---|---|---|
committer | Gustavo André dos Santos Lopes <cataphract@php.net> | 2010-12-30 19:00:19 +0000 |
commit | 5eb264677c93232ff628934ff3df0ff445347ea5 (patch) | |
tree | 8aac05a14428933d62063ceb8874da558605e423 | |
parent | ac216eb88c7053e76e96c7e52670023a0ffa1e5d (diff) | |
download | php-git-5eb264677c93232ff628934ff3df0ff445347ea5.tar.gz |
- Do not violate php_stream abstraction and use php_stream_tell instead of accessing the field .position.
#Should have no behavior changes.
-rw-r--r-- | ext/standard/streamsfuncs.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index b15d3efef7..2b7ffae9d1 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -413,29 +413,36 @@ PHP_FUNCTION(stream_socket_recvfrom) 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; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zsrc, &maxlen, &pos) == FAILURE) { + 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, &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; } } |