From cfbe30dd4317f88c7830a0d23e31a0cf466f6a42 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Elan=20Ruusam=C3=A4e?= Date: Thu, 12 Jun 2014 18:11:52 +0300 Subject: [PATCH] up to 0.3.1 via branch.diff --- branch.diff | 1223 ++++++++++++++++++++++++++++++++++ branch.sh | 33 + php-pecl-archive-php52.patch | 11 - php-pecl-archive.spec | 12 +- 4 files changed, 1262 insertions(+), 17 deletions(-) create mode 100644 branch.diff create mode 100755 branch.sh delete mode 100644 php-pecl-archive-php52.patch diff --git a/branch.diff b/branch.diff new file mode 100644 index 0000000..f5abd2d --- /dev/null +++ b/branch.diff @@ -0,0 +1,1223 @@ +diff --git a/API.txt b/API.txt +index b2c690e..6895062 100644 +--- a/API.txt ++++ b/API.txt +@@ -31,7 +31,8 @@ Classes: + + class ArchiveReader { + /** +- * ArchiveReader __construct (string filename[, int format[, int compression]]) ++ * ArchiveReader __construct (string filename[, int format[, int ++ * compression [, int block_size]]]) + * + * You need to specify format & compression params *only* if you need + * to support only these particular formats/compressions. +diff --git a/archive.c b/archive.c +index 045adfc..6239edd 100644 +--- a/archive.c ++++ b/archive.c +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -33,11 +33,15 @@ + #include "archive_clbk.h" + #include "php_archive_entry.h" + ++#if (PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION < 2) + #define archive_ce_Exception zend_exception_get_default() ++#else ++#define archive_ce_Exception zend_exception_get_default(TSRMLS_C) ++#endif + + /* {{{ archive_functions[] + */ +-function_entry archive_functions[] = { ++zend_function_entry archive_functions[] = { + {NULL, NULL, NULL} + }; + /* }}} */ +@@ -56,7 +60,7 @@ zend_module_entry archive_module_entry = { + NULL, /* here */ + PHP_MINFO(archive), + #if ZEND_MODULE_API_NO >= 20010901 +- "0.1", ++ PHP_ARCHIVE_VERSION, + #endif + STANDARD_MODULE_PROPERTIES + }; +@@ -65,9 +69,9 @@ zend_module_entry archive_module_entry = { + #ifdef COMPILE_DL_ARCHIVE + ZEND_GET_MODULE(archive) + #endif +- ++ + static void _archive_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC); +- ++ + /* {{{ _archive_entries_hash_dtor + */ + void _archive_entries_hash_dtor(void *data) +@@ -83,20 +87,20 @@ void _archive_entries_hash_dtor(void *data) + */ + static void _archive_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) + { +- archive_file_t *arch = (archive_file_t *)rsrc->ptr; ++ archive_file_t *arch = (archive_file_t *)rsrc->ptr; + + if (arch->mode == PHP_ARCHIVE_READ_MODE) { +- archive_read_finish(arch->arch); ++ archive_read_free(arch->arch); + } + else if (arch->mode == PHP_ARCHIVE_WRITE_MODE) { + archive_write_close(arch->arch); +- archive_write_finish(arch->arch); ++ archive_write_free(arch->arch); + } +- ++ + if (arch->stream) { + php_stream_close(arch->stream); + } +- ++ + if (arch->filename) { + efree(arch->filename); + } +@@ -116,12 +120,12 @@ static void _archive_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) + int _archive_get_rsrc_id(zval *this TSRMLS_DC) + { + zval **prop; +- +- if (zend_hash_find(Z_OBJPROP_P(this), "fd", sizeof("fd"), (void **)&prop) == FAILURE) { +- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find archive file descriptor"); +- return 0; +- } +- ++ ++ if (zend_hash_find(Z_OBJPROP_P(this), "fd", sizeof("fd"), (void **)&prop) == FAILURE) { ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find archive file descriptor"); ++ return 0; ++ } ++ + return Z_LVAL_PP(prop); + } + /* }}} */ +@@ -131,7 +135,7 @@ int _archive_get_rsrc_id(zval *this TSRMLS_DC) + int _archive_get_fd(zval *this, archive_file_t **arch TSRMLS_DC) + { + int resource_id, type; +- ++ + + if ((resource_id = _archive_get_rsrc_id(this TSRMLS_CC))) { + *arch = (archive_file_t *) zend_list_find(resource_id, &type); +@@ -149,12 +153,12 @@ int _archive_get_fd(zval *this, archive_file_t **arch TSRMLS_DC) + PHP_MINIT_FUNCTION(archive) + { + zend_class_entry tmp_ce_ArchiveException; +- ++ + le_archive = zend_register_list_destructors_ex(_archive_desc_dtor, NULL, "archive descriptor", module_number); +- ++ + INIT_CLASS_ENTRY(tmp_ce_ArchiveException, "ArchiveException", NULL); + ce_ArchiveException = zend_register_internal_class_ex(&tmp_ce_ArchiveException, archive_ce_Exception, NULL TSRMLS_CC); +- ++ + PHP_MINIT(archive_entry)(INIT_FUNC_ARGS_PASSTHRU); + PHP_MINIT(archive_reader)(INIT_FUNC_ARGS_PASSTHRU); + +@@ -174,7 +178,7 @@ PHP_MINIT_FUNCTION(archive) + #endif + REGISTER_LONG_CONSTANT("ARCH_COMPRESSION_COMPRESS", PHP_ARCHIVE_COMPRESSION_COMPRESS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARCH_COMPRESSION_NONE", PHP_ARCHIVE_COMPRESSION_NONE, CONST_CS | CONST_PERSISTENT); +- ++ + return SUCCESS; + } + /* }}} */ +@@ -185,7 +189,8 @@ PHP_MINFO_FUNCTION(archive) + { + php_info_print_table_start(); + php_info_print_table_header(2, "archive support", "enabled"); +- php_info_print_table_row(2, "libarchive version", archive_version()); ++ php_info_print_table_row(2, "extension version", PHP_ARCHIVE_VERSION); ++ php_info_print_table_row(2, "libarchive version", archive_version()); + php_info_print_table_end(); + } + /* }}} */ +diff --git a/archive_clbk.c b/archive_clbk.c +index 3034e0a..3b09d8b 100644 +--- a/archive_clbk.c ++++ b/archive_clbk.c +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -32,7 +32,6 @@ ssize_t _archive_read_clbk(struct archive *a, void *client_data, const void **bu + { + archive_file_t *arch = (archive_file_t *)client_data; + ssize_t len = 0; +- + TSRMLS_FETCH(); + + if (arch->stream == NULL) { +@@ -40,7 +39,7 @@ ssize_t _archive_read_clbk(struct archive *a, void *client_data, const void **bu + } + + *buff = arch->buf; +- if ((len = php_stream_read(arch->stream, arch->buf, PHP_ARCHIVE_BUF_LEN))) { ++ if ((len = php_stream_read(arch->stream, arch->buf, arch->block_size))) { + return len; + } + return 0; +@@ -49,11 +48,10 @@ ssize_t _archive_read_clbk(struct archive *a, void *client_data, const void **bu + + /* {{{ _archive_write_clbk + */ +-ssize_t _archive_write_clbk(struct archive *a, void *client_data, void *buff, size_t buf_len) ++ssize_t _archive_write_clbk(struct archive *a, void *client_data, const void *buff, size_t buf_len) + { + archive_file_t *arch = (archive_file_t *)client_data; + ssize_t len; +- + TSRMLS_FETCH(); + + if (arch->stream == NULL) { +@@ -67,12 +65,58 @@ ssize_t _archive_write_clbk(struct archive *a, void *client_data, void *buff, si + } + /* }}} */ + ++/* {{{ _archive_skip_clbk ++ * */ ++off_t _archive_skip_clbk(struct archive *a, void *client_data, off_t request) ++{ ++ archive_file_t *arch = (archive_file_t *)client_data; ++ off_t size; ++ int r; ++ TSRMLS_FETCH(); ++ ++ if(request == 0) { ++ return 0; ++ } ++ ++ if(arch->stream){ ++ size = (request/arch->block_size) * arch->block_size; ++ if(size == 0){ /*do not break a block*/ ++ return 0; ++ } ++ /*TODO maybe lasy seek is a better idea for performance ++ * refer: libarchive archive_read_open_filename.c file_skip_lseek ++ * */ ++ r = php_stream_seek(arch->stream, size, SEEK_CUR); ++ if(r < 0){ ++ return 0; ++ } ++ return size; ++ } ++ return 0; ++} ++/*}}}*/ ++ ++/* {{{ _archive_seek_clbk ++ * */ ++ssize_t _archive_seek_clbk(struct archive *a, void *client_data, off_t offset, int whence) ++{ ++ int r; ++ archive_file_t *arch = (archive_file_t *)client_data; ++ TSRMLS_FETCH(); ++ ++ r = php_stream_seek(arch->stream, offset, whence); ++ if(r == 0){ ++ ++ return php_stream_tell(arch->stream); ++ } ++ return r; ++}/*}}}*/ ++ + /* {{{ _archive_open_clbk + */ + int _archive_open_clbk(struct archive *a, void *client_data) + { + archive_file_t *arch = (archive_file_t *)client_data; +- + TSRMLS_FETCH(); + + if (arch->mode == PHP_ARCHIVE_WRITE_MODE) { +@@ -80,8 +124,17 @@ int _archive_open_clbk(struct archive *a, void *client_data) + } else if (arch->mode == PHP_ARCHIVE_READ_MODE) { + arch->stream = php_stream_open_wrapper_ex(arch->filename, "r", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, NULL); + } +- ++ + if (arch->stream) { ++ /* Use libarchive to manage buffer ++ * here we set non-buffer of php stream ++ * */ ++ arch->stream->flags |= PHP_STREAM_FLAG_NO_BUFFER; ++ if((arch->stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0){ ++ archive_read_set_skip_callback(arch->arch, _archive_skip_clbk); ++ /*TODO it is usually not a good idea to support seek ++ * archive_read_set_seek_callback(arch->arch, _archive_seek_clbk);*/ ++ } + return 0; + } + return 1; +@@ -93,7 +146,6 @@ int _archive_open_clbk(struct archive *a, void *client_data) + int _archive_close_clbk(struct archive *a, void *client_data) + { + archive_file_t *arch = (archive_file_t *)client_data; +- + TSRMLS_FETCH(); + + if (arch->stream) { +diff --git a/archive_clbk.h b/archive_clbk.h +index 6196a29..626a5ad 100644 +--- a/archive_clbk.h ++++ b/archive_clbk.h +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -24,7 +24,9 @@ + ssize_t _archive_read_clbk(struct archive *, void *, const void **); + int _archive_open_clbk(struct archive *, void *); + int _archive_close_clbk(struct archive *, void *); +-ssize_t _archive_write_clbk(struct archive *, void *, void *, size_t); ++off_t _archive_skip_clbk(struct archive *, void *, off_t); ++ssize_t _archive_seek_clbk(struct archive *, void *, off_t, int); ++ssize_t _archive_write_clbk(struct archive *, void *, const void *, size_t); + + #endif /* ARCHIVE_CLBK_H */ + +diff --git a/archive_entry.c b/archive_entry.c +index 2cc511b..df9c657 100644 +--- a/archive_entry.c ++++ b/archive_entry.c +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -29,8 +29,8 @@ + #include "php_archive.h" + #include "php_archive_entry.h" + +-/* function_entry funcs_ArchiveEntry {{{ */ +-function_entry funcs_ArchiveEntry[] = { ++/* zend_function_entry funcs_ArchiveEntry {{{ */ ++zend_function_entry funcs_ArchiveEntry[] = { + ZEND_ME(ArchiveEntry, __construct, NULL, 0) + ZEND_ME(ArchiveEntry, isDir, NULL, 0) + ZEND_ME(ArchiveEntry, isFile, NULL, 0) +@@ -50,12 +50,13 @@ function_entry funcs_ArchiveEntry[] = { + static void _archive_entry_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC); + + #define PHP_ENTRY_GET_STRUCT \ +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); \ ++ zend_error_handling error_handling; \ ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); \ + if(!_archive_get_entry_struct(this, &entry TSRMLS_CC)) { \ +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); \ ++ zend_restore_error_handling(&error_handling TSRMLS_CC); \ + return; \ + } \ +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + + /* {{{ _archive_entry_desc_dtor + */ +@@ -98,10 +99,10 @@ int _archive_get_entry_rsrc_id(zval *this TSRMLS_DC) + { + zval **prop; + +- if (zend_hash_find(Z_OBJPROP_P(this), "entry", sizeof("entry"), (void **)&prop) == FAILURE) { +- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find entry descriptor"); +- return 0; +- } ++ if (zend_hash_find(Z_OBJPROP_P(this), "entry", sizeof("entry"), (void **)&prop) == FAILURE) { ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find entry descriptor"); ++ return 0; ++ } + + return Z_LVAL_PP(prop); + } +@@ -149,27 +150,30 @@ ZEND_METHOD(ArchiveEntry, __construct) + archive_entry_t *entry; + struct stat *stat_sb; + php_stream_statbuf ssb; +- +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_error_handling error_handling; ++ ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + ++#if PHP_API_VERSION < 20100412 + if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } +- ++#endif ++ + if (php_check_open_basedir(filename TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } +- ++ + if (php_stream_stat_path_ex((char *)filename, PHP_STREAM_URL_STAT_LINK, &ssb, NULL)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "stat failed for %s", filename); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +@@ -177,18 +181,18 @@ ZEND_METHOD(ArchiveEntry, __construct) + + entry = (archive_entry_t *) emalloc(sizeof(archive_entry_t)); + entry->resolved_filename = NULL; +- ++ + #if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS) + if (S_ISLNK(stat_sb->st_mode)) { + char resolved_path_buff[MAXPATHLEN]; + + if (VCWD_REALPATH(filename, resolved_path_buff)) { +-/* TODO figure out if we need this check */ ++ /* TODO figure out if we need this check */ + #if 0 && defined(ZTS) + if (VCWD_ACCESS(resolved_path_buff, F_OK)) { + efree(entry); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "stat failed for %s", filename); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + #endif +@@ -211,7 +215,7 @@ ZEND_METHOD(ArchiveEntry, __construct) + resource_id = zend_list_insert(entry,le_archive_entry); + add_property_resource(this, "entry", resource_id); + +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + /* }}} */ +diff --git a/archive_reader.c b/archive_reader.c +index 0673a83..b0f070a 100644 +--- a/archive_reader.c ++++ b/archive_reader.c +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -32,8 +32,8 @@ + zend_class_entry *ce_ArchiveReader; + zend_class_entry *ce_ArchiveReaderInterface; + +-/* function_entry funcs_ArchiveReaderInterface {{{ */ +-function_entry funcs_ArchiveReaderInterface[] = { ++/* zend_function_entry funcs_ArchiveReaderInterface {{{ */ ++zend_function_entry funcs_ArchiveReaderInterface[] = { + ZEND_ABSTRACT_ME(ArchiveReader, __construct, NULL) + ZEND_ABSTRACT_ME(ArchiveReader, getNextEntry, NULL) + ZEND_ABSTRACT_ME(ArchiveReader, getCurrentEntryData, NULL) +@@ -43,8 +43,8 @@ function_entry funcs_ArchiveReaderInterface[] = { + }; + /* }}} */ + +-/* function_entry funcs_ArchiveReader {{{ */ +-function_entry funcs_ArchiveReader[] = { ++/* zend_function_entry funcs_ArchiveReader {{{ */ ++zend_function_entry funcs_ArchiveReader[] = { + ZEND_ME(ArchiveReader, __construct, NULL, 0) + ZEND_ME(ArchiveReader, getNextEntry, NULL, 0) + ZEND_ME(ArchiveReader, getCurrentEntryData, NULL, 0) +@@ -83,24 +83,30 @@ ZEND_METHOD(ArchiveReader, __construct) + zval *this = getThis(); + const char *error_string = NULL; + char *filename; +- int error_num, filename_len, result, format = 0, compression = 0; ++ long error_num, filename_len, result, format = 0, compression = 0, block_size = 0; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + +- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &format, &compression) == FAILURE) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lll", &filename, &filename_len, &format, &compression, &block_size) == FAILURE) { ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } +- ++#if PHP_API_VERSION < 20100412 + if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } ++#endif + + if (php_check_open_basedir(filename TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } ++ ++ if(block_size <= 0){ ++ block_size = PHP_ARCHIVE_BUF_LEN; ++ } + + arch = (archive_file_t *) emalloc(sizeof(archive_file_t)); + +@@ -108,69 +114,53 @@ ZEND_METHOD(ArchiveReader, __construct) + arch->current_entry = NULL; + arch->entries = NULL; + arch->struct_state = ARCHIVE_OK; ++ arch->block_size = block_size; + arch->mode = PHP_ARCHIVE_READ_MODE; +- arch->buf = emalloc(PHP_ARCHIVE_BUF_LEN + 1); ++ arch->buf = emalloc(arch->block_size + 1); + arch->filename = estrndup(filename, filename_len); + arch->arch = archive_read_new(); + + +- _php_archive_read_support_compression_all(arch->arch); +- +- if (format == 0) { +- /* support all by default */ +- archive_read_support_format_all(arch->arch); +- } +- else { +- if (format & PHP_ARCHIVE_FORMAT_TAR) { +- archive_read_support_format_tar(arch->arch); +- } +- +- if (format & PHP_ARCHIVE_FORMAT_CPIO) { +- archive_read_support_format_cpio(arch->arch); +- } +- } ++ archive_read_support_filter_all(arch->arch); ++ switch(format){ ++ case PHP_ARCHIVE_FORMAT_TAR: ++ archive_read_support_format_tar(arch->arch); ++ break; ++ case PHP_ARCHIVE_FORMAT_CPIO: ++ archive_read_support_format_cpio(arch->arch); ++ break; ++ default: ++ archive_read_support_format_all(arch->arch); ++ break; ++ } + +- if (compression == 0) { +- /* support all possible compression types by default */ +- _php_archive_read_support_compression_all(arch->arch); +- } +- else { +- if (compression & PHP_ARCHIVE_COMPRESSION_NONE) { +- /* none */ +- } +- else { +- if (compression & PHP_ARCHIVE_COMPRESSION_GZIP) { +-#ifdef HAVE_ZLIB +- archive_read_support_compression_gzip(arch->arch); +-#else ++ switch(compression){ ++ case PHP_ARCHIVE_COMPRESSION_NONE: ++ break; ++ case PHP_ARCHIVE_COMPRESSION_GZIP: ++ if(archive_read_support_filter_gzip(arch->arch) != ARCHIVE_OK){ + efree(arch->filename); + efree(arch->buf); + efree(arch); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Gzip compression support is not available in this build "); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); +- return; +-#endif +- } +- +- if (compression & PHP_ARCHIVE_COMPRESSION_BZIP2) { +-#ifdef HAVE_BZ2 +- archive_read_support_compression_bzip2(arch->arch); +-#else ++ zend_restore_error_handling(&error_handling TSRMLS_CC); ++ return; ++ } ++ break; ++ case PHP_ARCHIVE_COMPRESSION_BZIP2: ++ if(archive_read_support_filter_gzip(arch->arch) != ARCHIVE_OK){ + efree(arch->filename); + efree(arch->buf); + efree(arch); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bzip2 compression support is not available in this build "); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; +-#endif +- } +- +- /* compress support is always available */ +- if (compression & PHP_ARCHIVE_COMPRESSION_COMPRESS) { +- archive_read_support_compression_compress(arch->arch); +- } +- } +- } ++ } ++ default: ++ archive_read_support_filter_all(arch->arch); ++ break; ++ } ++ + result = archive_read_open(arch->arch, arch, _archive_open_clbk, _archive_read_clbk, _archive_close_clbk); + + if (result) { +@@ -188,14 +178,14 @@ ZEND_METHOD(ArchiveReader, __construct) + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to open file %s for reading: unknown error %d", filename, result); + } +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + resource_id = zend_list_insert(arch,le_archive); + add_property_resource(this, "fd", resource_id); + +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + /* }}} */ +@@ -212,19 +202,20 @@ ZEND_METHOD(ArchiveReader, getNextEntry) + zend_bool fetch_entry_data = 0; + archive_entry_t *entry; + struct archive_entry *current_entry; +- int len; ++ size_t len; + off_t offset; + char *buf; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &fetch_entry_data) == FAILURE) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (!_archive_get_fd(this, &arch TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +@@ -240,7 +231,7 @@ ZEND_METHOD(ArchiveReader, getNextEntry) + arch->current_entry = entry; + } + else { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_FALSE; + } + +@@ -256,14 +247,14 @@ ZEND_METHOD(ArchiveReader, getNextEntry) + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read file %s: unknown error %d", arch->filename, result); + } +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (result == ARCHIVE_EOF) { + arch->current_entry = NULL; + efree(entry); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_FALSE; + } + +@@ -287,7 +278,7 @@ ZEND_METHOD(ArchiveReader, getNextEntry) + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read file %s: unknown error %d", arch->filename, result); + } +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + } +@@ -297,7 +288,7 @@ ZEND_METHOD(ArchiveReader, getNextEntry) + add_property_resource(return_value, "entry", resource_id); + } + +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + } + /* }}} */ + +@@ -313,22 +304,23 @@ ZEND_METHOD(ArchiveReader, getCurrentEntryData) + off_t offset; + const char *error_string; + char *buf; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (!_archive_get_fd(this, &arch TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (arch->current_entry == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Current archive entry is not available"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (arch->current_entry->data) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_STRINGL(arch->current_entry->data, arch->current_entry->data_len, 1); + } + +@@ -348,11 +340,11 @@ ZEND_METHOD(ArchiveReader, getCurrentEntryData) + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read entry data: unknown error %d", result); + } +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_STRINGL(arch->current_entry->data, arch->current_entry->data_len, 1); + } + /* }}} */ +@@ -366,22 +358,23 @@ ZEND_METHOD(ArchiveReader, extractCurrentEntry) + archive_file_t *arch; + int result, error_num, flags = 0; + const char *error_string; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (!_archive_get_fd(this, &arch TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (arch->current_entry == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Current archive entry is not available"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +@@ -389,7 +382,7 @@ ZEND_METHOD(ArchiveReader, extractCurrentEntry) + /* again, rather annoying libarchive limitation: you can't extract or + * read entry anymore if it had been extracted/read before. + * */ +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_FALSE; + } + +@@ -406,10 +399,10 @@ ZEND_METHOD(ArchiveReader, extractCurrentEntry) + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to extract entry: unknown error %d", result); + } + +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_TRUE; + } + /* }}} */ +@@ -421,18 +414,19 @@ ZEND_METHOD(ArchiveReader, close) + { + zval *this = getThis(); + int resourse_id; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if ((resourse_id = _archive_get_rsrc_id(this TSRMLS_CC))) { + add_property_resource(this, "fd", 0); + zend_list_delete(resourse_id); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_TRUE; + } + + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to close archive file descriptor"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + } + /* }}} */ + +diff --git a/archive_reader.h b/archive_reader.h +index ed1c7f9..29d3acc 100644 +--- a/archive_reader.h ++++ b/archive_reader.h +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +diff --git a/archive_util.c b/archive_util.c +index 9838820..5e4c477 100644 +--- a/archive_util.c ++++ b/archive_util.c +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -48,11 +48,11 @@ int _archive_pathname_compare(const void *a, const void *b TSRMLS_DC) + s = *((Bucket **) b); + + Z_TYPE(first) = IS_STRING; +- Z_STRVAL(first) = f->arKey; ++ Z_STRVAL(first) = (char *)f->arKey; + Z_STRLEN(first) = f->nKeyLength-1; + + Z_TYPE(second) = IS_STRING; +- Z_STRVAL(second) = s->arKey; ++ Z_STRVAL(second) = (char *)s->arKey; + Z_STRLEN(second) = s->nKeyLength-1; + + if (string_compare_function(&result, &first, &second TSRMLS_CC) != SUCCESS) { +diff --git a/archive_util.h b/archive_util.h +index c897738..100493d 100644 +--- a/archive_util.h ++++ b/archive_util.h +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +diff --git a/archive_writer.c b/archive_writer.c +index 30647bf..2637633 100644 +--- a/archive_writer.c ++++ b/archive_writer.c +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -35,8 +35,8 @@ + zend_class_entry *ce_ArchiveWriter; + zend_class_entry *ce_ArchiveWriterInterface; + +-/* function_entry funcs_ArchiveWriterInterface {{{ */ +-function_entry funcs_ArchiveWriterInterface[] = { ++/* zend_function_entry funcs_ArchiveWriterInterface {{{ */ ++zend_function_entry funcs_ArchiveWriterInterface[] = { + ZEND_ABSTRACT_ME(ArchiveWriter, __construct, NULL) + ZEND_ABSTRACT_ME(ArchiveWriter, addEntry, NULL) + ZEND_ABSTRACT_ME(ArchiveWriter, finish, NULL) +@@ -44,8 +44,8 @@ function_entry funcs_ArchiveWriterInterface[] = { + }; + /* }}} */ + +-/* function_entry funcs_ArchiveWriter {{{ */ +-function_entry funcs_ArchiveWriter[] = { ++/* zend_function_entry funcs_ArchiveWriter {{{ */ ++zend_function_entry funcs_ArchiveWriter[] = { + ZEND_ME(ArchiveWriter, __construct, NULL, 0) + ZEND_ME(ArchiveWriter, addEntry, NULL, 0) + ZEND_ME(ArchiveWriter, finish, NULL, 0) +@@ -83,21 +83,24 @@ ZEND_METHOD(ArchiveWriter, __construct) + const char *error_string = NULL; + char *filename; + int error_num, filename_len, result, format=0, compression=0; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &format, &compression) == FAILURE) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + ++#if PHP_API_VERSION < 20100412 + if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } ++#endif + + if (php_check_open_basedir(filename TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +@@ -114,36 +117,28 @@ ZEND_METHOD(ArchiveWriter, __construct) + arch->arch = archive_write_new(); + + switch (compression) { +-#ifdef HAVE_ZLIB + case PHP_ARCHIVE_COMPRESSION_GZIP: +- archive_write_set_compression_gzip(arch->arch); ++ if(archive_write_add_filter_gzip(arch->arch) != ARCHIVE_OK){ ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Gzip compression is not supported in this build"); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); ++ return; ++ } + break; +-#else +- case PHP_ARCHIVE_COMPRESSION_GZIP: +- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Gzip compression is not supported in this build"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); +- return; +- break; +-#endif + +-#ifdef HAVE_BZ2 + case PHP_ARCHIVE_COMPRESSION_BZIP2: +- archive_write_set_compression_bzip2(arch->arch); +- break; +-#else +- case PHP_ARCHIVE_COMPRESSION_BZIP2: +- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bzip2 compression is not supported in this build"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); +- return; ++ if(archive_write_add_filter_bzip2(arch->arch) != ARCHIVE_OK){ ++ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bzip2 compression is not supported in this build"); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); ++ return; ++ } + break; +-#endif + case 0: /* default value */ + case PHP_ARCHIVE_COMPRESSION_NONE: + /* always supported */ + break; + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported compression type %d", compression); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + break; + } +@@ -168,7 +163,7 @@ ZEND_METHOD(ArchiveWriter, __construct) + break; + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported archive format: %d", format); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + break; + } +@@ -190,14 +185,14 @@ ZEND_METHOD(ArchiveWriter, __construct) + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to open file %s for writing: unknown error %d", filename, result); + } +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + resource_id = zend_list_insert(arch,le_archive); + add_property_resource(this, "fd", resource_id); + +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + /* }}} */ +@@ -214,27 +209,28 @@ ZEND_METHOD(ArchiveWriter, addEntry) + char *pathname; + int pathname_len; + const struct stat *stat_sb; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &entry_obj) == FAILURE) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (!_archive_get_fd(this, &arch TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if (!instanceof_function(Z_OBJCE_P(entry_obj), ce_ArchiveEntry TSRMLS_CC)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "An instance of ArchiveEntry is required"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + + if(!_archive_get_entry_struct(entry_obj, &entry TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +@@ -245,7 +241,7 @@ ZEND_METHOD(ArchiveWriter, addEntry) + + if (pathname_len == 0 || pathname[0] == '\0') { + /* user is probably trying to add "./", "/", ".." or ".", ignoring it silently */ +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_TRUE; + } + +@@ -265,7 +261,7 @@ ZEND_METHOD(ArchiveWriter, addEntry) + + /* ..and add it to the hash */ + zend_hash_update(arch->entries, pathname, pathname_len + 1, &entry_copy, sizeof(archive_entry_t), NULL); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_TRUE; + } + /* }}} */ +@@ -284,11 +280,12 @@ ZEND_METHOD(ArchiveWriter, finish) + const char *error_string; + mode_t mode; + php_stream *stream; ++ zend_error_handling error_handling; + +- php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); ++ zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); + + if (!_archive_get_fd(this, &arch TSRMLS_CC)) { +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + +@@ -313,7 +310,7 @@ ZEND_METHOD(ArchiveWriter, finish) + result = archive_write_header(arch->arch, (*entry)->entry); + if (result == ARCHIVE_FATAL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write entry header for file %s: fatal error", (*entry)->filename); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + header_written = 1; +@@ -331,7 +328,7 @@ ZEND_METHOD(ArchiveWriter, finish) + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write file %s: unknown error %d", (*entry)->filename, result); + } + php_stream_close(stream); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + } +@@ -342,7 +339,7 @@ ZEND_METHOD(ArchiveWriter, finish) + result = archive_write_header(arch->arch, (*entry)->entry); + if (result == ARCHIVE_FATAL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write entry header for file %s: fatal error", (*entry)->filename); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + return; + } + } +@@ -352,12 +349,12 @@ ZEND_METHOD(ArchiveWriter, finish) + if ((resource_id = _archive_get_rsrc_id(this TSRMLS_CC))) { + add_property_resource(this, "fd", 0); + zend_list_delete(resource_id); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + RETURN_TRUE; + } + + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to finish writing of archive file"); +- php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); ++ zend_restore_error_handling(&error_handling TSRMLS_CC); + } + /* }}} */ + +diff --git a/archive_writer.h b/archive_writer.h +index f87909c..e51b3a4 100644 +--- a/archive_writer.h ++++ b/archive_writer.h +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +diff --git a/package.xml b/package.xml +index cb319ed..9cefd16 100644 +diff --git a/php_archive.h b/php_archive.h +index ad3724b..21094f8 100644 +--- a/php_archive.h ++++ b/php_archive.h +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + +@@ -24,6 +24,7 @@ + #include + #include + ++#define PHP_ARCHIVE_VERSION "0.3.1-dev" + + #define PHP_ARCHIVE_FORMAT_TAR (1<<0) + #define PHP_ARCHIVE_FORMAT_CPIO (1<<1) +@@ -58,33 +59,43 @@ typedef struct archive_file { + char *filename; + char *buf; + int struct_state; ++ int block_size; + HashTable *entries; + } archive_file_t; + + #define PHP_ARCHIVE_BUF_LEN 8196 + +-#if defined(HAVE_BZ2) && defined(HAVE_ZLIB) +-#define _php_archive_read_support_compression_all(arch) \ +- archive_read_support_compression_bzip2(arch); \ +- archive_read_support_compression_gzip(arch); \ +- archive_read_support_compression_compress(arch); ++#if ARCHIVE_VERSION_NUMBER < 3000000 ++#define archive_read_free archive_read_finish ++#define archive_write_free archive_write_finish ++ ++#define archive_read_support_filter_all archive_read_support_compression_all ++#define archive_read_support_filter_bzip2 archive_read_support_compression_bzip2 ++#define archive_read_support_filter_compress archive_read_support_compression_compress ++#define archive_read_support_filter_gzip archive_read_support_compression_gzip ++#define archive_read_support_filter_lzip archive_read_support_compression_lzip ++#define archive_read_support_filter_lzma archive_read_support_compression_lzma ++#define archive_read_support_filter_none archive_read_support_compression_none ++#define archive_read_support_filter_program archive_read_support_compression_program ++#define archive_read_support_filter_program_signature archive_read_support_compression_program_signature ++#define archive_read_support_filter_rpm archive_read_support_compression_rpm ++#define archive_read_support_filter_uu archive_read_support_compression_uu ++#define archive_read_support_filter_xz archive_read_support_compression_xz ++ ++#define archive_write_add_filter_bzip2 archive_write_set_compression_bzip2 ++#define archive_write_add_filter_compress archive_write_set_compression_compress ++#define archive_write_add_filter_gzip archive_write_set_compression_gzip ++#define archive_write_add_filter_lzip archive_write_set_compression_lzip ++#define archive_write_add_filter_lzma archive_write_set_compression_lzma ++#define archive_write_add_filter_none archive_write_set_compression_none ++#define archive_write_add_filter_program archive_write_set_compression_program ++#define archive_write_add_filter_xz archive_write_set_compression_xz + #endif + +-#if defined(HAVE_BZ2) && !defined(HAVE_ZLIB) +-#define _php_archive_read_support_compression_all(arch) \ +- archive_read_support_compression_bzip2(arch); \ +- archive_read_support_compression_compress(arch); +-#endif +- +-#if !defined(HAVE_BZ2) && defined(HAVE_ZLIB) +-#define _php_archive_read_support_compression_all(arch) \ +- archive_read_support_compression_gzip(arch); \ +- archive_read_support_compression_compress(arch); +-#endif +- +-#if !defined(HAVE_BZ2) && !defined(HAVE_ZLIB) +-#define _php_archive_read_support_compression_all(arch) \ +- archive_read_support_compression_compress(arch); ++#if ZEND_MODULE_API_NO < 20090626 ++typedef int zend_error_handling; ++#define zend_replace_error_handling(type, exception, current) php_set_error_handling((type), (exception) TSRMLS_CC) ++#define zend_restore_error_handling(exception) php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC) + #endif + + PHPAPI zend_class_entry *ce_ArchiveException; +diff --git a/php_archive_entry.h b/php_archive_entry.h +index 88479ed..1bb7914 100644 +--- a/php_archive_entry.h ++++ b/php_archive_entry.h +@@ -12,7 +12,7 @@ + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ +- | Author: Antony Dovgal | ++ | Author: Antony Dovgal | + +----------------------------------------------------------------------+ + */ + diff --git a/branch.sh b/branch.sh new file mode 100755 index 0000000..69b5616 --- /dev/null +++ b/branch.sh @@ -0,0 +1,33 @@ +#!/bin/sh +set -e +pecl=archive +git=https://git.php.net/repository/pecl/file_formats/$pecl.git +tag=RELEASE_1_0_4 +out=branch.diff + +d=$- +filter() { + set -$d + # drop package.xml (does not apply) + filterdiff -x '*/package.xml' | \ + # remove revno's for smaller diffs + sed -e 's,^\([-+]\{3\} .*\)\t(revision [0-9]\+)$,\1,' +} + +if [ -d $pecl ]; then + cd $pecl + git pull --rebase + cd .. +else + git clone $git +fi + +export GIT_DIR=$(pwd)/$pecl/.git +git diff $tag..master | filter > $out.tmp + +if cmp -s $out{,.tmp}; then + echo >&2 "No new diffs..." + rm -f $out.tmp + exit 0 +fi +mv -f $out{.tmp,} diff --git a/php-pecl-archive-php52.patch b/php-pecl-archive-php52.patch deleted file mode 100644 index 3b0ade2..0000000 --- a/php-pecl-archive-php52.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- archive.c~ 2005-04-28 00:30:52.000000000 +0200 -+++ archive.c 2006-12-26 18:51:55.000000000 +0100 -@@ -33,7 +33,7 @@ - #include "archive_clbk.h" - #include "php_archive_entry.h" - --#define archive_ce_Exception zend_exception_get_default() -+#define archive_ce_Exception zend_exception_get_default(TSRMLS_C) - - /* {{{ archive_functions[] - */ diff --git a/php-pecl-archive.spec b/php-pecl-archive.spec index 36fe53b..eb8253e 100644 --- a/php-pecl-archive.spec +++ b/php-pecl-archive.spec @@ -4,13 +4,13 @@ Summary: %{modname} - manipulate tar/cpio archives Summary(pl.UTF-8): %{modname} - obróbka archiwów tar/cpio Name: %{php_name}-pecl-%{modname} -Version: 0.2 -Release: 18 +Version: 0.3.1 +Release: 1 License: PHP 3.01 Group: Development/Languages/PHP -Source0: http://pecl.php.net/get/%{modname}-%{version}.tgz +Source0: http://pecl.php.net/get/%{modname}-0.2.tgz # Source0-md5: 1b121440b2c460b2a1af46e31f23e46e -Patch0: php-pecl-%{modname}-php52.patch +Patch100: branch.diff URL: http://pecl.php.net/package/archive/ BuildRequires: %{php_name}-devel >= 3:5.0.4 BuildRequires: libarchive-devel @@ -34,8 +34,8 @@ To rozszerzenie ma w PECL status: %{status}. %prep %setup -qc -mv %{modname}-%{version}/* . -%patch0 -p0 +mv %{modname}-*/* . +%patch100 -p1 %build phpize -- 2.44.0