cellog Sat Oct 11 22:12:18 2008 UTC Added files: /php-src/ext/phar/tests/tar/files links.phar.tar
Modified files: /php-src/ext/phar stream.c util.c /php-src/ext/phar/tests/tar links6.phpt Log: MFB: fix reading links from streams (works with PharFileInfo->getContent())
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/stream.c?r1=1.36&r2=1.37&diff_format=u Index: php-src/ext/phar/stream.c diff -u php-src/ext/phar/stream.c:1.36 php-src/ext/phar/stream.c:1.37 --- php-src/ext/phar/stream.c:1.36 Fri Sep 26 23:35:11 2008 +++ php-src/ext/phar/stream.c Sat Oct 11 22:12:18 2008 @@ -359,8 +359,15 @@ { phar_entry_data *data = (phar_entry_data *)stream->abstract; size_t got; + phar_entry_info *entry; + + if (data->internal_file->link) { + entry = phar_get_link_source(data->internal_file TSRMLS_CC); + } else { + entry = data->internal_file; + } - if (data->internal_file->is_deleted) { + if (entry->is_deleted) { stream->eof = 1; return 0; } @@ -368,9 +375,9 @@ /* use our proxy position */ php_stream_seek(data->fp, data->position + data->zero, SEEK_SET); - got = php_stream_read(data->fp, buf, MIN(count, data->internal_file->uncompressed_filesize - data->position)); + got = php_stream_read(data->fp, buf, MIN(count, entry->uncompressed_filesize - data->position)); data->position = php_stream_tell(data->fp) - data->zero; - stream->eof = (data->position == (off_t) data->internal_file->uncompressed_filesize); + stream->eof = (data->position == (off_t) entry->uncompressed_filesize); return got; } http://cvs.php.net/viewvc.cgi/php-src/ext/phar/util.c?r1=1.66&r2=1.67&diff_format=u Index: php-src/ext/phar/util.c diff -u php-src/ext/phar/util.c:1.66 php-src/ext/phar/util.c:1.67 --- php-src/ext/phar/util.c:1.66 Thu Oct 9 00:51:27 2008 +++ php-src/ext/phar/util.c Sat Oct 11 22:12:18 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: util.c,v 1.66 2008/10/09 00:51:27 cellog Exp $ */ +/* $Id: util.c,v 1.67 2008/10/11 22:12:18 cellog Exp $ */ #include "phar_internal.h" @@ -65,12 +65,13 @@ phar_entry_info *phar_get_link_source(phar_entry_info *entry TSRMLS_DC) /* {{{ */ { phar_entry_info *link_entry; - char *link = phar_get_link_location(entry TSRMLS_CC); + char *link; if (!entry->link) { return entry; } + link = phar_get_link_location(entry TSRMLS_CC); if (SUCCESS == zend_hash_find(&(entry->phar->manifest), entry->link, strlen(entry->link), (void **)&link_entry) || SUCCESS == zend_hash_find(&(entry->phar->manifest), link, strlen(link), (void **)&link_entry)) { if (link != entry->link) { @@ -680,13 +681,13 @@ phar_seek_efp(entry, 0, SEEK_END, 0, 0 TSRMLS_CC); } } else { - if (entry->link) { - efree(entry->link); - entry->link = NULL; - entry->tar_type = (entry->is_tar ? TAR_FILE : '\0'); - } - if (for_write) { + if (entry->link) { + efree(entry->link); + entry->link = NULL; + entry->tar_type = (entry->is_tar ? TAR_FILE : '\0'); + } + if (for_trunc) { if (FAILURE == phar_create_writeable_entry(phar, entry, error TSRMLS_CC)) { return FAILURE; @@ -711,7 +712,11 @@ (*ret)->is_zip = entry->is_zip; (*ret)->is_tar = entry->is_tar; (*ret)->fp = phar_get_efp(entry, 1 TSRMLS_CC); - (*ret)->zero = phar_get_fp_offset(entry TSRMLS_CC); + if (entry->link) { + (*ret)->zero = phar_get_fp_offset(phar_get_link_source(entry TSRMLS_CC) TSRMLS_CC); + } else { + (*ret)->zero = phar_get_fp_offset(entry TSRMLS_CC); + } if (!phar->is_persistent) { ++(entry->fp_refcount); http://cvs.php.net/viewvc.cgi/php-src/ext/phar/tests/tar/links6.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/phar/tests/tar/links6.phpt diff -u /dev/null php-src/ext/phar/tests/tar/links6.phpt:1.2 --- /dev/null Sat Oct 11 22:12:18 2008 +++ php-src/ext/phar/tests/tar/links6.phpt Sat Oct 11 22:12:18 2008 @@ -0,0 +1,21 @@ +--TEST-- +Phar: test nested linked files +--SKIPIF-- +<?php +if (!extension_loaded("phar")) die("skip"); +?> +--FILE-- +<?php +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'); +?> +===DONE=== +--EXPECT-- +hi there + +hi there + +hi there + +===DONE=== \ No newline at end of file http://cvs.php.net/viewvc.cgi/php-src/ext/phar/tests/tar/files/links.phar.tar?view=markup&rev=1.1 Index: php-src/ext/phar/tests/tar/files/links.phar.tar +++ php-src/ext/phar/tests/tar/files/links.phar.tar link1 __HALT_COMPILER(); ?>
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php