return; \
}
-static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
-{
- zval **value;
- zend_uchar key_type;
- zend_bool is_splfileinfo = 0, close_fp = 1;
- ulong int_key;
- struct _t {
+struct _phar_t {
phar_archive_object *p;
zend_class_entry *c;
char *b;
uint l;
zval *ret;
int count;
- } *p_obj = (struct _t*) puser;
+ php_stream *fp;
+ };
+static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
+{
+ zval **value;
+ zend_uchar key_type;
+ zend_bool is_splfileinfo = 0, close_fp = 1;
+ ulong int_key;
+ struct _phar_t *p_obj = (struct _phar_t*) puser;
uint str_key_len, base_len = p_obj->l, fname_len;
phar_entry_data *data;
php_stream *fp;
if (error) {
efree(error);
}
- contents_len = php_stream_copy_to_stream(fp, data->fp, PHP_STREAM_COPY_ALL);
+ /* convert to PHAR_UFP */
+ php_stream_close(data->internal_file->fp);
+ data->internal_file->fp_type = PHAR_UFP;
+ data->internal_file->offset_abs = data->internal_file->offset = php_stream_tell(p_obj->fp);
+ contents_len = php_stream_copy_to_stream(fp, p_obj->fp, PHP_STREAM_COPY_ALL);
+ data->internal_file->uncompressed_filesize = data->internal_file->compressed_filesize =
+ php_stream_tell(p_obj->fp) - data->internal_file->offset;
}
if (close_fp) {
php_stream_close(fp);
data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len;
phar_entry_delref(data TSRMLS_CC);
- if (++p_obj->count && p_obj->count % 900) {
- /* every 900 files, flush so we remove open temp file handles, fixes Bug #45218 */
- phar_flush(p_obj->p->arc.archive, 0, 0, 0, &error TSRMLS_CC);
- if (error) {
- zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
- efree(error);
- return ZEND_HASH_APPLY_STOP;
- }
- }
return ZEND_HASH_APPLY_KEEP;
}
/* }}} */
int dir_len, regex_len = 0;
zend_bool apply_reg = 0;
zval arg, arg2, *iter, *iteriter, *regexiter = NULL;
- struct {
- phar_archive_object *p;
- zend_class_entry *c;
- char *b;
- uint l;
- zval *ret;
- int count;
- } pass;
+ struct _phar_t pass;
PHAR_ARCHIVE_OBJECT();
pass.l = dir_len;
pass.count = 0;
pass.ret = return_value;
+ pass.fp = php_stream_fopen_tmpfile();
if (SUCCESS == spl_iterator_apply((apply_reg ? regexiter : iteriter), (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {
zval_ptr_dtor(&iteriter);
if (apply_reg) {
zval_ptr_dtor(®exiter);
}
+ phar_obj->arc.archive->ufp = pass.fp;
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
if (error) {
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
char *error;
uint base_len = 0;
char *base = NULL;
- struct {
- phar_archive_object *p;
- zend_class_entry *c;
- char *b;
- uint l;
- zval *ret;
- int count;
- } pass;
+ struct _phar_t pass;
PHAR_ARCHIVE_OBJECT();
if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
pass.l = base_len;
pass.ret = return_value;
pass.count = 0;
+ pass.fp = php_stream_fopen_tmpfile();
if (SUCCESS == spl_iterator_apply(obj, (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {
+ phar_obj->arc.archive->ufp = pass.fp;
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
if (error) {
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);