summaryrefslogtreecommitdiff
path: root/ext/phar
diff options
context:
space:
mode:
authorGreg Beaver <cellog@php.net>2008-10-11 22:21:07 +0000
committerGreg Beaver <cellog@php.net>2008-10-11 22:21:07 +0000
commit692222f12a42584bde52c68257068f79ed260454 (patch)
tree7976b940536f5001d4159a7869fb656f9e50e00e /ext/phar
parent44cb95a53d199b7f06eedcc07f1a839ada4e795d (diff)
downloadphp-git-692222f12a42584bde52c68257068f79ed260454.tar.gz
MFB: fix links for fseek as well
Diffstat (limited to 'ext/phar')
-rw-r--r--ext/phar/stream.c13
-rw-r--r--ext/phar/tests/tar/links6.phpt6
2 files changed, 16 insertions, 3 deletions
diff --git a/ext/phar/stream.c b/ext/phar/stream.c
index 95950bf60f..6670f6d48c 100644
--- a/ext/phar/stream.c
+++ b/ext/phar/stream.c
@@ -389,12 +389,19 @@ static size_t phar_stream_read(php_stream *stream, char *buf, size_t count TSRML
static int phar_stream_seek(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC) /* {{{ */
{
phar_entry_data *data = (phar_entry_data *)stream->abstract;
-
+ phar_entry_info *entry;
int res;
off_t temp;
+
+ if (data->internal_file->link) {
+ entry = phar_get_link_source(data->internal_file TSRMLS_CC);
+ } else {
+ entry = data->internal_file;
+ }
+
switch (whence) {
case SEEK_END :
- temp = data->zero + data->internal_file->uncompressed_filesize + offset;
+ temp = data->zero + entry->uncompressed_filesize + offset;
break;
case SEEK_CUR :
temp = data->zero + data->position + offset;
@@ -403,7 +410,7 @@ static int phar_stream_seek(php_stream *stream, off_t offset, int whence, off_t
temp = data->zero + offset;
break;
}
- if (temp > data->zero + (off_t) data->internal_file->uncompressed_filesize) {
+ if (temp > data->zero + (off_t) entry->uncompressed_filesize) {
*newoffset = -1;
return -1;
}
diff --git a/ext/phar/tests/tar/links6.phpt b/ext/phar/tests/tar/links6.phpt
index 622a8b61bf..9a548a8784 100644
--- a/ext/phar/tests/tar/links6.phpt
+++ b/ext/phar/tests/tar/links6.phpt
@@ -9,6 +9,10 @@ if (!extension_loaded("phar")) die("skip");
echo file_get_contents('phar://' . dirname(__FILE__) . '/files/links.phar.tar/link2');
echo file_get_contents('phar://' . dirname(__FILE__) . '/files/links.phar.tar/link1');
echo file_get_contents('phar://' . dirname(__FILE__) . '/files/links.phar.tar/testit.txt');
+
+$a = fopen('phar://' . dirname(__FILE__) . '/files/links.phar.tar/link2', 'r');
+fseek($a, 3);
+echo fread($a, 10);
?>
===DONE===
--EXPECT--
@@ -18,4 +22,6 @@ hi there
hi there
+there
+
===DONE=== \ No newline at end of file