cvs: php-src /ext/zip CREDITS TODO config.m4 config.w32 package.xml php_zip.c php_zip.h zip_stream.c /ext/zip/examples comment.php create.php dir.php
extract.php extractAll.php fopen.php get_set_comments.php im.php odt.php oldapi.php test.odt test.zip test1.zip test_im.zip test_with_comment.zip
too.php /ext/zip/lib mkstemp.c unistd.h zip.h zip.h.orig zip_add.c zip_delete.c zip_dirent.c zip_entry_free.c zip_entry_new.c zip_err_str.c
zip_error.c zip_error_get.c zip_error_get_sys_type.c zip_error_strerror.c zip_error_to_str.c zip_fclose.c zip_file_error_get.c zip_file_get_offset.c
zip_file_strerror.c zip_fopen.c zip_fopen_index.c zip_fread.c zip_free.c zip_get_archive_comment.c zip_get_file_comment.c zip_get_name.c
zip_get_num_files.c zip_memdup.c zip_name_locate.c zip_new.c zip_open.c zip_rename.c zip_replace.c zip_set_archive_comment.c zip_set_file_comment.c
zip_set_name.c zip_source_buffer.c zip_source_file.c zip_source_filep.c zip_source_free.c zip_source_functio! n.c zip_source_zip.c zip_stat.c
zip_stat_index.c zip_strerror.c zip_unchange.c zip_unchange_all.c zip_unchange_archive.c zip_unchange_data.c zip_win32.h zipint.h /ext/zip/tests
001.phpt binarynull.zip bug7214.phpt bug7658.odt bug7658.phpt bug7658.xml bug8009.phpt bug8009.zip oo_addfile.phpt oo_close.phpt oo_delete.phpt
oo_ext_zip.phpt oo_namelocate.phpt oo_open.phpt oo_rename.phpt test.zip test_procedural.zip utils.php zip_close.phpt zip_entry_compressedsize.phpt
zip_entry_compressionmethod.phpt zip_entry_filesize.phpt zip_entry_name.phpt zip_entry_open.phpt zip_entry_read.phpt zip_open.phpt zip_read.phpt

From: Date: Mon, 24 Jul 2006 16:58:59 +0000
Subject: cvs: php-src /ext/zip CREDITS TODO config.m4 config.w32 package.xml php_zip.c php_zip.h zip_stream.c /ext/zip/examples comment.php create.php dir.php
extract.php extractAll.php fopen.php get_set_comments.php im.php odt.php oldapi.php test.odt test.zip test1.zip test_im.zip test_with_comment.zip
too.php /ext/zip/lib mkstemp.c unistd.h zip.h zip.h.orig zip_add.c zip_delete.c zip_dirent.c zip_entry_free.c zip_entry_new.c zip_err_str.c
zip_error.c zip_error_get.c zip_error_get_sys_type.c zip_error_strerror.c zip_error_to_str.c zip_fclose.c zip_file_error_get.c zip_file_get_offset.c
zip_file_strerror.c zip_fopen.c zip_fopen_index.c zip_fread.c zip_free.c zip_get_archive_comment.c zip_get_file_comment.c zip_get_name.c
zip_get_num_files.c zip_memdup.c zip_name_locate.c zip_new.c zip_open.c zip_rename.c zip_replace.c zip_set_archive_comment.c zip_set_file_comment.c
zip_set_name.c zip_source_buffer.c zip_source_file.c zip_source_filep.c zip_source_free.c zip_source_functio! n.c zip_source_zip.c zip_stat.c
zip_stat_index.c zip_strerror.c zip_unchange.c zip_unchange_all.c zip_unchange_archive.c zip_unchange_data.c zip_win32.h zipint.h /ext/zip/tests
001.phpt binarynull.zip bug7214.phpt bug7658.odt bug7658.phpt bug7658.xml bug8009.phpt bug8009.zip oo_addfile.phpt oo_close.phpt oo_delete.phpt
oo_ext_zip.phpt oo_namelocate.phpt oo_open.phpt oo_rename.phpt test.zip test_procedural.zip utils.php zip_close.phpt zip_entry_compressedsize.phpt
zip_entry_compressionmethod.phpt zip_entry_filesize.phpt zip_entry_name.phpt zip_entry_open.phpt zip_entry_read.phpt zip_open.phpt zip_read.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-39488@lists.php.net to get a copy of this message
pajoye Mon Jul 24 16:58:59 2006 UTC Added files: /php-src/ext/zip TODO config.w32 package.xml php_zip.c zip_stream.c /php-src/ext/zip/examples comment.php create.php dir.php extract.php extractAll.php fopen.php get_set_comments.php im.php odt.php oldapi.php test.odt test.zip test1.zip test_im.zip test_with_comment.zip too.php /php-src/ext/zip/lib mkstemp.c unistd.h zip.h zip.h.orig zip_add.c zip_delete.c zip_dirent.c zip_entry_free.c zip_entry_new.c zip_err_str.c zip_error.c zip_error_get.c zip_error_get_sys_type.c zip_error_strerror.c zip_error_to_str.c zip_fclose.c zip_file_error_get.c zip_file_get_offset.c zip_file_strerror.c zip_fopen.c zip_fopen_index.c zip_fread.c zip_free.c zip_get_archive_comment.c zip_get_file_comment.c zip_get_name.c zip_get_num_files.c zip_memdup.c zip_name_locate.c zip_new.c zip_open.c zip_rename.c zip_replace.c zip_set_archive_comment.c zip_set_file_comment.c zip_set_name.c zip_source_buffer.c zip_source_file.c zip_source_filep.c zip_source_free.c zip_source_function.c zip_source_zip.c zip_stat.c zip_stat_index.c zip_strerror.c zip_unchange.c zip_unchange_all.c zip_unchange_archive.c zip_unchange_data.c zip_win32.h zipint.h /php-src/ext/zip/tests binarynull.zip bug7214.phpt bug7658.odt bug7658.phpt bug7658.xml bug8009.phpt bug8009.zip oo_addfile.phpt oo_close.phpt oo_delete.phpt oo_ext_zip.phpt oo_namelocate.phpt oo_open.phpt oo_rename.phpt test.zip test_procedural.zip utils.php zip_close.phpt zip_entry_compressedsize.phpt zip_entry_compressionmethod.phpt zip_entry_filesize.phpt zip_entry_name.phpt zip_entry_open.phpt zip_entry_read.phpt zip_open.phpt zip_read.phpt Modified files: /php-src/ext/zip CREDITS config.m4 php_zip.h /php-src/ext/zip/tests 001.phpt Log: - reimport (cannot symlink without replacing 4.4 and 5.0 versions)

http://cvs.php.net/viewvc.cgi/php-src/ext/zip/CREDITS?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/zip/CREDITS diff -u /dev/null php-src/ext/zip/CREDITS:1.3 --- /dev/null Mon Jul 24 16:58:58 2006 +++ php-src/ext/zip/CREDITS Mon Jul 24 16:58:58 2006 @@ -0,0 +1,2 @@ +Zip +Pierre-Alain Joye http://cvs.php.net/viewvc.cgi/php-src/ext/zip/config.m4?r1=1.7&r2=1.8&diff_format=u Index: php-src/ext/zip/config.m4 diff -u /dev/null php-src/ext/zip/config.m4:1.8 --- /dev/null Mon Jul 24 16:58:58 2006 +++ php-src/ext/zip/config.m4 Mon Jul 24 16:58:58 2006 @@ -0,0 +1,68 @@ +dnl +dnl $Id: config.m4,v 1.8 2006/07/24 16:58:58 pajoye Exp $ +dnl + +PHP_ARG_ENABLE(zip, for zip archive read/writesupport, +[ --enable-zip Include Zip read/write support.]) + +if test -z "$PHP_ZLIB_DIR"; then +PHP_ARG_WITH(zlib-dir, for the location of libz, +[ --with-zlib-dir[=DIR] zip: Set the path to libz install prefix.], no, no) +fi + +if test "$PHP_ZIP" != "no"; then + + if test "$PHP_ZLIB_DIR" != "no" && test "$PHP_ZLIB_DIR" != "yes"; then + if test -f "$PHP_ZLIB_DIR/include/zlib/zlib.h"; then + PHP_ZLIB_DIR="$PHP_ZLIB_DIR" + PHP_ZLIB_INCDIR="$PHP_ZLIB_DIR/include/zlib" + elif test -f "$PHP_ZLIB_DIR/include/zlib.h"; then + PHP_ZLIB_DIR="$PHP_ZLIB_DIR" + PHP_ZLIB_INCDIR="$PHP_ZLIB_DIR/include" + else + AC_MSG_ERROR([Can't find zlib headers under "$PHP_ZLIB_DIR"]) + fi + else + for i in /usr/local /usr; do + if test -f "$i/include/zlib/zlib.h"; then + PHP_ZLIB_DIR="$i" + PHP_ZLIB_INCDIR="$i/include/zlib" + elif test -f "$i/include/zlib.h"; then + PHP_ZLIB_DIR="$i" + PHP_ZLIB_INCDIR="$i/include" + fi + done + fi + + dnl # zlib + AC_MSG_CHECKING([for the location of zlib]) + if test "$PHP_ZLIB_DIR" = "no"; then + AC_MSG_ERROR([zip support requires ZLIB. Use --with-zlib-dir=<DIR> to specify prefix where ZLIB include and library are located]) + else + AC_MSG_RESULT([$PHP_ZLIB_DIR]) + PHP_ADD_LIBRARY_WITH_PATH(z, $PHP_ZLIB_DIR/lib, ZIP_SHARED_LIBADD) + PHP_ADD_INCLUDE($PHP_ZLIB_INCDIR) + fi + + PHP_ZIP_SOURCES="$PHP_ZIP_SOURCES lib/zip_add.c lib/zip_error.c lib/zip_fclose.c \ + lib/zip_fread.c lib/zip_open.c lib/zip_source_filep.c \ + lib/zip_strerror.c lib/zip_close.c lib/zip_error_get.c \ + lib/zip_file_error_get.c lib/zip_free.c lib/zip_rename.c \ + lib/zip_source_free.c lib/zip_unchange_all.c lib/zip_delete.c \ + lib/zip_error_get_sys_type.c lib/zip_file_get_offset.c \ + lib/zip_get_name.c lib/zip_replace.c lib/zip_source_function.c \ + lib/zip_unchange.c lib/zip_dirent.c lib/zip_error_strerror.c \ + lib/zip_file_strerror.c lib/zip_get_num_files.c \ + lib/zip_set_name.c lib/zip_source_zip.c lib/zip_unchange_data.c \ + lib/zip_entry_free.c lib/zip_error_to_str.c lib/zip_fopen.c \ + lib/zip_name_locate.c lib/zip_source_buffer.c lib/zip_stat.c \ + lib/zip_entry_new.c lib/zip_err_str.c lib/zip_fopen_index.c \ + lib/zip_new.c lib/zip_source_file.c lib/zip_stat_index.c lib/zip_get_archive_comment.c \ + lib/zip_get_file_comment.c lib/zip_set_archive_comment.c lib/zip_set_file_comment.c \ + lib/zip_unchange_archive.c lib/zip_memdup.c" + + AC_DEFINE(HAVE_ZIP,1,[ ]) + PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c $PHP_ZIP_SOURCES, $ext_shared) + PHP_ADD_BUILD_DIR($ext_builddir/lib, 1) + PHP_SUBST(ZIP_SHARED_LIBADD) +fi http://cvs.php.net/viewvc.cgi/php-src/ext/zip/php_zip.h?r1=1.9&r2=1.10&diff_format=u Index: php-src/ext/zip/php_zip.h diff -u /dev/null php-src/ext/zip/php_zip.h:1.10 --- /dev/null Mon Jul 24 16:58:58 2006 +++ php-src/ext/zip/php_zip.h Mon Jul 24 16:58:58 2006 @@ -0,0 +1,101 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2006 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Pierre-Alain Joye <pajoye@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id: php_zip.h,v 1.10 2006/07/24 16:58:58 pajoye Exp $ */ + +#ifndef PHP_ZIP_H +#define PHP_ZIP_H + +extern zend_module_entry zip_module_entry; +#define phpext_zip_ptr &zip_module_entry + +#ifdef PHP_WIN32 +#define PHP_ZIP_API __declspec(dllexport) +#else +#define PHP_ZIP_API +#endif + +#ifdef ZTS +#include "TSRM.h" +#endif + +#include "lib/zip.h" + +#ifndef ZEND_ENGINE_2_1 +# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) +# define ZEND_ENGINE_2_1 +# endif +#endif + +typedef struct _ze_zip_rsrc { + struct zip *za; + int index_current; + int num_files; +} zip_rsrc; + +typedef zip_rsrc * zip_rsrc_ptr; + +typedef struct _ze_zip_read_rsrc { + struct zip_file *zf; + struct zip_stat sb; +} zip_read_rsrc; + +#ifdef ZEND_ENGINE_2_1 +#define ZIPARCHIVE_ME(name, arg_info, flags) ZEND_FENTRY(name, c_ziparchive_ ##name, arg_info, flags) +#define ZIPARCHIVE_METHOD(name) ZEND_NAMED_FUNCTION(c_ziparchive_##name) + +/* Extends zend object */ +typedef struct _ze_zip_object { + zend_object zo; + struct zip *za; + int buffers_cnt; + char **buffers; + HashTable *prop_handler; + char *filename; + int filename_len; +} ze_zip_object; + +zend_class_entry *zip_class_entry_ce; + +php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_DC TSRMLS_DC); + +extern php_stream_wrapper php_stream_zip_wrapper; +#endif + +PHP_FUNCTION(zip_open); +PHP_FUNCTION(zip_read); +PHP_FUNCTION(zip_close); +PHP_FUNCTION(zip_entry_read); +PHP_FUNCTION(zip_entry_filesize); +PHP_FUNCTION(zip_entry_name); +PHP_FUNCTION(zip_entry_compressedsize); +PHP_FUNCTION(zip_entry_compressionmethod); +PHP_FUNCTION(zip_entry_open); +PHP_FUNCTION(zip_entry_close); + +#endif /* PHP_ZIP_H */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/001.phpt?r1=1.2&r2=1.3&diff_format=u Index: php-src/ext/zip/tests/001.phpt diff -u /dev/null php-src/ext/zip/tests/001.phpt:1.3 --- /dev/null Mon Jul 24 16:58:58 2006 +++ php-src/ext/zip/tests/001.phpt Mon Jul 24 16:58:58 2006 @@ -0,0 +1,12 @@ +--TEST-- +Check for zip presence +--SKIPIF-- +<?php if (!extension_loaded("zip")) print "skip"; ?> +--POST-- +--GET-- +--FILE-- +<?php +echo "zip extension is available"; +?> +--EXPECT-- +zip extension is available http://cvs.php.net/viewvc.cgi/php-src/ext/zip/config.w32?view=markup&rev=1.1 Index: php-src/ext/zip/config.w32 +++ php-src/ext/zip/config.w32 // $Id: config.w32,v 1.1 2006/07/24 16:58:58 pajoye Exp $ // vim:ft=javascript ARG_ENABLE("zip", "ZIP support", "no"); if (PHP_ZIP != "no") { if (CHECK_HEADER_ADD_INCLUDE("zlib.h", "CFLAGS_ZIP", "..\\zlib;" + php_usual_include_suspects + ";" + PHP_ZIP)) { if (PHP_ZLIB_SHARED) { CHECK_LIB("zlib.lib", "zip", PHP_ZIP); } EXTENSION('zip', 'php_zip.c zip_stream.c'); ADD_SOURCES(configure_module_dirname + "/lib", "zip_add.c zip_error.c zip_fclose.c \ zip_fread.c zip_open.c zip_source_filep.c \ zip_strerror.c zip_close.c zip_error_get.c \ zip_file_error_get.c zip_free.c zip_rename.c \ zip_source_free.c zip_unchange_all.c zip_delete.c \ zip_error_get_sys_type.c zip_file_get_offset.c \ zip_get_name.c zip_replace.c zip_source_function.c \ zip_unchange.c zip_dirent.c zip_error_strerror.c \ zip_file_strerror.c zip_get_num_files.c \ zip_set_name.c zip_source_zip.c zip_unchange_data.c \ zip_entry_free.c zip_error_to_str.c zip_fopen.c \ zip_name_locate.c zip_source_buffer.c zip_stat.c \ zip_entry_new.c zip_err_str.c zip_fopen_index.c \ zip_new.c zip_source_file.c zip_stat_index.c \ zip_get_archive_comment.c zip_get_file_comment.c \ zip_set_archive_comment.c zip_set_file_comment.c \ zip_unchange_archive.c zip_memdup.c", "zip"); AC_DEFINE('HAVE_ZLIB', 1); AC_DEFINE('HAVE_ZIP', 1); } else { WARNING("zip not enabled; libraries and headers not found"); } } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/package.xml?view=markup&rev=1.1 Index: php-src/ext/zip/package.xml +++ php-src/ext/zip/package.xml <?xml version="1.0" encoding="UTF-8"?> <package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.4.7" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd"> <name>zip</name> <channel>pecl.php.net</channel> <summary>A zip management extension</summary> <description>Zip is an extension to create, modify and read zip files.</description> <lead> <name>Pierre-Alain Joye</name> <user>pajoye</user> <email>pajoye@php.net</email> <active>yes</active> </lead> <date>2006-07-14</date> <version> <release>1.6.0</release> <api>1.6.0</api> </version> <stability> <release>beta</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- Rename Class Zip to ZipArchive, required to be bundled in php 5.2.0 (Zip being a ZipCode in US), making the role of this class more obvious *Gah* </notes> <contents> <dir name="/"> <file name="config.m4" role="src"/> <file name="config.w32" role="src"/> <file name="CREDITS" role="doc"/> <file name="php_zip.c" role="src"/> <file name="zip_stream.c" role="src"/> <file name="php_zip.h" role="src"/> <dir name="lib"> <file name="zip.h" role="src"/> <file name="zipint.h" role="src"/> <file name="zip_add.c" role="src"/> <file name="zip_close.c" role="src"/> <file name="zip_delete.c" role="src"/> <file name="zip_dirent.c" role="src"/> <file name="zip_entry_free.c" role="src"/> <file name="zip_entry_new.c" role="src"/> <file name="zip_error.c" role="src"/> <file name="zip_error_get.c" role="src"/> <file name="zip_error_get_sys_type.c" role="src"/> <file name="zip_error_strerror.c" role="src"/> <file name="zip_error_to_str.c" role="src"/> <file name="zip_err_str.c" role="src"/> <file name="zip_fclose.c" role="src"/> <file name="zip_file_error_get.c" role="src"/> <file name="zip_file_get_offset.c" role="src"/> <file name="zip_file_strerror.c" role="src"/> <file name="zip_fopen.c" role="src"/> <file name="zip_fopen_index.c" role="src"/> <file name="zip_fread.c" role="src"/> <file name="zip_free.c" role="src"/> <file name="zip_get_archive_comment.c" role="src"/> <file name="zip_get_file_comment.c" role="src"/> <file name="zip_get_name.c" role="src"/> <file name="zip_get_num_files.c" role="src"/> <file name="zip_memdup.c" role="src"/> <file name="zip_name_locate.c" role="src"/> <file name="zip_new.c" role="src"/> <file name="zip_open.c" role="src"/> <file name="zip_rename.c" role="src"/> <file name="zip_replace.c" role="src"/> <file name="zip_set_archive_comment.c" role="src"/> <file name="zip_set_file_comment.c" role="src"/> <file name="zip_set_name.c" role="src"/> <file name="zip_source_buffer.c" role="src"/> <file name="zip_source_file.c" role="src"/> <file name="zip_source_filep.c" role="src"/> <file name="zip_source_free.c" role="src"/> <file name="zip_source_function.c" role="src"/> <file name="zip_source_zip.c" role="src"/> <file name="zip_stat.c" role="src"/> <file name="zip_stat_index.c" role="src"/> <file name="zip_strerror.c" role="src"/> <file name="zip_unchange.c" role="src"/> <file name="zip_unchange_archive.c" role="src"/> <file name="zip_unchange_all.c" role="src"/> <file name="zip_unchange_data.c" role="src"/> <file name="zip_win32.h" role="src"/> </dir> <!-- /lib --> <dir name="examples"> <file name="odt.php" role="doc"/> <file name="test_with_comment.zip" role="doc"/> <file name="test.zip" role="doc"/> <file name="test1.zip" role="doc"/> <file name="oldapi.php" role="doc"/> <file name="create.php" role="doc"/> <file name="dir.php" role="doc"/> <file name="extract.php" role="doc"/> <file name="extractAll.php" role="doc"/> <file name="fopen.php" role="doc"/> <file name="too.php" role="doc"/> <file name="comment.php" role="doc"/> <file name="get_set_comments.php" role="doc"/> </dir> <!-- /examples --> <dir name="tests"> <file name="utils.php" role="test"/> <file name="001.phpt" role="test"/> <file name="oo_ext_zip.phpt" role="test"/> <file name="oo_open.phpt" role="test"/> <file name="oo_close.phpt" role="test"/> <file name="oo_addfile.phpt" role="test"/> <file name="oo_delete.phpt" role="test"/> <file name="oo_rename.phpt" role="test"/> <file name="test_procedural.zip" role="test"/> <file name="zip_close.phpt" role="test"/> <file name="zip_entry_compressedsize.phpt" role="test"/> <file name="zip_entry_compressionmethod.phpt" role="test"/> <file name="zip_entry_filesize.phpt" role="test"/> <file name="zip_entry_name.phpt" role="test"/> <file name="zip_entry_open.phpt" role="test"/> <file name="zip_entry_read.phpt" role="test"/> <file name="zip_open.phpt" role="test"/> <file name="zip_read.phpt" role="test"/> <file name="bug7214.phpt" role="test"/> <file name="bug7658.phpt" role="test"/> <file name="bug7658.odt" role="test"/> <file name="bug8009.phpt" role="test"/> <file name="bug8009.zip" role="test"/> <file name="binarynull.zip" role="test"/> </dir> <!-- /tests --> </dir> <!-- / --> </contents> <dependencies> <required> <php> <min>4.3.0</min> </php> <pearinstaller> <min>1.4.0</min> </pearinstaller> </required> </dependencies> <providesextension>zip</providesextension> <extsrcrelease/> <changelog> <release> <date>2006-07-14</date> <version> <release>1.5.0</release> <api>1.5.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- bring consistency to the method names: - rename zip::delete() to deleteIndex() - add zip::deleteName() - rename zip::statPath to zip::statName() - rename zip::rename to zip::renameIndex() - add zip::renameName(); - add zip::locateName(), returns the index of an entry, allows case insensitive or directory free lookup (ZIP::FL_NOCASE, ZIP::FL_NODIR) - add zip::unchangeName(), ::unchangeIndex(), unchangeAll() and unchangeArchive() revert changes to an entry, to all entries or the archive - add zip::getNameIndex(), get the name of the entry at the given position - Bug #7658, Modify zip archives causes corruption if the data descriptor is used (bit 3 of the general flags) - fix a bug when in the delete and rename methods when the index is lower than 1 - zip::addFile() must return true on success - zip::open() returns now the error code on error and true on success </notes> </release> <release> <date>2006-06-28</date> <version> <release>1.4.1</release> <api>1.4.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- Add missing files in the package release </notes> </release> <release> <date>2006-06-28</date> <version> <release>1.4.0</release> <api>1.4.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- Add write mode to the archive comment (zip::comment property) - Add zip::setCommentName and ::setCommentIndex, add or remove entrie comment - Add zip::getCommentName and ::getCommentIndex, get an entrie comment - Add zip::setArchiveComment - Full sync with zip-0.7.1 - #8009, modify archives on windows cannot be closed </notes> <release> <date>2006-04-26</date> <version> <release>1.3.1</release> <api>1.3.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- #7500, Fix build with php 5.1.0, 5.1.1 and 5.1.2</notes> </release> </release> <release> <date>2006-04-26</date> <version> <release>1.3.0</release> <api>1.3.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <notes>- Fix possible leak with __set/__get in classes extending the Zip intern object (tony2001[at]php.net) - Added getFromName(), return the contents of an entry using its name - Added getFromIndex(), return the contents of an entry using its index</notes> </release> <release> <date>2006-03-30</date> <version> <release>1.2.3</release> <api>1.2.1</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- #7214, use binary safe string as return value, 0x00 was considered as the end of the content, affected only the procedural API</notes> </release> <release> <date>2006-03-22</date> <time>21:15:00</time> <version> <release>1.2.2</release> <api>1.2.1</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- fix a bug in internal zip_close, new archives were not written - ::open returns now false on error - update the "create.php" example, status and returned codes are now checked - fix a leak when the ::open method is called twice or more with the same object</notes> </release> <release> <date>2006-03-19</date> <time>00:23:32</time> <version> <release>1.2.1</release> <api>1.2.1</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- fixed a possible build problem (mkstemp missing) - fix a bug where extending the Zip class does allow to write to a property, see php bugs #36743 (array)</notes> </release> <release> <date>2006-03-12</date> <time>00:23:32</time> <version> <release>1.2.0</release> <api>1.2.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- enable stream by default, * use uri like zip:///path/to/my.zip#entryname.dat (the URI format may change in future version) - add support for print_r/var_dump (Zip object) - add tests for the OO (still need more) - add more example, like using xmlreader and zip stream to parse OpenDocument meta info </notes> </release> <release> <date>2006-03-05</date> <time>00:14:59</time> <version> <release>1.1.2</release> <api>1.1.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- do not create empty file when a zip entry is only a directory (empty or not) </notes> </release> <release> <date>2006-03-02</date> <time>00:14:59</time> <version> <release>1.1.1</release> <api>1.1.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- Fix PHP 5.1 detection at compiletie - fix possible build errors with gcc other than 4.0.x - add better zlib detection - "--with-zlib-dir=[DIR]" added </notes> </release> <release> <date>2006-03-01</date> <time>00:14:59</time> <version> <release>1.1.0</release> <api>1.1.0</api> </version> <stability> <release>alpha</release> <api>alpha</api> </stability> <license uri="http://www.php.net/license">PHP License</license> <notes>- replace the old zip extensions * 100% compatible with the old API * added zip creation support (write mode) * added OO interface * Stream support, getStream method returns a file handler - bundled libzip and drop zzlib usage (see http://www.nih.at/libzip/) </notes> </release> </changelog> </package> http://cvs.php.net/viewvc.cgi/php-src/ext/zip/php_zip.c?view=markup&rev=1.1 Index: php-src/ext/zip/php_zip.c +++ php-src/ext/zip/php_zip.c /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2006 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Piere-Alain Joye <pierre@php.net | +----------------------------------------------------------------------+ */ /* $Id: php_zip.c,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "ext/standard/file.h" #include "ext/standard/php_string.h" #include "php_zip.h" #include "lib/zip.h" #include "lib/zipint.h" /* {{{ Resource le */ static int le_zip_dir; #define le_zip_dir_name "Zip Directory" static int le_zip_entry; #define le_zip_entry_name "Zip Entry" /* }}} */ /* {{{ SAFEMODE_CHECKFILE(filename) */ #define SAFEMODE_CHECKFILE(filename) \ (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(filename TSRMLS_CC) /* }}} */ /* {{{ PHP_ZIP_STAT_INDEX(za, index, flags, sb) */ #define PHP_ZIP_STAT_INDEX(za, index, flags, sb) \ if (zip_stat_index(za, index, flags, &sb) != 0) { \ RETURN_FALSE; \ } /* }}} */ /* {{{ PHP_ZIP_STAT_PATH(za, path, path_len, flags, sb) */ #define PHP_ZIP_STAT_PATH(za, path, path_len, flags, sb) \ if (path_len < 1) { \ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as entry name"); \ RETURN_FALSE; \ } \ if (zip_stat(za, path, flags, &sb)) { \ RETURN_FALSE; \ } /* }}} */ /* {{{ PHP_ZIP_SET_FILE_COMMENT(za, index, comment, comment_len) */ #define PHP_ZIP_SET_FILE_COMMENT(za, index, comment, comment_len) \ if (comment_len == 0) { \ /* Passing NULL remove the existing comment */ \ if (zip_set_file_comment(intern, index, NULL, 0) < 0) { \ RETURN_FALSE; \ } \ } else if (zip_set_file_comment(intern, index, comment, comment_len) < 0) { \ RETURN_FALSE; \ } /* }}} */ #ifdef ZEND_ENGINE_2_1 /* {{{ php_zip_extract_file */ /* TODO: Simplify it */ static int php_zip_extract_file(struct zip * za, char *dest, char *file TSRMLS_DC) { php_stream_statbuf ssb; struct zip_file *zf; struct zip_stat sb; char b[8192]; int n, len, ret, file_len; php_stream *stream; char *fullpath; char *file_dirname_fullpath; char file_dirname[MAXPATHLEN + 1]; size_t dir_len; char *file_basename; size_t file_basename_len; if (zip_stat(za, file, 0, &sb)) { return 0; } file_len = strlen(file); memcpy(file_dirname, file, file_len); dir_len = php_dirname(file_dirname, file_len); if (dir_len > 0) { len = spprintf(&file_dirname_fullpath, 0, "%s/%s", dest, file_dirname); } else { len = spprintf(&file_dirname_fullpath, 0, "%s", dest); } php_basename(file, file_len, NULL, 0, &file_basename, &file_basename_len TSRMLS_CC); SAFEMODE_CHECKFILE(file_dirname_fullpath); /* let see if the path already exists */ if (php_stream_stat_path(file_dirname_fullpath, &ssb) < 0) { ret = php_stream_mkdir(file_dirname_fullpath, 0777, PHP_STREAM_MKDIR_RECURSIVE, NULL); if (!ret) { efree(file_dirname_fullpath); efree(file_basename); return 0; } } /* it is a standalone directory, job done */ if (file[file_len - 1] == '/') { efree(file_dirname_fullpath); efree(file_basename); return 1; } len = spprintf(&fullpath, 0, "%s/%s/%s", dest, file_dirname, file_basename); if (!len) { efree(file_dirname_fullpath); efree(file_basename); return 0; } /* check again the full path, not sure if it * is required, does a file can have a different * safemode status as its parent folder? */ SAFEMODE_CHECKFILE(fullpath); zf = zip_fopen(za, file, 0); if (zf == NULL) { efree(fullpath); efree(file_dirname_fullpath); efree(file_basename); return 0; } stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); n = 0; if (stream) { while ((n=zip_fread(zf, b, sizeof(b))) > 0) php_stream_write(stream, b, n); php_stream_close(stream); } n = zip_fclose(zf); efree(fullpath); efree(file_basename); efree(file_dirname_fullpath); if (n<0) { return 0; } else { return 1; } } /* }}} */ /* {{{ REGISTER_ZIP_CLASS_CONST_LONG */ #define REGISTER_ZIP_CLASS_CONST_LONG(const_name, value) \ zend_declare_class_constant_long(zip_class_entry, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC); /* }}} */ /* {{{ ZIP_FROM_OBJECT */ #define ZIP_FROM_OBJECT(intern, object) \ { \ ze_zip_object *obj = (ze_zip_object*) zend_object_store_get_object(object TSRMLS_CC); \ intern = obj->za; \ if (!intern) { \ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized Zip object"); \ RETURN_FALSE; \ } \ } /* }}} */ /* {{{ RETURN_SB(sb) */ #define RETURN_SB(sb) \ { \ array_init(return_value); \ add_assoc_string(return_value, "name", estrdup((sb)->name), 0); \ add_assoc_long(return_value, "index", (long) (sb)->index); \ add_assoc_long(return_value, "crc", (long) (sb)->crc); \ add_assoc_long(return_value, "size", (long) (sb)->size); \ add_assoc_long(return_value, "mtime", (long) (sb)->mtime); \ add_assoc_long(return_value, "comp_size", (long) (sb)->comp_size); \ add_assoc_long(return_value, "comp_method", (long) (sb)->comp_method); \ } /* }}} */ static int php_zip_status(struct zip *za TSRMLS_DC) /* {{{ */ { int zep, syp; zip_error_get(za, &zep, &syp); return zep; } /* }}} */ static int php_zip_status_sys(struct zip *za TSRMLS_DC) /* {{{ */ { int zep, syp; zip_error_get(za, &zep, &syp); return syp; } /* }}} */ static int php_zip_get_num_files(struct zip *za TSRMLS_DC) /* {{{ */ { return zip_get_num_files(za); } /* }}} */ static char * php_zipobj_get_filename(ze_zip_object *obj TSRMLS_DC) /* {{{ */ { if (!obj) { return NULL; } if (obj->filename) { return obj->filename; } return NULL; } /* }}} */ static char * php_zipobj_get_zip_comment(struct zip *za, int *len TSRMLS_DC) /* {{{ */ { if (za) { return (char *)zip_get_archive_comment(za, len, 0); } return NULL; } /* }}} */ #endif /* {{{ zend_function_entry */ static zend_function_entry zip_functions[] = { PHP_FE(zip_open, NULL) PHP_FE(zip_close, NULL) PHP_FE(zip_read, NULL) PHP_FE(zip_entry_open, NULL) PHP_FE(zip_entry_close, NULL) PHP_FE(zip_entry_read, NULL) PHP_FE(zip_entry_filesize, NULL) PHP_FE(zip_entry_name, NULL) PHP_FE(zip_entry_compressedsize, NULL) PHP_FE(zip_entry_compressionmethod, NULL) {NULL, NULL, NULL} }; /* }}} */ /* {{{ ZE2 OO definitions */ #ifdef ZEND_ENGINE_2_1 zend_class_entry *zip_class_entry; static zend_object_handlers zip_object_handlers; static HashTable zip_prop_handlers; typedef int (*zip_read_int_t)(struct zip *za TSRMLS_DC); typedef char *(*zip_read_const_char_t)(struct zip *za, int *len TSRMLS_DC); typedef char *(*zip_read_const_char_from_ze_t)(ze_zip_object *obj TSRMLS_DC); typedef struct _zip_prop_handler { zip_read_int_t read_int_func; zip_read_const_char_t read_const_char_func; zip_read_const_char_from_ze_t read_const_char_from_obj_func; int type; } zip_prop_handler; #endif /* }}} */ #ifdef ZEND_ENGINE_2_1 static void php_zip_register_prop_handler(HashTable *prop_handler, char *name, zip_read_int_t read_int_func, zip_read_const_char_t read_char_func, zip_read_const_char_from_ze_t read_char_from_obj_func, int rettype TSRMLS_DC) /* {{{ */ { zip_prop_handler hnd; hnd.read_const_char_func = read_char_func; hnd.read_int_func = read_int_func; hnd.read_const_char_from_obj_func = read_char_from_obj_func; hnd.type = rettype; zend_hash_add(prop_handler, name, strlen(name)+1, &hnd, sizeof(zip_prop_handler), NULL); } /* }}} */ static int php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd, zval **retval, int newzval TSRMLS_DC) /* {{{ */ { const char *retchar = NULL; int retint = 0; int len = 0; if (obj && obj->za != NULL) { if (hnd->read_const_char_func) { retchar = hnd->read_const_char_func(obj->za, &len TSRMLS_CC); } else { if (hnd->read_int_func) { retint = hnd->read_int_func(obj->za TSRMLS_CC); if (retint == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Internal zip error returned"); return FAILURE; } } else { if (hnd->read_const_char_from_obj_func) { retchar = hnd->read_const_char_from_obj_func(obj TSRMLS_CC); } } } } if (newzval) { ALLOC_ZVAL(*retval); } switch (hnd->type) { case IS_STRING: if (retchar) { ZVAL_STRINGL(*retval, (char *) retchar, len, 1); } else { ZVAL_EMPTY_STRING(*retval); } break; case IS_BOOL: ZVAL_BOOL(*retval, (long)retint); break; case IS_LONG: ZVAL_LONG(*retval, (long)retint); break; default: ZVAL_NULL(*retval); } return SUCCESS; } /* }}} */ zval **php_zip_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; zval **retval = NULL; zip_prop_handler *hnd; zend_object_handlers *std_hnd; int ret; if (member->type != IS_STRING) { tmp_member = *member; zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); } if (ret == FAILURE) { std_hnd = zend_get_std_object_handlers(); retval = std_hnd->get_property_ptr_ptr(object, member TSRMLS_CC); } if (member == &tmp_member) { zval_dtor(member); } return retval; } /* }}} */ zval* php_zip_read_property(zval *object, zval *member, int type TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; zval *retval; zip_prop_handler *hnd; zend_object_handlers *std_hnd; int ret; if (member->type != IS_STRING) { tmp_member = *member; zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); } if (ret == SUCCESS) { ret = php_zip_property_reader(obj, hnd, &retval, 1 TSRMLS_CC); if (ret == SUCCESS) { /* ensure we're creating a temporary variable */ retval->refcount = 0; } else { retval = EG(uninitialized_zval_ptr); } } else { std_hnd = zend_get_std_object_handlers(); retval = std_hnd->read_property(object, member, type TSRMLS_CC); } if (member == &tmp_member) { zval_dtor(member); } return retval; } /* }}} */ static HashTable *php_zip_get_properties(zval *object TSRMLS_DC)/* {{{ */ { ze_zip_object *obj; zip_prop_handler *hnd; HashTable *props; zval *val; int ret; char *key; uint key_len; HashPosition pos; ulong num_key; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); props = obj->zo.properties; if (obj->prop_handler == NULL) { return NULL; } zend_hash_internal_pointer_reset_ex(obj->prop_handler, &pos); while (zend_hash_get_current_data_ex(obj->prop_handler, (void**)&hnd, &pos) == SUCCESS) { zend_hash_get_current_key_ex(obj->prop_handler, &key, &key_len, &num_key, 0, &pos); MAKE_STD_ZVAL(val); ret = php_zip_property_reader(obj, hnd, &val, 0 TSRMLS_CC); if (ret != SUCCESS) { val = EG(uninitialized_zval_ptr); } zend_hash_update(props, key, key_len, (void *)&val, sizeof(zval *), NULL); zend_hash_move_forward_ex(obj->prop_handler, &pos); } return obj->zo.properties; } /* }}} */ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */ { ze_zip_object * intern = (ze_zip_object *) object; int i; if (!intern) { return; } if (intern->za) { zip_close(intern->za); intern->za = NULL; } if (intern->buffers_cnt>0) { for (i=0; i<intern->buffers_cnt; i++) { efree(intern->buffers[i]); } efree(intern->buffers); } intern->za = NULL; #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1 && PHP_RELEASE_VERSION > 2) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) zend_object_std_dtor(&intern->zo TSRMLS_CC); #else if (intern->zo.guards) { zend_hash_destroy(intern->zo.guards); FREE_HASHTABLE(intern->zo.guards); } if (intern->zo.properties) { zend_hash_destroy(intern->zo.properties); FREE_HASHTABLE(intern->zo.properties); } #endif if (intern->filename) { efree(intern->filename); } efree(intern); } /* }}} */ PHP_ZIP_API zend_object_value php_zip_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ { ze_zip_object *intern; zval *tmp; zend_object_value retval; intern = emalloc(sizeof(ze_zip_object)); memset(&intern->zo, 0, sizeof(zend_object)); intern->zo.ce = class_type; intern->za = NULL; intern->buffers = NULL; intern->filename = NULL; intern->buffers_cnt = 0; intern->prop_handler = &zip_prop_handlers; ALLOC_HASHTABLE(intern->zo.properties); zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_zip_object_free_storage, NULL TSRMLS_CC); retval.handlers = (zend_object_handlers *) & zip_object_handlers; return retval; } /* }}} */ #endif /* {{{ Resource dtors */ /* {{{ php_zip_free_dir */ static void php_zip_free_dir(zend_rsrc_list_entry *rsrc TSRMLS_DC) { zip_rsrc * zip_int = (zip_rsrc *) rsrc->ptr; if (zip_int) { if (zip_int->za) { zip_close(zip_int->za); } efree(rsrc->ptr); rsrc->ptr = NULL; } } /* }}} */ /* {{{ php_zip_free_entry */ static void php_zip_free_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC) { zip_read_rsrc *zr_rsrc = (zip_read_rsrc *) rsrc->ptr; efree(zr_rsrc); rsrc->ptr = NULL; } /* }}} */ /* }}}*/ /* {{{ function prototypes */ PHP_MINIT_FUNCTION(zip); PHP_MSHUTDOWN_FUNCTION(zip); PHP_MINFO_FUNCTION(zip); /* }}} */ /* {{{ zip_module_entry */ zend_module_entry zip_module_entry = { STANDARD_MODULE_HEADER, "zip", zip_functions, PHP_MINIT(zip), PHP_MSHUTDOWN(zip), NULL, NULL, PHP_MINFO(zip), "1.4.0", STANDARD_MODULE_PROPERTIES }; /* }}} */ #ifdef COMPILE_DL_ZIP ZEND_GET_MODULE(zip) #endif /* {{{ proto resource zip_open(string filename [,flags]) Create new zip using source uri for output */ PHP_FUNCTION(zip_open) { char *filename; int filename_len; zip_rsrc *rsrc_int; long mode = 0; int err = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &filename, &filename_len, &mode) == FAILURE) { return; } if (SAFEMODE_CHECKFILE(filename)) { RETURN_FALSE; } rsrc_int = (zip_rsrc *)emalloc(sizeof(zip_rsrc)); rsrc_int->za = zip_open(filename, mode, &err); if (rsrc_int->za == NULL) { efree(rsrc_int); RETURN_LONG((long)err); } rsrc_int->index_current = 0; rsrc_int->num_files = zip_get_num_files(rsrc_int->za); ZEND_REGISTER_RESOURCE(return_value, rsrc_int, le_zip_dir); } /* }}} */ /* {{{ proto void zip_close(resource zip) Close a Zip archive */ PHP_FUNCTION(zip_close) { zval * zip; zip_rsrc *z_rsrc = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip) == FAILURE) { return; } ZEND_FETCH_RESOURCE(z_rsrc, zip_rsrc *, &zip, -1, le_zip_dir_name, le_zip_dir); /* really close the zip will break BC :-D */ zend_list_delete(Z_LVAL_P(zip)); } /* }}} */ /* {{{ proto resource zip_read(resource zip [, int flags]) Returns the next file in the archive */ PHP_FUNCTION(zip_read) { zval *zip_dp; zip_read_rsrc *zr_rsrc; int ret; long flags = 0; zip_rsrc *rsrc_int; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zip_dp, flags) == FAILURE) { return; } ZEND_FETCH_RESOURCE(rsrc_int, zip_rsrc *, &zip_dp, -1, le_zip_dir_name, le_zip_dir); if (rsrc_int && rsrc_int->za) { if (rsrc_int->index_current >= rsrc_int->num_files) { RETURN_FALSE; } zr_rsrc = emalloc(sizeof(zip_read_rsrc)); ret = zip_stat_index(rsrc_int->za, rsrc_int->index_current, flags, &zr_rsrc->sb); if (ret != 0) { efree(zr_rsrc); RETURN_LONG((long)ret); } zr_rsrc->zf = zip_fopen_index(rsrc_int->za, rsrc_int->index_current, 0); if (zr_rsrc->zf) { rsrc_int->index_current++; ZEND_REGISTER_RESOURCE(return_value, zr_rsrc, le_zip_entry); } else { RETURN_FALSE; } } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto bool zip_entry_open(resource zip_dp, resource zip_entry [, string mode]) Open a Zip File, pointed by the resource entry */ /* Dummy function to follow the old API */ PHP_FUNCTION(zip_entry_open) { zval * zip; zval * zip_entry; char *mode; int mode_len; zip_read_rsrc * zr_rsrc; zip_rsrc *z_rsrc; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|s", &zip, &zip_entry, &mode, &mode_len) == FAILURE) { return; } ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry); ZEND_FETCH_RESOURCE(z_rsrc, zip_rsrc *, &zip, -1, le_zip_dir_name, le_zip_dir); if (zr_rsrc->zf != NULL) { RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto void zip_entry_close(resource zip_ent) Close a zip entry */ /* another dummy function to fit in the old api*/ PHP_FUNCTION(zip_entry_close) { zval * zip_entry; zip_read_rsrc * zr_rsrc; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip_entry) == FAILURE) { return; } ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry); /* we got a zip_entry resource, be happy */ RETURN_TRUE; } /* }}} */ /* {{{ proto mixed zip_entry_read(resource zip_entry [, int len [, int mode]]) Read from an open directory entry */ PHP_FUNCTION(zip_entry_read) { zval * zip_entry; long len = 0, mode = 0; zip_read_rsrc * zr_rsrc; char *buffer; int n = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &zip_entry, &len, &mode) == FAILURE) { return; } ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry); if (len <= 0) { len = 1024; } if (zr_rsrc->zf) { buffer = safe_emalloc(len, 1, 1); n = zip_fread(zr_rsrc->zf, buffer, len); if (n > 0) { buffer[n] = 0; RETURN_STRINGL(buffer, n, 0); } else { RETURN_EMPTY_STRING() } } else { RETURN_FALSE; } } /* }}} */ static void php_zip_entry_get_info(INTERNAL_FUNCTION_PARAMETERS, int opt) /* {{{ */ { zval * zip_entry; zip_read_rsrc * zr_rsrc; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip_entry) == FAILURE) { return; } ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry); if (!zr_rsrc->zf) { RETURN_FALSE; } switch (opt) { case 0: RETURN_STRING((char *)zr_rsrc->sb.name, 1); break; case 1: RETURN_LONG((long) (zr_rsrc->sb.comp_size)); break; case 2: RETURN_LONG((long) (zr_rsrc->sb.size)); break; case 3: switch (zr_rsrc->sb.comp_method) { case 0: RETURN_STRING("stored", 1); break; case 1: RETURN_STRING("shrunk", 1); break; case 2: case 3: case 4: case 5: RETURN_STRING("reduced", 1); break; case 6: RETURN_STRING("imploded", 1); break; case 7: RETURN_STRING("tokenized", 1); break; case 8: RETURN_STRING("deflated", 1); break; case 9: RETURN_STRING("deflatedX", 1); break; case 10: RETURN_STRING("implodedX", 1); break; default: RETURN_FALSE; } RETURN_LONG((long) (zr_rsrc->sb.comp_method)); break; } } /* }}} */ /* {{{ proto string zip_entry_name(resource zip_entry) Return the name given a ZZip entry */ PHP_FUNCTION(zip_entry_name) { php_zip_entry_get_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); } /* }}} */ /* {{{ proto int zip_entry_compressedsize(resource zip_entry) Return the compressed size of a ZZip entry */ PHP_FUNCTION(zip_entry_compressedsize) { php_zip_entry_get_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); } /* }}} */ /* {{{ proto int zip_entry_filesize(resource zip_entry) Return the actual filesize of a ZZip entry */ PHP_FUNCTION(zip_entry_filesize) { php_zip_entry_get_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2); } /* }}} */ /* {{{ proto string zip_entry_compressionmethod(resource zip_entry) Return a string containing the compression method used on a particular entry */ PHP_FUNCTION(zip_entry_compressionmethod) { php_zip_entry_get_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3); } /* }}} */ #ifdef ZEND_ENGINE_2_1 /* {{{ proto mixed open(string source [, int flags]) Create new zip using source uri for output, return TRUE on success or the error code */ ZIPARCHIVE_METHOD(open) { struct zip *intern; char *filename; int filename_len; int err = 0; long flags = 0; zval *this = getThis(); ze_zip_object *ze_obj = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &filename, &filename_len, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } if (this) { /* We do not use ZIP_FROM_OBJECT, zip init function here */ ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC); } if (filename_len == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source"); RETURN_FALSE; } if (ze_obj->za) { /* we already have an opened zip, free it */ zip_close(ze_obj->za); } if (ze_obj->filename) { efree(ze_obj->filename); } intern = zip_open(filename, flags, &err); if (!intern || err) { RETURN_LONG((long)err); } ze_obj->filename = estrndup(filename, filename_len); ze_obj->filename_len = filename_len; ze_obj->za = intern; RETURN_TRUE; } /* }}} */ /* {{{ proto resource close() close the zip archive */ ZIPARCHIVE_METHOD(close) { struct zip *intern; zval *this = getThis(); ze_zip_object *ze_obj; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC); if (zip_close(intern)) { RETURN_FALSE; } efree(ze_obj->filename); ze_obj->filename = NULL; ze_obj->filename_len = 0; ze_obj->za = NULL; RETURN_TRUE; } /* }}} */ /* {{{ proto bool addFile(string filepath[, string entryname[, int start [, int length]]]) Add a file in a Zip archive using its path and the name to use. */ ZIPARCHIVE_METHOD(addFile) { struct zip *intern; zval *this = getThis(); char *filename; int filename_len; char *entry_name = NULL; int entry_name_len = 0; struct zip_source *zs; long offset_start = 0, offset_len = 0; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sll", &filename, &filename_len, &entry_name, &entry_name_len, &offset_start, &offset_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (filename_len == 0) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as filename"); RETURN_FALSE; } if (entry_name_len == 0) { entry_name = filename; entry_name_len = filename_len; } if (SAFEMODE_CHECKFILE(filename)) { RETURN_FALSE; } zs = zip_source_file(intern, filename, 0, 0); if (!zs) { RETURN_FALSE; } if (zip_add(intern, entry_name, zs) < 0) { RETURN_FALSE; } else { RETURN_TRUE; } } /* }}} */ /* {{{ proto resource addFromString(string name, string content) Add a file using content and the entry name */ ZIPARCHIVE_METHOD(addFromString) { struct zip *intern; zval *this = getThis(); char *buffer, *name; int buffer_len, name_len; ze_zip_object *ze_obj; struct zip_source *zs; int pos = 0; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &buffer, &buffer_len) == FAILURE) { WRONG_PARAM_COUNT; return; } ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC); if (ze_obj->buffers_cnt) { ze_obj->buffers = (char **)erealloc(ze_obj->buffers, sizeof(char *) * (ze_obj->buffers_cnt+1)); pos = ze_obj->buffers_cnt++; } else { ze_obj->buffers = (char **)emalloc(sizeof(char *)); ze_obj->buffers_cnt++; pos = 0; } ze_obj->buffers[pos] = (char *)emalloc(buffer_len); memcpy(ze_obj->buffers[pos], buffer, buffer_len); zs = zip_source_buffer(intern, ze_obj->buffers[pos], buffer_len, 0); if (zs == NULL) { RETURN_FALSE; } if (zip_add(intern, name, zs) == -1) { RETURN_FALSE; } } /* }}} */ /* {{{ proto resource statName(string filename[, int flags]) Returns the information about a the zip entry filename */ ZIPARCHIVE_METHOD(statName) { struct zip *intern; zval *this = getThis(); char *name; int name_len; long flags = 0; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &name, &name_len, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_PATH(intern, name, name_len, flags, sb); RETURN_SB(&sb); } /* }}} */ /* {{{ proto resource statIndex(int index[, int flags]) Returns the zip entry informations using its index */ ZIPARCHIVE_METHOD(statIndex) { struct zip *intern; zval *this = getThis(); long index, flags = 0; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &index, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } if (zip_stat_index(intern, index, flags, &sb) != 0) { RETURN_FALSE; } RETURN_SB(&sb); } /* }}} */ /* {{{ proto resource locateName(string filename[, int flags]) Returns the index of the entry named filename in the archive */ ZIPARCHIVE_METHOD(locateName) { struct zip *intern; zval *this = getThis(); char *name; int name_len; long flags = 0; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &name, &name_len, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } if (name_len<1) { RETURN_FALSE; } RETURN_LONG((long)zip_name_locate(intern, (const char *)name, flags)) } /* }}} */ /* {{{ proto resource getNameIndex(int index [, int flags]) Returns the name of the file at position index */ ZIPARCHIVE_METHOD(getNameIndex) { struct zip *intern; zval *this = getThis(); const char *name; long flags = 0, index = 0; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &index, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } name = zip_get_name(intern, (int) index, flags); if (name) { RETVAL_STRING((char *)name, 1); } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto resource setArchiveComment(string name, string comment) Set or remove (NULL/'') the comment of the archive */ ZIPARCHIVE_METHOD(setArchiveComment) { struct zip *intern; zval *this = getThis(); long comment_len = 0; char * comment; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &comment, &comment_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (zip_set_archive_comment(intern, (const char *)comment, (int)comment_len)) { RETURN_FALSE; } else { RETURN_TRUE; } } /* }}} */ /* {{{ proto resource getArchiveComment() Returns the comment of an entry using its index */ ZIPARCHIVE_METHOD(getArchiveComment) { struct zip *intern; zval *this = getThis(); long flags = 0; const char * comment; int comment_len = 0; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } comment = zip_get_archive_comment(intern, &comment_len, (int)flags); RETURN_STRINGL((char *)comment, (long)comment_len, 1); } /* }}} */ /* {{{ proto resource setCommentName(string name, string comment) Set or remove (NULL/'') the comment of an entry using its Name */ ZIPARCHIVE_METHOD(setCommentName) { struct zip *intern; zval *this = getThis(); long comment_len = 0, name_len = 0; char * comment, *name; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &comment, &comment_len) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_PATH(intern, name, name_len, 0, sb); PHP_ZIP_SET_FILE_COMMENT(intern, sb.index, comment, comment_len); } /* }}} */ /* {{{ proto resource setCommentIndex(int index, string comment) Set or remove (NULL/'') the comment of an entry using its index */ ZIPARCHIVE_METHOD(setCommentIndex) { struct zip *intern; zval *this = getThis(); long index, comment_len = 0; char * comment; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &index, &comment, &comment_len) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_INDEX(intern, index, 0, sb); PHP_ZIP_SET_FILE_COMMENT(intern, index, comment, comment_len); } /* }}} */ /* {{{ proto resource getCommentName(string name) Returns the comment of an entry using its name */ ZIPARCHIVE_METHOD(getCommentName) { struct zip *intern; zval *this = getThis(); long name_len = 0, flags = 0; int comment_len = 0; const char * comment; char *name; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &name, &name_len, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_PATH(intern, name, name_len, 0, sb); comment = zip_get_file_comment(intern, sb.index, &comment_len, (int)flags); RETURN_STRINGL((char *)comment, (long)comment_len, 1); } /* }}} */ /* {{{ proto resource getCommentIndex(int index) Returns the comment of an entry using its index */ ZIPARCHIVE_METHOD(getCommentIndex) { struct zip *intern; zval *this = getThis(); long index, flags = 0; const char * comment; int comment_len = 0; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &index, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_INDEX(intern, index, 0, sb); comment = zip_get_file_comment(intern, index, &comment_len, (int)flags); RETURN_STRINGL((char *)comment, (long)comment_len, 1); } /* }}} */ /* {{{ proto resource deleteIndex(int index) Delete a file using its index */ ZIPARCHIVE_METHOD(deleteIndex) { struct zip *intern; zval *this = getThis(); long index; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) { WRONG_PARAM_COUNT; return; } if (index < 0) { RETURN_FALSE; } if (zip_delete(intern, index) < 0) { RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto resource deleteName(string name) Delete a file using its index */ ZIPARCHIVE_METHOD(deleteName) { struct zip *intern; zval *this = getThis(); long name_len = 0; char *name; struct zip_stat sb; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (name_len < 1) { RETURN_FALSE; } PHP_ZIP_STAT_PATH(intern, name, name_len, 0, sb); if (zip_delete(intern, sb.index)) { RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto resource renameIndex(int index, string new_name) Rename an entry selected by its index to new_name */ ZIPARCHIVE_METHOD(renameIndex) { struct zip *intern; zval *this = getThis(); char *new_name; int new_name_len; long index; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &index, &new_name, &new_name_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (index < 0) { RETURN_FALSE; } if (new_name_len < 1) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as new entry name"); RETURN_FALSE; } if (zip_rename(intern, index, (const char *)new_name) != 0) { RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto resource renameName(string name, string new_name) Rename an entry selected by its name to new_name */ ZIPARCHIVE_METHOD(renameName) { struct zip *intern; zval *this = getThis(); struct zip_stat sb; char *name, *new_name; int name_len, new_name_len; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &new_name, &new_name_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (new_name_len < 1) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as new entry name"); RETURN_FALSE; } PHP_ZIP_STAT_PATH(intern, name, name_len, 0, sb); if (zip_rename(intern, sb.index, (const char *)new_name)) { RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto resource unchangeIndex(int index) Changes to the file at position index are reverted */ ZIPARCHIVE_METHOD(unchangeIndex) { struct zip *intern; zval *this = getThis(); long index; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) { WRONG_PARAM_COUNT; return; } if (index < 0) { RETURN_FALSE; } if (zip_unchange(intern, index) != 0) { RETURN_FALSE; } else { RETURN_TRUE; } } /* }}} */ /* {{{ proto resource unchangeName(string name) Changes to the file named 'name' are reverted */ ZIPARCHIVE_METHOD(unchangeName) { struct zip *intern; zval *this = getThis(); struct zip_stat sb; char *name; int name_len; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (name_len < 1) { RETURN_FALSE; } PHP_ZIP_STAT_PATH(intern, name, name_len, 0, sb); if (zip_unchange(intern, sb.index) != 0) { RETURN_FALSE; } else { RETURN_TRUE; } } /* }}} */ /* {{{ proto resource unchangeAll() All changes to files and global information in archive are reverted */ ZIPARCHIVE_METHOD(unchangeAll) { struct zip *intern; zval *this = getThis(); if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zip_unchange_all(intern) != 0) { RETURN_FALSE; } else { RETURN_TRUE; } } /* }}} */ /* {{{ proto resource unchangeAll() Revert all global changes to the archive archive. For now, this only reverts archive comment changes. */ ZIPARCHIVE_METHOD(unchangeArchive) { struct zip *intern; zval *this = getThis(); if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zip_unchange_archive(intern) != 0) { RETURN_FALSE; } else { RETURN_TRUE; } } /* }}} */ /* {{{ array resource extractTo(string pathto[, mixed files]) Extract one or more file from a zip archive */ /* TODO: * - allow index or array of indeces * - replace path * - patterns */ ZIPARCHIVE_METHOD(extractTo) { struct zip *intern; zval *this = getThis(); zval *zval_files = NULL; zval **zval_file = NULL; php_stream_statbuf ssb; char *pathto; char *file; int pathto_len; int ret, i; int nelems; if (!this) { RETURN_FALSE; } if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &pathto, &pathto_len, &zval_files) == FAILURE) { WRONG_PARAM_COUNT; return; } if (pathto_len<1) { RETURN_FALSE; } if (php_stream_stat_path(pathto, &ssb) < 0) { ret = php_stream_mkdir(pathto, 0777, PHP_STREAM_MKDIR_RECURSIVE, NULL); if (!ret) { efree(pathto); RETURN_FALSE; } } ZIP_FROM_OBJECT(intern, this); if (zval_files) { switch (Z_TYPE_P(zval_files)) { case IS_STRING: file = Z_STRVAL_P(zval_files); if (!php_zip_extract_file(intern, pathto, file TSRMLS_CC)) { RETURN_FALSE; } break; case IS_ARRAY: nelems = zend_hash_num_elements(Z_ARRVAL_P(zval_files)); if (nelems == 0 ) { RETURN_FALSE; } for (i = 0; i < nelems; i++) { if (zend_hash_index_find(Z_ARRVAL_P(zval_files), i, (void **) &zval_file) == SUCCESS) { switch (Z_TYPE_PP(zval_file)) { case IS_LONG: break; case IS_STRING: file = Z_STRVAL_PP(zval_file); if (!php_zip_extract_file(intern, pathto, file TSRMLS_CC)) { RETURN_FALSE; } break; } } } break; case IS_LONG: default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument, expect string or array of strings"); break; } } else { /* Extract all files */ int filecount = zip_get_num_files(intern); if (filecount == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal archive"); RETURN_FALSE; } for (i = 0; i < filecount; i++) { file = (char*)zip_get_name(intern, i, ZIP_FL_UNCHANGED); if (!php_zip_extract_file(intern, pathto, file TSRMLS_CC)) { RETURN_FALSE; } } } RETURN_TRUE; } /* }}} */ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ { struct zip *intern; zval *this = getThis(); struct zip_stat sb; struct zip_file *zf; char *filename; int filename_len; long index; long flags = 0; long len = 0; char *buffer; int n = 0; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (type == 1) { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &len, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_PATH(intern, filename, filename_len, flags, sb); } else { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ll", &index, &len, &flags) == FAILURE) { WRONG_PARAM_COUNT; return; } PHP_ZIP_STAT_INDEX(intern, index, 0, sb); } if (sb.size < 1) { RETURN_EMPTY_STRING(); } if (len < 1) { len = sb.size; } zf = zip_fopen(intern, filename, flags); if (zf == NULL) { RETURN_FALSE; } buffer = safe_emalloc(len + 1, 1, 1); n = zip_fread(zf, buffer, len); if (n < 1) { RETURN_EMPTY_STRING(); } zip_fclose(zf); buffer[n] = 0; RETURN_STRINGL(buffer, n, 0); } /* }}} */ /* {{{ proto resource getFromName(string entryname[, int len [, int flags]]) get the contents of an entry using its name */ ZIPARCHIVE_METHOD(getFromName) { php_zip_get_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); } /* }}} */ /* {{{ proto resource getFromIndex(string entryname[, int len [, int flags]]) get the contents of an entry using its index */ ZIPARCHIVE_METHOD(getFromIndex) { php_zip_get_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); } /* }}} */ /* {{{ proto resource getStream(string entryname) get a stream for an entry using its name */ ZIPARCHIVE_METHOD(getStream) { struct zip *intern; zval *this = getThis(); struct zip_stat sb; char *filename; int filename_len; char *mode = "rb"; php_stream *stream; ze_zip_object *obj; if (!this) { RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { WRONG_PARAM_COUNT; return; } if (zip_stat(intern, filename, 0, &sb)) { RETURN_FALSE; } obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC); stream = php_stream_zip_open(obj->filename, filename, mode STREAMS_CC TSRMLS_CC); if (stream) { php_stream_to_zval(stream, return_value); } } /* }}} */ /* {{{ ze_zip_object_class_functions */ static zend_function_entry zip_class_functions[] = { ZIPARCHIVE_ME(open, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(close, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(addFromString, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(addFile, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(renameIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(renameName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(setArchiveComment, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getArchiveComment, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(setCommentIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(setCommentName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getCommentIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getCommentName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(deleteIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(deleteName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(statName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(statIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(locateName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getNameIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(unchangeArchive, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(unchangeAll, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(unchangeIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(unchangeName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(extractTo, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getFromName, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getFromIndex, NULL, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getStream, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; /* }}} */ #endif /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(zip) { #ifdef ZEND_ENGINE_2_1 zend_class_entry ce; memcpy(&zip_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zip_object_handlers.clone_obj = NULL; zip_object_handlers.get_property_ptr_ptr = php_zip_get_property_ptr_ptr; zip_object_handlers.write_property = NULL; zip_object_handlers.get_properties = php_zip_get_properties; zip_object_handlers.read_property = php_zip_read_property; INIT_CLASS_ENTRY(ce, "ZipArchive", zip_class_functions); ce.create_object = php_zip_object_new; zip_class_entry = zend_register_internal_class(&ce TSRMLS_CC); zend_hash_init(&zip_prop_handlers, 0, NULL, NULL, 1); php_zip_register_prop_handler(&zip_prop_handlers, "status", php_zip_status, NULL, NULL, IS_LONG TSRMLS_CC); php_zip_register_prop_handler(&zip_prop_handlers, "statusSys", php_zip_status_sys, NULL, NULL, IS_LONG TSRMLS_CC); php_zip_register_prop_handler(&zip_prop_handlers, "numFiles", php_zip_get_num_files, NULL, NULL, IS_LONG TSRMLS_CC); php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, NULL, php_zipobj_get_filename, IS_STRING TSRMLS_CC); php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, NULL, IS_STRING TSRMLS_CC); REGISTER_ZIP_CLASS_CONST_LONG("CREATE", ZIP_CREATE); REGISTER_ZIP_CLASS_CONST_LONG("EXCL", ZIP_EXCL); REGISTER_ZIP_CLASS_CONST_LONG("CHECKCONS", ZIP_CHECKCONS); REGISTER_ZIP_CLASS_CONST_LONG("FL_NOCASE", ZIP_FL_NOCASE); REGISTER_ZIP_CLASS_CONST_LONG("FL_NODIR", ZIP_FL_NODIR); REGISTER_ZIP_CLASS_CONST_LONG("FL_COMPRESSED", ZIP_FL_COMPRESSED); REGISTER_ZIP_CLASS_CONST_LONG("FL_UNCHANGED", ZIP_FL_UNCHANGED); REGISTER_ZIP_CLASS_CONST_LONG("CM_DEFAULT", ZIP_CM_DEFAULT); REGISTER_ZIP_CLASS_CONST_LONG("CM_STORE", ZIP_CM_STORE); REGISTER_ZIP_CLASS_CONST_LONG("CM_SHRINK", ZIP_CM_SHRINK); REGISTER_ZIP_CLASS_CONST_LONG("CM_REDUCE_1", ZIP_CM_REDUCE_1); REGISTER_ZIP_CLASS_CONST_LONG("CM_REDUCE_2", ZIP_CM_REDUCE_2); REGISTER_ZIP_CLASS_CONST_LONG("CM_REDUCE_3", ZIP_CM_REDUCE_3); REGISTER_ZIP_CLASS_CONST_LONG("CM_REDUCE_4", ZIP_CM_REDUCE_4); REGISTER_ZIP_CLASS_CONST_LONG("CM_IMPLODE", ZIP_CM_IMPLODE); REGISTER_ZIP_CLASS_CONST_LONG("CM_DEFLATE", ZIP_CM_DEFLATE); REGISTER_ZIP_CLASS_CONST_LONG("CM_DEFLATE64", ZIP_CM_DEFLATE64); REGISTER_ZIP_CLASS_CONST_LONG("CM_PKWARE_IMPLODE", ZIP_CM_PKWARE_IMPLODE); /* Error code */ REGISTER_ZIP_CLASS_CONST_LONG("ER_OK", ZIP_ER_OK); /* N No error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_MULTIDISK", ZIP_ER_MULTIDISK); /* N Multi-disk zip archives not supported */ REGISTER_ZIP_CLASS_CONST_LONG("ER_RENAME", ZIP_ER_RENAME); /* S Renaming temporary file failed */ REGISTER_ZIP_CLASS_CONST_LONG("ER_CLOSE", ZIP_ER_CLOSE); /* S Closing zip archive failed */ REGISTER_ZIP_CLASS_CONST_LONG("ER_SEEK", ZIP_ER_SEEK); /* S Seek error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_READ", ZIP_ER_READ); /* S Read error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_WRITE", ZIP_ER_WRITE); /* S Write error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_CRC", ZIP_ER_CRC); /* N CRC error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_ZIPCLOSED", ZIP_ER_ZIPCLOSED); /* N Containing zip archive was closed */ REGISTER_ZIP_CLASS_CONST_LONG("ER_NOENT", ZIP_ER_NOENT); /* N No such file */ REGISTER_ZIP_CLASS_CONST_LONG("ER_EXISTS", ZIP_ER_EXISTS); /* N File already exists */ REGISTER_ZIP_CLASS_CONST_LONG("ER_OPEN", ZIP_ER_OPEN); /* S Can't open file */ REGISTER_ZIP_CLASS_CONST_LONG("ER_TMPOPEN", ZIP_ER_TMPOPEN); /* S Failure to create temporary file */ REGISTER_ZIP_CLASS_CONST_LONG("ER_ZLIB", ZIP_ER_ZLIB); /* Z Zlib error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_MEMORY", ZIP_ER_MEMORY); /* N Malloc failure */ REGISTER_ZIP_CLASS_CONST_LONG("ER_CHANGED", ZIP_ER_CHANGED); /* N Entry has been changed */ REGISTER_ZIP_CLASS_CONST_LONG("ER_COMPNOTSUPP", ZIP_ER_COMPNOTSUPP);/* N Compression method not supported */ REGISTER_ZIP_CLASS_CONST_LONG("ER_EOF", ZIP_ER_EOF); /* N Premature EOF */ REGISTER_ZIP_CLASS_CONST_LONG("ER_INVAL", ZIP_ER_INVAL); /* N Invalid argument */ REGISTER_ZIP_CLASS_CONST_LONG("ER_NOZIP", ZIP_ER_NOZIP); /* N Not a zip archive */ REGISTER_ZIP_CLASS_CONST_LONG("ER_INTERNAL", ZIP_ER_INTERNAL); /* N Internal error */ REGISTER_ZIP_CLASS_CONST_LONG("ER_INCONS", ZIP_ER_INCONS); /* N Zip archive inconsistent */ REGISTER_ZIP_CLASS_CONST_LONG("ER_REMOVE", ZIP_ER_REMOVE); /* S Can't remove file */ REGISTER_ZIP_CLASS_CONST_LONG("ER_DELETED", ZIP_ER_DELETED); /* N Entry has been deleted */ php_register_url_stream_wrapper("zip", &php_stream_zip_wrapper TSRMLS_CC); #endif le_zip_dir = zend_register_list_destructors_ex(php_zip_free_dir, NULL, le_zip_dir_name, module_number); le_zip_entry = zend_register_list_destructors_ex(php_zip_free_entry, NULL, le_zip_entry_name, module_number); return SUCCESS; } /* }}} */ /* {{{ PHP_MSHUTDOWN_FUNCTION */ PHP_MSHUTDOWN_FUNCTION(zip) { #ifdef ZEND_ENGINE_2_1 zend_hash_destroy(&zip_prop_handlers); php_unregister_url_stream_wrapper("zip" TSRMLS_CC); #endif return SUCCESS; } /* }}} */ /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(zip) { php_info_print_table_start(); { php_info_print_table_row(2, "Zip", "enabled"); php_info_print_table_row(2, "$Id: php_zip.c,v 1.1 2006/07/24 16:58:58 pajoye Exp $", "enabled"); php_info_print_table_row(2, "Zip version", "1.4.0"); php_info_print_table_row(2, "Libzip version", "0.7.1"); } php_info_print_table_end(); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/zip_stream.c?view=markup&rev=1.1 Index: php-src/ext/zip/zip_stream.c +++ php-src/ext/zip/zip_stream.c /* $Id: zip_stream.c,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "php.h" #if HAVE_ZIP #ifdef ZEND_ENGINE_2 #include "lib/zip.h" #include "php_streams.h" #include "ext/standard/file.h" #include "fopen_wrappers.h" #include "ext/standard/url.h" struct php_zip_stream_data_t { struct zip *za; struct zip_file *zf; size_t cursor; php_stream *stream; }; #define STREAM_DATA_FROM_STREAM() \ struct php_zip_stream_data_t *self = (struct php_zip_stream_data_t *) stream->abstract; /* {{{ php_zip_ops_read */ static size_t php_zip_ops_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) { int n = 0; STREAM_DATA_FROM_STREAM(); if (self->za && self->zf) { n = (size_t)zip_fread(self->zf, buf, (int)count); if (n == 0) { stream->eof = 1; } else { self->cursor += n; } } return n<1 ? 0 : n; } /* }}} */ /* {{{ php_zip_ops_write */ static size_t php_zip_ops_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC) { STREAM_DATA_FROM_STREAM(); if (!stream) { return 0; } return count; } /* }}} */ /* {{{ php_zip_ops_close */ static int php_zip_ops_close(php_stream *stream, int close_handle TSRMLS_DC) { STREAM_DATA_FROM_STREAM(); if (close_handle && self->za) { zip_close(self->za); self->za = NULL; } efree(self); stream->abstract = NULL; return EOF; } /* }}} */ /* {{{ php_zip_ops_flush */ static int php_zip_ops_flush(php_stream *stream TSRMLS_DC) { STREAM_DATA_FROM_STREAM(); if (!stream) { return 0; } return 0; } /* }}} */ php_stream_ops php_stream_zipio_ops = { php_zip_ops_write, php_zip_ops_read, php_zip_ops_close, php_zip_ops_flush, "zip", NULL, /* seek */ NULL, /* cast */ NULL, /* stat */ NULL /* set_option */ }; /* {{{ php_stream_zip_open */ php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_DC TSRMLS_DC) { struct zip_file *zf = NULL; int err = 0; php_stream *stream = NULL; struct php_zip_stream_data_t *self; struct zip *stream_za; if (strncmp(mode,"r", strlen("r")) != 0) { return NULL; } if (filename) { /* duplicate to make the stream za independent (esp. for MSHUTDOWN) */ stream_za = zip_open(filename, ZIP_CREATE, &err); if (!stream_za) { return NULL; } zf = zip_fopen(stream_za, path, 0); if (zf) { self = emalloc(sizeof(*self)); self->za = stream_za; self->zf = zf; self->stream = NULL; self->cursor = 0; stream = php_stream_alloc(&php_stream_zipio_ops, self, NULL, mode); } else { zip_close(stream_za); } } if (!stream) { return NULL; } else { return stream; } } /* }}} */ /* {{{ php_stream_zip_opener */ php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { int path_len; char *file_basename; size_t file_basename_len; char file_dirname[MAXPATHLEN+1]; struct zip *za; struct zip_file *zf = NULL; char *fragment; int fragment_len; int err; php_stream *stream = NULL; struct php_zip_stream_data_t *self; fragment = strchr(path, '#'); if (!fragment) { return NULL; } if (strncasecmp("zip://", path, 6) == 0) { path += 6; } fragment_len = strlen(fragment); if (fragment_len < 1) { return NULL; } path_len = strlen(path); memcpy(file_dirname, path, path_len - fragment_len); file_dirname[path_len - fragment_len] = '\0'; php_basename(path, path_len - fragment_len, NULL, 0, &file_basename, &file_basename_len TSRMLS_CC); fragment++; if (mode[0] != 'r') { return NULL; } za = zip_open(file_dirname, ZIP_CREATE, &err); if (za) { zf = zip_fopen(za, fragment, 0); if (zf) { self = emalloc(sizeof(*self)); self->za = za; self->zf = zf; self->stream = NULL; self->cursor = 0; stream = php_stream_alloc(&php_stream_zipio_ops, self, NULL, mode); if (opened_path) { *opened_path = estrdup(path); } } else { zip_close(za); } } efree(file_basename); if (!stream) { return NULL; } else { return stream; } } /* }}} */ static php_stream_wrapper_ops zip_stream_wops = { php_stream_zip_opener, NULL, /* close */ NULL, /* fstat */ NULL, /* stat */ NULL, /* opendir */ "zip wrapper", NULL, /* unlink */ NULL, /* rename */ NULL, /* mkdir */ NULL /* rmdir */ }; php_stream_wrapper php_stream_zip_wrapper = { &zip_stream_wops, NULL, 0 /* is_url */ }; #endif /* ZEND_ENGINE_2 */ #endif /* HAVE_ZIP */ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/comment.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/comment.php +++ php-src/ext/zip/examples/comment.php <?php $z = new ZipArchive; $z->open('test_with_comment.zip'); // Add "Foo Comment" as comment for the foo entry $z->setCommentName('foo', 'Too Comment ' . time()); $z->close(); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/create.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/create.php +++ php-src/ext/zip/examples/create.php <?php error_reporting(E_ALL); if (!extension_loaded('zip')) { dl('zip.so'); } $thisdir = dirname(__FILE__); unlink("./test112.zip"); $zip = new ZipArchive(); $filename = "./test112.zip"; if (!$zip->open($filename, ZIPARCHIVE::CREATE)) { exit("cannot open <$filename>\n"); } else { echo "file <$filename> OK\n"; } $zip->addFromString("testfilephp.txt" . time(), "#1 This is a test string added as testfilephp.txt.\n"); $zip->addFromString("testfilephp2.txt" . time(), "#2 This is a test string added as testfilephp2.txt.\n"); $zip->addFile($thisdir . "/too.php","/testfromfile.php"); echo "numfiles: " . $zip->numFiles . "\n"; echo "status:" . $zip->status . "\n"; $zip->close(); unset($zip); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/dir.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/dir.php +++ php-src/ext/zip/examples/dir.php <?php if (!extension_loaded('zip')) { dl('zip.so'); } $za = new ZipArchive(); $za->open('test_with_comment.zip'); print_r($za); var_dump($za); echo "numFiles: " . $za->numFiles . "\n"; echo "status: " . $za->status . "\n"; echo "statusSys: " . $za->statusSys . "\n"; echo "filename: " . $za->filename . "\n"; echo "comment: " . $za->comment . "\n"; for ($i=0; $i<$za->numFiles;$i++) { echo "index: $i\n"; print_r($za->statIndex($i)); } echo "numFile:" . $za->numFiles . "\n"; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/extract.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/extract.php +++ php-src/ext/zip/examples/extract.php <?php if (!extension_loaded('zip')) { dl('zip.so'); } $zip = new ZipArchive(); echo $zip->filename . "\n"; $zip->open("test.zip"); /* $zip->addFile("./modules/"); $zip->addFile("./testempty"); */ echo $zip->status . "\n"; echo $zip->statusSys . "\n"; echo $zip->numFiles . "\n"; echo $zip->filename . "\n"; var_dump($zip); $files = array('test', 'testdir/test2'); if (!$zip->extractTo("./testext/path/to", $files)) { echo "error!\n"; echo $zip->status . "\n"; echo $zip->statusSys . "\n"; } $zip->close(); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/extractAll.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/extractAll.php +++ php-src/ext/zip/examples/extractAll.php <?php $zip = new ZipArchive(); echo $zip->filename . "\n"; $zip->open("test.zip"); /* $zip->addFile("./modules/"); $zip->addFile("./testempty"); */ echo $zip->status . "\n"; echo $zip->statusSys . "\n"; echo $zip->numFiles . "\n"; echo $zip->filename . "\n"; var_dump($zip); $files = array('test', 'testdir/test2'); if (!$zip->extractTo("./testext/path/to")) { echo "error!\n"; echo $zip->status . "\n"; echo $zip->statusSys . "\n"; } $zip->close(); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/fopen.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/fopen.php +++ php-src/ext/zip/examples/fopen.php <?php if (!extension_loaded('zip')) { dl('zip.so'); } $fp = fopen('zip://' . dirname(__FILE__) . '/test.zip#test', 'r'); if (!$fp) { exit("cannot open\n"); } while (!feof($fp)) { $contents .= fread($fp, 2); echo "$contents\n"; } fclose($fp); echo "done.\n"; $content = ''; $z = new ZipArchive(); $z->open(dirname(__FILE__) . '/test.zip'); $fp = $z->getStream('test'); var_dump($fp); if(!$fp) exit("\n"); while (!feof($fp)) { $contents .= fread($fp, 2); } fclose($fp); file_put_contents('t',$contents); echo "done.\n"; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/get_set_comments.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/get_set_comments.php +++ php-src/ext/zip/examples/get_set_comments.php <?php error_reporting(E_ALL|E_STRICT); copy('test_with_comment.zip', 't.zip'); $z = new ZipArchive; $z->open('t.zip'); print_r($z); for ($i=0; $i<$z->numFiles; $i++) { echo "index: $i\n"; print_r($z->getCommentIndex($i)); echo "\n\n"; } echo "foobar/ " . $z->getCommentName('foobar/') . "\n"; echo "Archive comment: " . $z->getArchiveComment() . "\n"; $z->setCommentIndex(1, 'new comment idx 1'); $z->setCommentName('foobar/', 'new comment foobar/'); $z->setArchiveComment( 'new archive comment'); for ($i=0; $i<$z->numFiles; $i++) { echo "index: $i\n"; print_r($z->getCommentIndex($i)); echo "\n\n"; } echo $z->getCommentName('foobar/') . "\n"; // Get the original comment echo $z->getCommentName('foobar/', ZIPARCHIVE::FL_UNCHANGED) . "\n"; echo "Archive comment: " . $z->getArchiveComment() . "\n"; echo "Archive comment (original): " . $z->getArchiveComment(ZIPARCHIVE::FL_UNCHANGED) . "\n"; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/im.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/im.php +++ php-src/ext/zip/examples/im.php <?php /* $Id: im.php,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ $im = imagecreatefromgif('zip://' . dirname(__FILE__) . '/test_im.zip#pear_item.gif'); imagepng($im, 'a.png'); $z = new ZipArchive(); $z->open(dirname(__FILE__) . '/test_im.zip'); $im_string = $z->getFromName("pear_item.gif"); $im = imagecreatefromstring($im_string); imagepng($im, 'b.png'); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/odt.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/odt.php +++ php-src/ext/zip/examples/odt.php <?php /* $Id: odt.php,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ $reader = new XMLReader(); $reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml'); $odt_meta = array(); while ($reader->read()) { if ($reader->nodeType == XMLREADER::ELEMENT) { $elm = $reader->name; } else { if ($reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') { break; } if (!trim($reader->value)) { continue; } $odt_meta[$elm] = $reader->value; } } print_r($odt_meta); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/oldapi.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/oldapi.php +++ php-src/ext/zip/examples/oldapi.php <?php $zip = zip_open('examples/test1.zip'); var_dump($zip); if ($zip) { $i = 0; while ($zip_entry = zip_read($zip)) { var_dump($zip_entry); $txt = zip_entry_read($zip_entry, 10); echo $i . ": " . $txt . "size: " . zip_entry_filesize($zip_entry) . "comp_method: " . zip_entry_compressionmethod($zip_entry) . "\n"; $i++; } var_dump($zip_entry); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/test.odt?view=markup&rev=1.1 Index: php-src/ext/zip/examples/test.odt +++ php-src/ext/zip/examples/test.odt PK ÏmNoÂ)‘´Sܨk¢n†ø®Ónð[!Ü îpg(`y¢‚PާÒ-qø;sÏmóô‹D¦ Ìø  „<œígj%<…™ÛðÀ=HñíÀk3’|çMòÃ(¢¯¤øH*ã>¿ÂEãEâˆG%×Ü h¶=Æ»Yãh'µ‡0^PâôäÛvèíBï OÂõ8Ó ’‚HŠÎª‚zw¢ÔHÆOnHžŽÿ©á1ØÕô֘®’ä€LíaÍr$a@ežÂÍ î(ô7)kç-côõ ÿl}Òï}Qà练<Å'Zhæ°jU¤„&¢H|[Èeér͝OžŽû)¹q:f¨Îs/f¼¦,ÿPK´È×Ԁ þœdËU² <åûçäËçßÐ:ùðòÓ(Kš“m!ò¶&\#¥_Q 0æjë„ÏI+ùV`EՖ㚨­Î·¢!<mcí­åV¬³¹æV9¶Öä¨çݑ-Þ͏l•cëBân®±Ñ…œÆæ¥˜k|T •å¢n°¦'(ŽŒò¯ÏI¥u³MÓ®ë–ÝýRÈ}šm6›ÔJ{Ày¯×´’Y­"O #&˜J³e–ݚh<ŸÑ!ñ¶Þ9;5X㳪ªÃ~6#û ©É+,gsÃ*Ë{_Ì/ï}ÛÖXWj²N?‚Ðþ÷ñ÷ ²žËèŽR•KÚÌަӎí…=TcàÔ½[­R÷;Òw’j"#õüªzŽYÞg\ÔSI½,D†¦ÉÑØz 3ª0ŸJœTœ©—'Ç­~yá~›='¿JŠY² …š²×a}0m¨Î¡¤  Y’^wü™B nñ§¨1Ÿñ3n„úåDÏ-Ž;}´'œH ¹”ÞßUhé¥døu7¿Ã Râ–ù©<{˜{‰›ŠæIÐõ¿Q#¡šRS@ofÛVU¸ÿŠht|NVË,[g NÈ_ÏåÚÁ´"H58‡Y‰*!é7Ø ‡HÑo€4»k´]c˜ï[¼‡%ÂíB.Z®%°â˧ÑNŒ‚™†y°ö¹ñ‚Œ N‚Ìûš>́ÁÈñ‚×^:åw,R7ê¢9­Õç:¹JHOõÚT„Ã'8b¸(ˆDÁ ìº;SjZU¨¼¡ì•:GŒÄÜp7†ð†L0† 7ÊPõ­‘ÝIpX9i½¯„4H‹=ѕ¹ÒšÖú^à8 #ì'h”Ë"¹8BùV àA“˜(ö½"Z톸‹1Zcp%b~‡V`€0Á!\ő¹0b(U¿WëMãlûšš ³IÜޙin³ëKÁgº»MX÷· ëá6a½»MXïoÖãmÂZß&¬ÍmÂÊVÿ;®±(˅& Ž_^Ò}+í±¼èȟ ¥ÚüžÂ‡ƒÕw¨f­åƒ¡Bð¥Ú¾¯í.¶qxÌÏø _úkBxŸ\H§÷&#‚©0VhŸ>ª¿í¸|Úç§-Áæ}tcJ÷2¤‘R{å¹´ÍÌ8ŒÞÛá]íšÛø„çòøÁm ´x…òŽî M%:'W+éha>1­—vaµ"t_™=d÷æ½Cî4‚‡0ìû* ©%¦îê\c ϸø4&YëÇÆ vBkóµfJfò4-‘Ý šñžutD5>ö»[éðùÅ+(Òw.5«åjõå!4 ÚH‡5°J÷›õ„.5RµJ»ê;N¸u Ýëcß½ûi¸‘ۧ̏+û/‰ŸÚSûª6·^û#7-ž;˜xN=/¨±ê}ôÑü¢ñtõâc(5À‰÷tú/PK†Mސo <office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.0"><office:meta><meta:generator>OpenOffice.org/1.9.129$Linux OpenOffice.org_project/680$Build-8825</meta:generator><dc:title>Document test for xmlreader and zip</dc:title><dc:description>No comment :)</dc:description><dc:subject>sample usage of xmlreader with zip</dc:subject><meta:creation-date>2006-03-12T18:37:24</meta:creation-date><dc:date>2006-03-12T18:40:27</dc:date><meta:keyword>xmlreader openoffice zip</meta:keyword><dc:language>en-US</dc:language><meta:editing-cycles>2</meta:editing-cycles><meta:editing-duration>PT3M4S</meta:editing-duration><meta:user-defined meta:name="Info 1"/><meta:user-defined meta:name="Info 2"/><meta:user-defined meta:name="Info 3"/><meta:user-defined ! meta:name="Info 4"/><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="1" meta:word-count="6" meta:character-count="41"/></office:meta></office:document-meta>PK ÑZx1#æùôÓ©;ÎKß|7Ï\²ÿ¸¡íñ·Å>σû7¿üi6Ûw†Z¢…LÛͱý»¶ýSøñôXì~͹~Ïw͍¹Ówõõ×ߋ·ßþ—µUJþú’Ïÿ ÞÝ|3dýõÝë_ÿý½T>=zmØ¥³õ¿o½ý6ýúµø?mÿß¹ýû²¯ÿxÏߙõ·°øTˆ2¡3úmҋø;¢n{S/ƒ§«ŸË:§„& *© _Ùùf2c×¾ÿ¡‘ÿöj»M¾sMgï‡ýñ;·;ùGˆ­oj»a»µ¶G&ƒëW¯yEëÞ¯ùIó» Ø oÿÄlzÂ¥ñ:þmãátÔ,ŒØ'™UnëúÓÇæyØÿ 7}ílµªOW¸~€ˆøý“KÐæˆ˜ô:F¥PÍÆPö®5üÀÊÐLè“áë1Kê\F°èØWÅäÊÖPX¨íiF[ÕFs½Žåñuõ›,#^Ó¿ñ+Þ¡…-‰’–ïWÞ«æs“ õÒ1>”…‡½ó {h Æe¡WÑÿã!òl…ªº/,者U1lÓ¯<ÔSˆŠ*ÄqÁàÛ ,{¼‹ó⠔ONÏ@ù@ª˜¡|ö'©¨E¦ØŒ¦ ­\\%'$/ælº…Cí©&“ïñGTB<&3E:¼gGEn,%*p¥Y!ݘ4CyŸÆsP¿qÖ§¡d¥ˆæ ú' ´-Q.LٕLé ù¼c;U>@ݶˆ1`›³@Hl5@Í`cžKÆr<ÿ—<é*›f=“£t:Ô#6‡Wr»¨ž4 PÅ lÕù?…ùùêü¶ü¡ä{y§½iπÄ͙òšP¡N¨Ôq…ÿ•ö¿â¡‹$&®3T˜÷™ A8×ê4b&£‚.㜗wxæ[ª_l-õ7«L¦Lô°g—aCÚB·¿j‡De{BûrÚf9¶Åôsû·k+¤:õs(R»§Ê‹Èeû¹k©–ÐcáóRa*K[öKóï¼u§Ø:{ëᦚï òǀ:†*«ôOãèO‡FÙß1ÿ ×{ì¶Se TªÔ†0ttK°ä\¢øŒàß×A P‘…6ÛÙ~þÞݓn2ÛWŽí õ¶Æ”?ŠÎ Ôo½êƘޱ3¸°’(l@nuB‡R®›ÆY£)† w˜‹£—¸´{âçßEp.i4mS.¹ü—™(â Hÿ: ˶¡úFm—Ô—¢Árlø¸ÁQ\üS´yµšÓPKb÷i4 *© http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/test.zip?view=markup&rev=1.1 Index: php-src/ext/zip/examples/test.zip +++ php-src/ext/zip/examples/test.zip PK PK PK E‰I`ºøðžœ*. http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/test1.zip?view=markup&rev=1.1 Index: php-src/ext/zip/examples/test1.zip +++ php-src/ext/zip/examples/test1.zip PK Â0E÷ýŠ! ¦ »­? +¤Øhƒmš)Š_ïmëBԅB pçž93_ùÂGy)GwãUp£8[{‘‚uà™B.ñӂ¬¾ÒÎxùL&KçµýR,³<_×®Úpmì¹oœL©¡S|cAŠØTZÆcƒm /£¶H¡£;tNY 7Zíí/¢äӔüaJ¾ª0ƒÄ9…†ÀÊ€¿…º m},õˆmª 2ÆËÒÈÃȇZö…À7›N_À>O£PK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/test_im.zip?view=markup&rev=1.1 Index: php-src/ext/zip/examples/test_im.zip +++ php-src/ext/zip/examples/test_im.zip PK Â0E÷ýŠ! ¦ »­? +¤Øhƒmš)Š_ïmëBԅB pçž93_ùÂGy)GwãUp£8[{‘‚uà™B.ñӂ¬¾ÒÎxùL&KçµýR,³<_×®Úpmì¹oœL©¡S|cAŠØTZÆcƒm /£¶H¡£;tNY 7Zíí/¢äӔüaJ¾ª0ƒÄ9…†ÀÊ€¿…º m},õˆmª 2ÆËÒÈÃȇZö…À7›N_À>O£PK W"vRŠ$ZF‰hB"?‰ s) ˆ’1½)! http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/test_with_comment.zip?view=markup&rev=1.1 Index: php-src/ext/zip/examples/test_with_comment.zip +++ php-src/ext/zip/examples/test_with_comment.zip PK PK PK E‰I`ºøðžœ*. http://cvs.php.net/viewvc.cgi/php-src/ext/zip/examples/too.php?view=markup&rev=1.1 Index: php-src/ext/zip/examples/too.php +++ php-src/ext/zip/examples/too.php <?php echo "too"; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/mkstemp.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/mkstemp.c +++ php-src/ext/zip/lib/mkstemp.c /* $NiH: mkstemp.c,v 1.3 2006/04/23 14:51:45 wiz Exp $ */ /* Adapted from NetBSB libc by Dieter Baron */ /* NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp */ /* * Copyright (c) 1987, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <sys/types.h> #include <sys/stat.h> #include <assert.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int _zip_mkstemp(char *path) { int fd; char *start, *trv; struct stat sbuf; pid_t pid; /* To guarantee multiple calls generate unique names even if the file is not created. 676 different possibilities with 7 or more X's, 26 with 6 or less. */ static char xtra[2] = "aa"; int xcnt = 0; pid = getpid(); /* Move to end of path and count trailing X's. */ for (trv = path; *trv; ++trv) if (*trv == 'X') xcnt++; else xcnt = 0; /* Use at least one from xtra. Use 2 if more than 6 X's. */ if (*(trv - 1) == 'X') *--trv = xtra[0]; if (xcnt > 6 && *(trv - 1) == 'X') *--trv = xtra[1]; /* Set remaining X's to pid digits with 0's to the left. */ while (*--trv == 'X') { *trv = (pid % 10) + '0'; pid /= 10; } /* update xtra for next call. */ if (xtra[0] != 'z') xtra[0]++; else { xtra[0] = 'a'; if (xtra[1] != 'z') xtra[1]++; else xtra[1] = 'a'; } /* * check the target directory; if you have six X's and it * doesn't exist this runs for a *very* long time. */ for (start = trv + 1;; --trv) { if (trv <= path) break; if (*trv == '/') { *trv = '\0'; if (stat(path, &sbuf)) return (0); if (!S_ISDIR(sbuf.st_mode)) { errno = ENOTDIR; return (0); } *trv = '/'; break; } } for (;;) { if ((fd = open(path, O_CREAT | O_EXCL | O_RDWR, 0600)) >= 0) return (1); if (errno != EEXIST) return (0); /* tricky little algorithm for backward compatibility */ for (trv = start;;) { if (!*trv) return (0); if (*trv == 'z') *trv++ = 'a'; else { if (isdigit((unsigned char)*trv)) *trv = 'a'; else ++*trv; break; } } } /*NOTREACHED*/ } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/unistd.h?view=markup&rev=1.1 Index: php-src/ext/zip/lib/unistd.h +++ php-src/ext/zip/lib/unistd.h #ifndef _MSC_VER #include <unistd.h> #endif http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip.h?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip.h +++ php-src/ext/zip/lib/zip.h #ifndef _HAD_ZIP_H #define _HAD_ZIP_H /* $NiH: zip.h,v 1.57 2006/04/24 14:04:19 dillo Exp $ zip.h -- exported declarations. Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef __cplusplus extern "C" { #endif #include <sys/types.h> #include <stdio.h> #include <time.h> #include "zip_win32.h" /* flags for zip_open */ #define ZIP_CREATE 1 #define ZIP_EXCL 2 #define ZIP_CHECKCONS 4 /* flags for zip_name_locate, zip_fopen, zip_stat, ... */ #define ZIP_FL_NOCASE 1 /* ignore case on name lookup */ #define ZIP_FL_NODIR 2 /* ignore directory component */ #define ZIP_FL_COMPRESSED 4 /* read compressed data */ #define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ /* libzip error codes */ #define ZIP_ER_OK 0 /* N No error */ #define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */ #define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */ #define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */ #define ZIP_ER_SEEK 4 /* S Seek error */ #define ZIP_ER_READ 5 /* S Read error */ #define ZIP_ER_WRITE 6 /* S Write error */ #define ZIP_ER_CRC 7 /* N CRC error */ #define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */ #define ZIP_ER_NOENT 9 /* N No such file */ #define ZIP_ER_EXISTS 10 /* N File already exists */ #define ZIP_ER_OPEN 11 /* S Can't open file */ #define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */ #define ZIP_ER_ZLIB 13 /* Z Zlib error */ #define ZIP_ER_MEMORY 14 /* N Malloc failure */ #define ZIP_ER_CHANGED 15 /* N Entry has been changed */ #define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */ #define ZIP_ER_EOF 17 /* N Premature EOF */ #define ZIP_ER_INVAL 18 /* N Invalid argument */ #define ZIP_ER_NOZIP 19 /* N Not a zip archive */ #define ZIP_ER_INTERNAL 20 /* N Internal error */ #define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */ #define ZIP_ER_REMOVE 22 /* S Can't remove file */ #define ZIP_ER_DELETED 23 /* N Entry has been deleted */ /* type of system error value */ #define ZIP_ET_NONE 0 /* sys_err unused */ #define ZIP_ET_SYS 1 /* sys_err is errno */ #define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ /* compression methods */ #define ZIP_CM_DEFAULT -1 /* better of deflate or store */ #define ZIP_CM_STORE 0 /* stored (uncompressed) */ #define ZIP_CM_SHRINK 1 /* shrunk */ #define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */ #define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */ #define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */ #define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */ #define ZIP_CM_IMPLODE 6 /* imploded */ /* 7 - Reserved for Tokenizing compression algorithm */ #define ZIP_CM_DEFLATE 8 /* deflated */ #define ZIP_CM_DEFLATE64 9 /* deflate64 */ #define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ /* 11 - Reserved by PKWARE */ #define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */ /* encryption methods */ #define ZIP_EM_NONE 0 /* not encrypted */ #define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */ #if 0 /* Strong Encryption Header not parsed yet */ #define ZIP_EM_DES 0x6601 /* strong encryption: DES */ #define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */ #define ZIP_EM_3DES_168 0x6603 #define ZIP_EM_3DES_112 0x6609 #define ZIP_EM_AES_128 0x660e #define ZIP_EM_AES_192 0x660f #define ZIP_EM_AES_256 0x6610 #define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */ #define ZIP_EM_RC4 0x6801 #endif #define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */ enum zip_source_cmd { ZIP_SOURCE_OPEN, /* prepare for reading */ ZIP_SOURCE_READ, /* read data */ ZIP_SOURCE_CLOSE, /* reading is done */ ZIP_SOURCE_STAT, /* get meta information */ ZIP_SOURCE_ERROR, /* get error information */ ZIP_SOURCE_FREE /* cleanup and free resources */ }; typedef ssize_t (*zip_source_callback)(void *state, void *data, size_t len, enum zip_source_cmd cmd); struct zip_stat { const char *name; /* name of the file */ int index; /* index within archive */ unsigned int crc; /* crc of file data */ time_t mtime; /* modification time */ off_t size; /* size of file (uncompressed) */ off_t comp_size; /* size of file (compressed) */ unsigned short comp_method; /* compression method used */ unsigned short encryption_method; /* encryption method used */ }; struct zip; struct zip_file; struct zip_source; int zip_add(struct zip *, const char *, struct zip_source *); int zip_close(struct zip *); int zip_delete(struct zip *, int); void zip_error_get(struct zip *, int *, int *); int zip_error_get_sys_type(int); int zip_error_to_str(char *, size_t, int, int); int zip_fclose(struct zip_file *); void zip_file_error_get(struct zip_file *, int *, int *); const char *zip_file_strerror(struct zip_file *); struct zip_file *zip_fopen(struct zip *, const char *, int); struct zip_file *zip_fopen_index(struct zip *, int, int); ssize_t zip_fread(struct zip_file *, void *, size_t); const char *zip_get_archive_comment(struct zip *, int *, int); const char *zip_get_file_comment(struct zip *, int, int *, int); const char *zip_get_name(struct zip *, int, int); int zip_get_num_files(struct zip *); int zip_name_locate(struct zip *, const char *, int); struct zip *zip_open(const char *, int, int *); int zip_rename(struct zip *, int, const char *); int zip_replace(struct zip *, int, struct zip_source *); int zip_set_archive_comment(struct zip *, const char *, int); int zip_set_file_comment(struct zip *, int, const char *, int); struct zip_source *zip_source_buffer(struct zip *, const void *, off_t, int); struct zip_source *zip_source_file(struct zip *, const char *, off_t, off_t); struct zip_source *zip_source_filep(struct zip *, FILE *, off_t, off_t); void zip_source_free(struct zip_source *); struct zip_source *zip_source_function(struct zip *, zip_source_callback, void *); struct zip_source *zip_source_zip(struct zip *, struct zip *, int, int, off_t, off_t); int zip_stat(struct zip *, const char *, int, struct zip_stat *); int zip_stat_index(struct zip *, int, int, struct zip_stat *); const char *zip_strerror(struct zip *); int zip_unchange(struct zip *, int); int zip_unchange_all(struct zip *); int zip_unchange_archive(struct zip *); #ifdef __cplusplus } #endif #endif /* _HAD_ZIP_H */ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip.h.orig?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip.h.orig +++ php-src/ext/zip/lib/zip.h.orig #ifndef _HAD_ZIP_H #define _HAD_ZIP_H /* $NiH: zip.h,v 1.49 2005/06/09 19:57:09 dillo Exp $ zip.h -- exported declarations. Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/types.h> #include <stdio.h> #include <time.h> /* flags for zip_open */ #define ZIP_CREATE 1 #define ZIP_EXCL 2 #define ZIP_CHECKCONS 4 /* flags for zip_name_locate, zip_fopen, zip_stat, ... */ #define ZIP_FL_NOCASE 1 /* ignore case on name lookup */ #define ZIP_FL_NODIR 2 /* ignore directory component */ #define ZIP_FL_COMPRESSED 4 /* read compressed data */ #define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ /* libzip error codes */ #define ZIP_ER_OK 0 /* N No error */ #define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */ #define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */ #define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */ #define ZIP_ER_SEEK 4 /* S Seek error */ #define ZIP_ER_READ 5 /* S Read error */ #define ZIP_ER_WRITE 6 /* S Write error */ #define ZIP_ER_CRC 7 /* N CRC error */ #define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */ #define ZIP_ER_NOENT 9 /* N No such file */ #define ZIP_ER_EXISTS 10 /* N File already exists */ #define ZIP_ER_OPEN 11 /* S Can't open file */ #define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */ #define ZIP_ER_ZLIB 13 /* Z Zlib error */ #define ZIP_ER_MEMORY 14 /* N Malloc failure */ #define ZIP_ER_CHANGED 15 /* N Entry has been changed */ #define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */ #define ZIP_ER_EOF 17 /* N Premature EOF */ #define ZIP_ER_INVAL 18 /* N Invalid argument */ #define ZIP_ER_NOZIP 19 /* N Not a zip archive */ #define ZIP_ER_INTERNAL 20 /* N Internal error */ #define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */ #define ZIP_ER_REMOVE 22 /* S Can't remove file */ #define ZIP_ER_DELETED 23 /* N Entry has been deleted */ /* type of system error value */ #define ZIP_ET_NONE 0 /* sys_err unused */ #define ZIP_ET_SYS 1 /* sys_err is errno */ #define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ /* compression methods */ #define ZIP_CM_DEFAULT -1 /* better of deflate or store */ #define ZIP_CM_STORE 0 /* stored (uncompressed) */ #define ZIP_CM_SHRINK 1 /* shrunk */ #define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */ #define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */ #define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */ #define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */ #define ZIP_CM_IMPLODE 6 /* imploded */ /* 7 - Reserved for Tokenizing compression algorithm */ #define ZIP_CM_DEFLATE 8 /* deflated */ #define ZIP_CM_DEFLATE64 9 /* deflate64 */ #define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ enum zip_source_cmd { ZIP_SOURCE_OPEN, /* prepare for reading */ ZIP_SOURCE_READ, /* read data */ ZIP_SOURCE_CLOSE, /* reading is done */ ZIP_SOURCE_STAT, /* get meta information */ ZIP_SOURCE_ERROR, /* get error information */ ZIP_SOURCE_FREE /* cleanup and free resources */ }; typedef ssize_t (*zip_source_callback)(void *state, void *data, size_t len, enum zip_source_cmd cmd); struct zip_stat { const char *name; /* name of the file */ int index; /* index within archive */ unsigned int crc; /* crc of file data */ time_t mtime; /* modification time */ off_t size; /* size of file (uncompressed) */ off_t comp_size; /* size of file (compressed) */ unsigned short comp_method; /* compression method used */ }; struct zip; struct zip_file; struct zip_source; int zip_add(struct zip *, const char *, struct zip_source *); int zip_close(struct zip *); int zip_delete(struct zip *, int); void zip_error_get(struct zip *, int *, int *); int zip_error_get_sys_type(int); int zip_error_to_str(char *, size_t, int, int); int zip_fclose(struct zip_file *); void zip_file_error_get(struct zip_file *, int *, int *); const char *zip_file_strerror(struct zip_file *); struct zip_file *zip_fopen(struct zip *, const char *, int); struct zip_file *zip_fopen_index(struct zip *, int, int); ssize_t zip_fread(struct zip_file *, void *, size_t); const char *zip_get_name(struct zip *, int, int); int zip_get_num_files(struct zip *); int zip_name_locate(struct zip *, const char *, int); struct zip *zip_open(const char *, int, int *); int zip_rename(struct zip *, int, const char *); int zip_replace(struct zip *, int, struct zip_source *); struct zip_source *zip_source_buffer(struct zip *, const void *, off_t, int); struct zip_source *zip_source_file(struct zip *, const char *, off_t, off_t); struct zip_source *zip_source_filep(struct zip *, FILE *, off_t, off_t); void zip_source_free(struct zip_source *); struct zip_source *zip_source_function(struct zip *, zip_source_callback, void *); struct zip_source *zip_source_zip(struct zip *, struct zip *, int, int, off_t, off_t); int zip_stat(struct zip *, const char *, int, struct zip_stat *); int zip_stat_index(struct zip *, int, int, struct zip_stat *); const char *zip_strerror(struct zip *); int zip_unchange(struct zip *, int); int zip_unchange_all(struct zip *); #endif /* _HAD_ZIP_H */ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_add.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_add.c +++ php-src/ext/zip/lib/zip_add.c /* $NiH: zip_add.c,v 1.14 2004/11/18 15:04:04 wiz Exp $ zip_add.c -- add file via callback function Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_add(struct zip *za, const char *name, struct zip_source *source) { if (name == NULL || source == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } return _zip_replace(za, -1, name, source); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_delete.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_delete.c +++ php-src/ext/zip/lib/zip_delete.c /* $NiH: zip_delete.c,v 1.17 2005/06/09 19:57:09 dillo Exp $ zip_delete.c -- delete file from zip archive Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_delete(struct zip *za, int idx) { if (idx < 0 || idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } /* allow duplicate file names, because the file will * be removed directly afterwards */ if (_zip_unchange(za, idx, 1) != 0) return -1; za->entry[idx].state = ZIP_ST_DELETED; return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_dirent.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_dirent.c +++ php-src/ext/zip/lib/zip_dirent.c /* $NiH: zip_dirent.c,v 1.9 2006/04/23 14:51:45 wiz Exp $ zip_dirent.c -- read directory entry (local or central), clean dirent Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #ifndef _MSC_VER #include <unistd.h> #endif #include <sys/types.h> #include <sys/stat.h> #include "zip.h" #include "zipint.h" static time_t _zip_d2u_time(int, int); static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *); static char *_zip_readstr(unsigned char **, int, int, struct zip_error *); static void _zip_u2d_time(time_t, unsigned short *, unsigned short *); static void _zip_write2(unsigned short, FILE *); static void _zip_write4(unsigned int, FILE *); void _zip_cdir_free(struct zip_cdir *cd) { int i; if (!cd) return; for (i=0; i<cd->nentry; i++) _zip_dirent_finalize(cd->entry+i); free(cd->comment); free(cd->entry); free(cd); } struct zip_cdir * _zip_cdir_new(int nentry, struct zip_error *error) { struct zip_cdir *cd; if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry)) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); free(cd); return NULL; } /* entries must be initialized by caller */ cd->nentry = nentry; cd->size = cd->offset = 0; cd->comment = NULL; cd->comment_len = 0; return cd; } int _zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) { int i; cd->offset = ftell(fp); for (i=0; i<cd->nentry; i++) { if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0) return -1; } cd->size = ftell(fp) - cd->offset; /* clearerr(fp); */ fwrite(EOCD_MAGIC, 1, 4, fp); _zip_write4(0, fp); _zip_write2((unsigned short)cd->nentry, fp); _zip_write2((unsigned short)cd->nentry, fp); _zip_write4(cd->size, fp); _zip_write4(cd->offset, fp); _zip_write2(cd->comment_len, fp); fwrite(cd->comment, 1, cd->comment_len, fp); if (ferror(fp)) { _zip_error_set(error, ZIP_ER_WRITE, errno); return -1; } return 0; } void _zip_dirent_finalize(struct zip_dirent *zde) { free(zde->filename); zde->filename = NULL; free(zde->extrafield); zde->extrafield = NULL; free(zde->comment); zde->comment = NULL; } void _zip_dirent_init(struct zip_dirent *de) { de->version_madeby = 0; de->version_needed = 20; /* 2.0 */ de->bitflags = 0; de->comp_method = 0; de->last_mod = 0; de->crc = 0; de->comp_size = 0; de->uncomp_size = 0; de->filename = NULL; de->filename_len = 0; de->extrafield = NULL; de->extrafield_len = 0; de->comment = NULL; de->comment_len = 0; de->disk_number = 0; de->int_attrib = 0; de->ext_attrib = 0; de->offset = 0; } /* _zip_dirent_read(zde, fp, bufp, left, localp, error): Fills the zip directory entry zde. If bufp is non-NULL, data is taken from there and bufp is advanced by the amount of data used; no more than left bytes are used. Otherwise data is read from fp as needed. If localp != 0, it reads a local header instead of a central directory entry. Returns 0 if successful. On error, error is filled in and -1 is returned. */ int _zip_dirent_read(struct zip_dirent *zde, FILE *fp, unsigned char **bufp, unsigned int left, int localp, struct zip_error *error) { unsigned char buf[CDENTRYSIZE]; unsigned char *cur; unsigned short dostime, dosdate; unsigned int size; if (localp) size = LENTRYSIZE; else size = CDENTRYSIZE; if (bufp) { /* use data from buffer */ cur = *bufp; if (left < size) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } } else { /* read entry from disk */ if ((fread(buf, 1, size, fp)<size)) { _zip_error_set(error, ZIP_ER_READ, errno); return -1; } left = size; cur = buf; } if (memcmp(cur, (localp ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } cur += 4; /* convert buffercontents to zip_dirent */ if (!localp) zde->version_madeby = _zip_read2(&cur); else zde->version_madeby = 0; zde->version_needed = _zip_read2(&cur); zde->bitflags = _zip_read2(&cur); zde->comp_method = _zip_read2(&cur); /* convert to time_t */ dostime = _zip_read2(&cur); dosdate = _zip_read2(&cur); zde->last_mod = _zip_d2u_time(dostime, dosdate); zde->crc = _zip_read4(&cur); zde->comp_size = _zip_read4(&cur); zde->uncomp_size = _zip_read4(&cur); zde->filename_len = _zip_read2(&cur); zde->extrafield_len = _zip_read2(&cur); if (localp) { zde->comment_len = 0; zde->disk_number = 0; zde->int_attrib = 0; zde->ext_attrib = 0; zde->offset = 0; } else { zde->comment_len = _zip_read2(&cur); zde->disk_number = _zip_read2(&cur); zde->int_attrib = _zip_read2(&cur); zde->ext_attrib = _zip_read4(&cur); zde->offset = _zip_read4(&cur); } zde->filename = NULL; zde->extrafield = NULL; zde->comment = NULL; if (bufp) { if (left < CDENTRYSIZE + (zde->filename_len+zde->extrafield_len +zde->comment_len)) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } if (zde->filename_len) { zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error); if (!zde->filename) return -1; } if (zde->extrafield_len) { zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0, error); if (!zde->extrafield) return -1; } if (zde->comment_len) { zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error); if (!zde->comment) return -1; } } else { if (zde->filename_len) { zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error); if (!zde->filename) return -1; } if (zde->extrafield_len) { zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0, error); if (!zde->extrafield) return -1; } if (zde->comment_len) { zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error); if (!zde->comment) return -1; } } if (bufp) *bufp = cur; return 0; } /* _zip_dirent_write(zde, fp, localp, error): Writes zip directory entry zde to file fp. If localp != 0, it writes a local header instead of a central directory entry. Returns 0 if successful. On error, error is filled in and -1 is returned. */ int _zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, struct zip_error *error) { unsigned short dostime, dosdate; fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); if (!localp) _zip_write2(zde->version_madeby, fp); _zip_write2(zde->version_needed, fp); _zip_write2(zde->bitflags, fp); _zip_write2(zde->comp_method, fp); _zip_u2d_time(zde->last_mod, &dostime, &dosdate); _zip_write2(dostime, fp); _zip_write2(dosdate, fp); _zip_write4(zde->crc, fp); _zip_write4(zde->comp_size, fp); _zip_write4(zde->uncomp_size, fp); _zip_write2(zde->filename_len, fp); _zip_write2(zde->extrafield_len, fp); if (!localp) { _zip_write2(zde->comment_len, fp); _zip_write2(zde->disk_number, fp); _zip_write2(zde->int_attrib, fp); _zip_write4(zde->ext_attrib, fp); _zip_write4(zde->offset, fp); } if (zde->filename_len) fwrite(zde->filename, 1, zde->filename_len, fp); if (zde->extrafield_len) fwrite(zde->extrafield, 1, zde->extrafield_len, fp); if (!localp) { if (zde->comment_len) fwrite(zde->comment, 1, zde->comment_len, fp); } if (ferror(fp)) { _zip_error_set(error, ZIP_ER_WRITE, errno); return -1; } return 0; } static time_t _zip_d2u_time(int dtime, int ddate) { struct tm *tm; time_t now; now = time(NULL); tm = localtime(&now); tm->tm_year = ((ddate>>9)&127) + 1980 - 1900; tm->tm_mon = ((ddate>>5)&15) - 1; tm->tm_mday = ddate&31; tm->tm_hour = (dtime>>11)&31; tm->tm_min = (dtime>>5)&63; tm->tm_sec = (dtime<<1)&62; return mktime(tm); } unsigned short _zip_read2(unsigned char **a) { unsigned short ret; ret = (*a)[0]+((*a)[1]<<8); *a += 2; return ret; } unsigned int _zip_read4(unsigned char **a) { unsigned int ret; ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; *a += 4; return ret; } static char * _zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error) { char *r, *o; r = (char *)malloc(nulp ? len+1 : len); if (!r) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } if (fread(r, 1, len, fp)<len) { free(r); _zip_error_set(error, ZIP_ER_READ, errno); return NULL; } if (nulp) { /* replace any in-string NUL characters with spaces */ r[len] = 0; for (o=r; o<r+len; o++) if (*o == '\0') *o = ' '; } return r; } static char * _zip_readstr(unsigned char **buf, int len, int nulp, struct zip_error *error) { char *r, *o; r = (char *)malloc(nulp ? len+1 : len); if (!r) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } memcpy(r, *buf, len); *buf += len; if (nulp) { /* replace any in-string NUL characters with spaces */ r[len] = 0; for (o=r; o<r+len; o++) if (*o == '\0') *o = ' '; } return r; } static void _zip_write2(unsigned short i, FILE *fp) { putc(i&0xff, fp); putc((i>>8)&0xff, fp); return; } static void _zip_write4(unsigned int i, FILE *fp) { putc(i&0xff, fp); putc((i>>8)&0xff, fp); putc((i>>16)&0xff, fp); putc((i>>24)&0xff, fp); return; } static void _zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate) { struct tm *tm; tm = localtime(&time); *ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + tm->tm_mday; *dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + ((tm->tm_sec)>>1); return; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_entry_free.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_entry_free.c +++ php-src/ext/zip/lib/zip_entry_free.c /* $NiH: zip_entry_free.c,v 1.2 2006/04/09 19:05:47 wiz Exp $ zip_entry_free.c -- free struct zip_entry Copyright (C) 1999, 2003, 2004, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" void _zip_entry_free(struct zip_entry *ze) { free(ze->ch_filename); ze->ch_filename = NULL; free(ze->ch_comment); ze->ch_comment = NULL; ze->ch_comment_len = -1; _zip_unchange_data(ze); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_entry_new.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_entry_new.c +++ php-src/ext/zip/lib/zip_entry_new.c /* $NiH: zip_entry_new.c,v 1.2 2006/04/09 19:05:47 wiz Exp $ zip_entry_new.c -- create and init struct zip_entry Copyright (C) 1999, 2003, 2004, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" struct zip_entry * _zip_entry_new(struct zip *za) { struct zip_entry *ze; if (!za) { ze = (struct zip_entry *)malloc(sizeof(struct zip_entry)); if (!ze) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } } else { if (za->nentry >= za->nentry_alloc-1) { za->nentry_alloc += 16; za->entry = (struct zip_entry *)realloc(za->entry, sizeof(struct zip_entry) * za->nentry_alloc); if (!za->entry) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } } ze = za->entry+za->nentry; } ze->state = ZIP_ST_UNCHANGED; ze->ch_filename = NULL; ze->ch_comment = NULL; ze->ch_comment_len = -1; ze->source = NULL; if (za) za->nentry++; return ze; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_err_str.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_err_str.c +++ php-src/ext/zip/lib/zip_err_str.c /* This file was generated automatically by ./make_zip_err_str.sh from ./zip.h; make changes there. NiH: make_zip_err_str.sh,v 1.8 2004/11/17 21:55:09 wiz Exp NiH: zip.h,v 1.57 2006/04/24 14:04:19 dillo Exp */ #include "zip.h" #include "zipint.h" const char * const _zip_err_str[] = { "No error", "Multi-disk zip archives not supported", "Renaming temporary file failed", "Closing zip archive failed", "Seek error", "Read error", "Write error", "CRC error", "Containing zip archive was closed", "No such file", "File already exists", "Can't open file", "Failure to create temporary file", "Zlib error", "Malloc failure", "Entry has been changed", "Compression method not supported", "Premature EOF", "Invalid argument", "Not a zip archive", "Internal error", "Zip archive inconsistent", "Can't remove file", "Entry has been deleted", }; const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); #define N ZIP_ET_NONE #define S ZIP_ET_SYS #define Z ZIP_ET_ZLIB const int _zip_err_type[] = { N, N, S, S, S, S, S, N, N, N, N, S, S, Z, N, N, N, N, N, N, N, N, S, N, }; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_error.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_error.c +++ php-src/ext/zip/lib/zip_error.c /* $NiH: zip_error.c,v 1.7 2005/06/09 19:57:09 dillo Exp $ zip_error.c -- struct zip_error helper functions Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" void _zip_error_copy(struct zip_error *dst, struct zip_error *src) { dst->zip_err = src->zip_err; dst->sys_err = src->sys_err; } void _zip_error_fini(struct zip_error *err) { free(err->str); err->str = NULL; } void _zip_error_get(struct zip_error *err, int *zep, int *sep) { if (zep) *zep = err->zip_err; if (sep) { if (zip_error_get_sys_type(err->zip_err) != ZIP_ET_NONE) *sep = err->sys_err; else *sep = 0; } } void _zip_error_init(struct zip_error *err) { err->zip_err = 0; err->sys_err = 0; err->str = NULL; } void _zip_error_set(struct zip_error *err, int ze, int se) { if (err) { err->zip_err = ze; err->sys_err = se; } } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_error_get.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_error_get.c +++ php-src/ext/zip/lib/zip_error_get.c /* $NiH: zip_error_get.c,v 1.1 2004/11/18 15:06:20 wiz Exp $ zip_error_get.c -- get zip error Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" void zip_error_get(struct zip *za, int *zep, int *sep) { _zip_error_get(&za->error, zep, sep); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_error_get_sys_type.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_error_get_sys_type.c +++ php-src/ext/zip/lib/zip_error_get_sys_type.c /* $NiH: zip_error_get_sys_type.c,v 1.1 2004/12/22 15:49:18 wiz Exp $ zip_error_get_sys_type.c -- return type of system error code Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_error_get_sys_type(int ze) { if (ze < 0 || ze >= _zip_nerr_str) return 0; return _zip_err_type[ze]; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_error_strerror.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_error_strerror.c +++ php-src/ext/zip/lib/zip_error_strerror.c /* $NiH: zip_error_strerror.c,v 1.4 2006/02/21 09:41:00 dillo Exp $ zip_error_sterror.c -- get string representation of struct zip_error Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" const char * _zip_error_strerror(struct zip_error *err) { const char *zs, *ss; char buf[128], *s; _zip_error_fini(err); if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) { sprintf(buf, "Unknown error %d", err->zip_err); zs = NULL; ss = buf; } else { zs = _zip_err_str[err->zip_err]; switch (_zip_err_type[err->zip_err]) { case ZIP_ET_SYS: ss = strerror(err->sys_err); break; case ZIP_ET_ZLIB: ss = zError(err->sys_err); break; default: ss = NULL; } } if (ss == NULL) return zs; else { if ((s=(char *)malloc(strlen(ss) + (zs ? strlen(zs)+2 : 0) + 1)) == NULL) return _zip_err_str[ZIP_ER_MEMORY]; sprintf(s, "%s%s%s", (zs ? zs : ""), (zs ? ": " : ""), ss); err->str = s; return ss; } } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_error_to_str.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_error_to_str.c +++ php-src/ext/zip/lib/zip_error_to_str.c /* $NiH: zip_error_to_str.c,v 1.1 2004/11/18 15:06:20 wiz Exp $ zip_error_to_str.c -- get string representation of zip error code Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" int zip_error_to_str(char *buf, size_t len, int ze, int se) { const char *zs, *ss; if (ze < 0 || ze >= _zip_nerr_str) return snprintf(buf, len, "Unknown error %d", ze); zs = _zip_err_str[ze]; switch (_zip_err_type[ze]) { case ZIP_ET_SYS: ss = strerror(se); break; case ZIP_ET_ZLIB: ss = zError(se); break; default: ss = NULL; } return snprintf(buf, len, "%s%s%s", zs, (ss ? ": " : ""), (ss ? ss : "")); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_fclose.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_fclose.c +++ php-src/ext/zip/lib/zip_fclose.c /* $NiH: zip_fclose.c,v 1.14 2005/06/09 19:57:09 dillo Exp $ zip_fclose.c -- close file in zip archive Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" int zip_fclose(struct zip_file *zf) { int i, ret; if (zf->zstr) inflateEnd(zf->zstr); free(zf->buffer); free(zf->zstr); for (i=0; i<zf->za->nfile; i++) { if (zf->za->file[i] == zf) { zf->za->file[i] = zf->za->file[zf->za->nfile-1]; zf->za->nfile--; break; } } ret = 0; if (zf->error.zip_err) ret = zf->error.zip_err; else if ((zf->flags & ZIP_ZF_CRC) && (zf->flags & ZIP_ZF_EOF)) { /* if EOF, compare CRC */ if (zf->crc_orig != zf->crc) ret = ZIP_ER_CRC; } free(zf); return ret; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_file_error_get.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_file_error_get.c +++ php-src/ext/zip/lib/zip_file_error_get.c /* $NiH: zip_file_error_get.c,v 1.1 2004/11/18 15:06:21 wiz Exp $ zip_file_error_get.c -- get zip file error Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" void zip_file_error_get(struct zip_file *zf, int *zep, int *sep) { _zip_error_get(&zf->error, zep, sep); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_file_get_offset.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_file_get_offset.c +++ php-src/ext/zip/lib/zip_file_get_offset.c /* $NiH: zip_file_get_offset.c,v 1.4 2006/04/23 14:51:45 wiz Exp $ zip_file_get_offset.c -- get offset of file data in archive. Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #ifndef _MSC_VER #include <unistd.h> #endif #include <sys/types.h> #include <sys/stat.h> #include "zip.h" #include "zipint.h" /* _zip_file_get_offset(za, ze): Returns the offset of the file data for entry ze. On error, fills in za->error and returns 0. */ unsigned int _zip_file_get_offset(struct zip *za, int idx) { struct zip_dirent de; unsigned int offset; offset = za->cdir->entry[idx].offset; if (fseek(za->zp, offset, SEEK_SET) != 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return 0; } if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) return 0; offset += LENTRYSIZE + de.filename_len + de.extrafield_len; _zip_dirent_finalize(&de); return offset; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_file_strerror.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_file_strerror.c +++ php-src/ext/zip/lib/zip_file_strerror.c /* $NiH: zip_file_strerror.c,v 1.1 2003/10/05 16:05:22 dillo Exp $ zip_file_sterror.c -- get string representation of zip file error Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" const char * zip_file_strerror(struct zip_file *zf) { return _zip_error_strerror(&zf->error); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_fopen.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_fopen.c +++ php-src/ext/zip/lib/zip_fopen.c /* $NiH: zip_fopen.c,v 1.12 2005/06/09 19:57:09 dillo Exp $ zip_fopen.c -- open file in zip archive for reading Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" struct zip_file * zip_fopen(struct zip *za, const char *fname, int flags) { int idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return NULL; return zip_fopen_index(za, idx, flags); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_fopen_index.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_fopen_index.c +++ php-src/ext/zip/lib/zip_fopen_index.c /* $NiH: zip_fopen_index.c,v 1.24 2005/05/20 21:54:53 wiz Exp $ zip_fopen_index.c -- open file in zip archive for reading by index Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <errno.h> #include <stdio.h> #include <stdlib.h> #include "zip.h" #include "zipint.h" static struct zip_file *_zip_file_new(struct zip *za); struct zip_file * zip_fopen_index(struct zip *za, int fileno, int flags) { int len, ret; int zfflags; struct zip_file *zf; if ((fileno < 0) || (fileno >= za->nentry)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((flags & ZIP_FL_UNCHANGED) == 0 && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) { _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); return NULL; } if (fileno >= za->cdir->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } zfflags = 0; switch (za->cdir->entry[fileno].comp_method) { case ZIP_CM_STORE: zfflags |= ZIP_ZF_CRC; break; case ZIP_CM_DEFLATE: if ((flags & ZIP_FL_COMPRESSED) == 0) zfflags |= ZIP_ZF_CRC | ZIP_ZF_DECOMP; break; default: if ((flags & ZIP_FL_COMPRESSED) == 0) { _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); return NULL; } break; } zf = _zip_file_new(za); zf->flags = zfflags; /* zf->name = za->cdir->entry[fileno].filename; */ zf->method = za->cdir->entry[fileno].comp_method; zf->bytes_left = za->cdir->entry[fileno].uncomp_size; zf->cbytes_left = za->cdir->entry[fileno].comp_size; zf->crc_orig = za->cdir->entry[fileno].crc; if ((zf->fpos=_zip_file_get_offset(za, fileno)) == 0) { zip_fclose(zf); return NULL; } if ((zf->flags & ZIP_ZF_DECOMP) == 0) zf->bytes_left = zf->cbytes_left; else { if ((zf->buffer=(char *)malloc(BUFSIZE)) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); zip_fclose(zf); return NULL; } len = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf); if (len <= 0) { _zip_error_copy(&za->error, &zf->error); zip_fclose(zf); return NULL; } if ((zf->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); zip_fclose(zf); return NULL; } zf->zstr->zalloc = Z_NULL; zf->zstr->zfree = Z_NULL; zf->zstr->opaque = NULL; zf->zstr->next_in = (Bytef *)zf->buffer; zf->zstr->avail_in = len; /* negative value to tell zlib that there is no header */ if ((ret=inflateInit2(zf->zstr, -MAX_WBITS)) != Z_OK) { _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); zip_fclose(zf); return NULL; } } return zf; } int _zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf) { int i, j; if (zf->error.zip_err != ZIP_ER_OK) return -1; if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0) return 0; if (fseek(zf->za->zp, zf->fpos, SEEK_SET) < 0) { _zip_error_set(&zf->error, ZIP_ER_SEEK, errno); return -1; } if (buflen < zf->cbytes_left) i = buflen; else i = zf->cbytes_left; j = fread(buf, 1, i, zf->za->zp); if (j == 0) { _zip_error_set(&zf->error, ZIP_ER_EOF, 0); j = -1; } else if (j < 0) _zip_error_set(&zf->error, ZIP_ER_READ, errno); else { zf->fpos += j; zf->cbytes_left -= j; } return j; } static struct zip_file * _zip_file_new(struct zip *za) { struct zip_file *zf, **file; int n; if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } if (za->nfile >= za->nfile_alloc-1) { n = za->nfile_alloc + 10; file = (struct zip_file **)realloc(za->file, n*sizeof(struct zip_file *)); if (file == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); free(zf); return NULL; } za->nfile_alloc = n; za->file = file; } za->file[za->nfile++] = zf; zf->za = za; _zip_error_init(&zf->error); zf->flags = 0; zf->crc = crc32(0L, Z_NULL, 0); zf->crc_orig = 0; zf->method = -1; zf->bytes_left = zf->cbytes_left = 0; zf->fpos = 0; zf->buffer = NULL; zf->zstr = NULL; return zf; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_fread.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_fread.c +++ php-src/ext/zip/lib/zip_fread.c /* $NiH: zip_fread.c,v 1.21 2006/04/23 14:49:50 wiz Exp $ zip_fread.c -- read from file Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" ssize_t zip_fread(struct zip_file *zf, void *outbuf, size_t toread) { int ret; size_t out_before, len; int i; if (!zf) return -1; if (zf->error.zip_err != 0) return -1; if ((zf->flags & ZIP_ZF_EOF) || (toread == 0)) return 0; if (zf->bytes_left == 0) { zf->flags |= ZIP_ZF_EOF; if (zf->flags & ZIP_ZF_CRC) { if (zf->crc != zf->crc_orig) { _zip_error_set(&zf->error, ZIP_ER_CRC, 0); return -1; } } return 0; } if ((zf->flags & ZIP_ZF_DECOMP) == 0) { ret = _zip_file_fillbuf(outbuf, toread, zf); if (ret > 0) { if (zf->flags & ZIP_ZF_CRC) zf->crc = crc32(zf->crc, (Bytef *)outbuf, ret); zf->bytes_left -= ret; } return ret; } zf->zstr->next_out = (Bytef *)outbuf; zf->zstr->avail_out = toread; out_before = zf->zstr->total_out; /* endless loop until something has been accomplished */ for (;;) { ret = inflate(zf->zstr, Z_SYNC_FLUSH); switch (ret) { case Z_OK: case Z_STREAM_END: /* all ok */ /* Z_STREAM_END probably won't happen, since we didn't have a header */ len = zf->zstr->total_out - out_before; if (len >= zf->bytes_left || len >= toread) { if (zf->flags & ZIP_ZF_CRC) zf->crc = crc32(zf->crc, (Bytef *)outbuf, len); zf->bytes_left -= len; return len; } break; case Z_BUF_ERROR: if (zf->zstr->avail_in == 0) { i = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf); if (i == 0) { _zip_error_set(&zf->error, ZIP_ER_INCONS, 0); return -1; } else if (i < 0) return -1; zf->zstr->next_in = (Bytef *)zf->buffer; zf->zstr->avail_in = i; continue; } /* fallthrough */ case Z_NEED_DICT: case Z_DATA_ERROR: case Z_STREAM_ERROR: case Z_MEM_ERROR: _zip_error_set(&zf->error, ZIP_ER_ZLIB, ret); return -1; } } } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_free.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_free.c +++ php-src/ext/zip/lib/zip_free.c /* $NiH: zip_free.c,v 1.17 2005/06/09 19:57:10 dillo Exp $ zip_free.c -- free struct zip Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" /* _zip_free: frees the space allocated to a zipfile struct, and closes the corresponding file. */ void _zip_free(struct zip *za) { int i; if (za == NULL) return; if (za->zn) free(za->zn); if (za->zp) fclose(za->zp); _zip_cdir_free(za->cdir); if (za->entry) { for (i=0; i<za->nentry; i++) { _zip_entry_free(za->entry+i); } free(za->entry); } for (i=0; i<za->nfile; i++) { if (za->file[i]->error.zip_err == ZIP_ER_OK) { _zip_error_set(&za->file[i]->error, ZIP_ER_ZIPCLOSED, 0); za->file[i]->za = NULL; } } free(za->file); free(za); return; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_get_archive_comment.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_get_archive_comment.c +++ php-src/ext/zip/lib/zip_get_archive_comment.c /* $NiH: zip_get_archive_comment.c,v 1.4 2006/04/23 16:11:33 wiz Exp $ zip_get_archive_comment.c -- get archive comment Copyright (C) 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" const char * zip_get_archive_comment(struct zip *za, int *lenp, int flags) { if ((flags & ZIP_FL_UNCHANGED) || (za->ch_comment_len == -1)) { if (lenp != NULL) *lenp = za->cdir->comment_len; return za->cdir->comment; } if (lenp != NULL) *lenp = za->ch_comment_len; return za->ch_comment; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_get_file_comment.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_get_file_comment.c +++ php-src/ext/zip/lib/zip_get_file_comment.c /* $NiH: zip_get_file_comment.c,v 1.2 2006/04/23 13:06:28 wiz Exp $ zip_get_file_comment.c -- get file comment Copyright (C) 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" const char * zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags) { if (idx < 0 || idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((flags & ZIP_FL_UNCHANGED) || (za->entry[idx].ch_comment_len == -1)) { if (lenp != NULL) *lenp = za->cdir->entry[idx].comment_len; return za->cdir->entry[idx].comment; } if (lenp != NULL) *lenp = za->entry[idx].ch_comment_len; return za->entry[idx].ch_comment; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_get_name.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_get_name.c +++ php-src/ext/zip/lib/zip_get_name.c /* $NiH: zip_get_name.c,v 1.13 2005/01/20 21:00:54 dillo Exp $ zip_get_name.c -- get filename for a file in zip file Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" const char * zip_get_name(struct zip *za, int idx, int flags) { return _zip_get_name(za, idx, flags, &za->error); } const char * _zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error) { if (idx < 0 || idx >= za->nentry) { _zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } if ((flags & ZIP_FL_UNCHANGED) == 0) { if (za->entry[idx].state == ZIP_ST_DELETED) { _zip_error_set(error, ZIP_ER_DELETED, 0); return NULL; } if (za->entry[idx].ch_filename) return za->entry[idx].ch_filename; } if (za->cdir == NULL || idx >= za->cdir->nentry) { _zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } return za->cdir->entry[idx].filename; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_get_num_files.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_get_num_files.c +++ php-src/ext/zip/lib/zip_get_num_files.c /* $NiH: zip_get_num_files.c,v 1.2 2003/12/27 22:53:15 wiz Exp $ zip_get_num_files.c -- get number of files in archive Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_get_num_files(struct zip *za) { if (za == NULL) return -1; return za->nentry; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_memdup.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_memdup.c +++ php-src/ext/zip/lib/zip_memdup.c /* $NiH: zip_memdup.c,v 1.2 2006/04/24 10:34:39 dillo Exp $ zip_memdup.c -- internal zip function, "strdup" with len Copyright (C) 1999, 2003, 2004, 2005, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" void * _zip_memdup(const void *mem, size_t len, struct zip_error *error) { void *ret; ret = malloc(len); if (!ret) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } memcpy(ret, mem, len); return ret; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_name_locate.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_name_locate.c +++ php-src/ext/zip/lib/zip_name_locate.c /* $NiH: zip_name_locate.c,v 1.19 2005/06/09 19:57:10 dillo Exp $ zip_name_locate.c -- get index by name Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <string.h> #include "zip.h" #include "zipint.h" int zip_name_locate(struct zip *za, const char *fname, int flags) { return _zip_name_locate(za, fname, flags, &za->error); } int _zip_name_locate(struct zip *za, const char *fname, int flags, struct zip_error *error) { int (*cmp)(const char *, const char *); const char *fn, *p; int i, n; if (fname == NULL) { _zip_error_set(error, ZIP_ER_INVAL, 0); return -1; } cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; for (i=0; i<n; i++) { if (flags & ZIP_FL_UNCHANGED) fn = za->cdir->entry[i].filename; else fn = _zip_get_name(za, i, flags, error); /* newly added (partially filled) entry */ if (fn == NULL) continue; if (flags & ZIP_FL_NODIR) { p = strrchr(fn, '/'); if (p) fn = p+1; } if (cmp(fname, fn) == 0) return i; } _zip_error_set(error, ZIP_ER_NOENT, 0); return -1; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_new.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_new.c +++ php-src/ext/zip/lib/zip_new.c /* $NiH: zip_new.c,v 1.12 2006/04/23 00:40:47 wiz Exp $ zip_new.c -- create and init struct zip Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" /* _zip_new: creates a new zipfile struct, and sets the contents to zero; returns the new struct. */ struct zip * _zip_new(struct zip_error *error) { struct zip *za; za = (struct zip *)malloc(sizeof(struct zip)); if (!za) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } za->zn = NULL; za->zp = NULL; _zip_error_init(&za->error); za->cdir = NULL; za->ch_comment = NULL; za->ch_comment_len = -1; za->nentry = za->nentry_alloc = 0; za->entry = NULL; za->nfile = za->nfile_alloc = 0; za->file = NULL; return za; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_open.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_open.c +++ php-src/ext/zip/lib/zip_open.c /* $NiH: zip_open.c,v 1.38 2006/05/04 00:01:26 dillo Exp $ zip_open.c -- open zip archive Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/stat.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #ifndef _MSC_VER #include <unistd.h> #endif #include <sys/types.h> #include "zip.h" #include "zipint.h" static void set_error(int *, struct zip_error *, int); static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); static int _zip_headercomp(struct zip_dirent *, int, struct zip_dirent *, int); static unsigned char *_zip_memmem(const unsigned char *, int, const unsigned char *, int); static struct zip_cdir *_zip_readcdir(FILE *, unsigned char *, unsigned char *, int, int, struct zip_error *); struct zip * zip_open(const char *fn, int flags, int *zep) { FILE *fp; unsigned char *buf, *match; int a, i, buflen, best; struct zip *za; struct zip_cdir *cdir, *cdirnew; long len; struct stat st; struct zip_error error, err2; if (fn == NULL) { set_error(zep, NULL, ZIP_ER_INVAL); return NULL; } if (stat(fn, &st) != 0) { if (flags & ZIP_CREATE) { if ((za=_zip_new(&error)) == NULL) { set_error(zep, &error, 0); return NULL; } za->zn = strdup(fn); if (!za->zn) { _zip_free(za); set_error(zep, NULL, ZIP_ER_MEMORY); return NULL; } return za; } else { set_error(zep, NULL, ZIP_ER_OPEN); return NULL; } } else if ((flags & ZIP_EXCL)) { set_error(zep, NULL, ZIP_ER_EXISTS); return NULL; } /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL, just like open() */ if ((fp=fopen(fn, "rb")) == NULL) { set_error(zep, NULL, ZIP_ER_OPEN); return NULL; } clearerr(fp); fseek(fp, 0, SEEK_END); len = ftell(fp); i = fseek(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END); if (i == -1 && errno != EFBIG) { /* seek before start of file on my machine */ set_error(zep, NULL, ZIP_ER_SEEK); fclose(fp); return NULL; } /* 64k is too much for stack */ if ((buf=(unsigned char *)malloc(CDBUFSIZE)) == NULL) { set_error(zep, NULL, ZIP_ER_MEMORY); fclose(fp); return NULL; } clearerr(fp); buflen = fread(buf, 1, CDBUFSIZE, fp); if (ferror(fp)) { set_error(zep, NULL, ZIP_ER_READ); free(buf); fclose(fp); return NULL; } best = -2; cdir = NULL; match = buf; while ((match=_zip_memmem(match, buflen-(match-buf)-18, (const unsigned char *)EOCD_MAGIC, 4))!=NULL) { /* found match -- check, if good */ /* to avoid finding the same match all over again */ match++; if ((cdirnew=_zip_readcdir(fp, buf, match-1, buflen, flags, &err2)) == NULL) { if (best == -2) { set_error(zep, &err2, 0); best = -1; } continue; } if (cdir) { if (best <= 0) best = _zip_checkcons(fp, cdir, &err2); a = _zip_checkcons(fp, cdirnew, &err2); if (best < a) { _zip_cdir_free(cdir); cdir = cdirnew; best = a; } else _zip_cdir_free(cdirnew); } else { cdir = cdirnew; if (flags & ZIP_CHECKCONS) best = _zip_checkcons(fp, cdir, &err2); else best = 0; } cdirnew = NULL; } free(buf); if (best < 0) { /* no consistent eocd found */ if (best == -2) { /* no eocd found at all */ set_error(zep, NULL, ZIP_ER_NOZIP); } _zip_cdir_free(cdir); fclose(fp); return NULL; } if ((za=_zip_new(&error)) == NULL) { set_error(zep, &error, 0); _zip_cdir_free(cdir); fclose(fp); return NULL; } za->zp = fp; za->cdir = cdir; if ((za->zn=strdup(fn)) == NULL) { set_error(zep, NULL, ZIP_ER_MEMORY); _zip_free(za); return NULL; } if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry)) * cdir->nentry)) == NULL) { set_error(zep, NULL, ZIP_ER_MEMORY); _zip_free(za); return NULL; } for (i=0; i<cdir->nentry; i++) _zip_entry_new(za); return za; } static void set_error(int *zep, struct zip_error *err, int ze) { int se; if (err) { _zip_error_get(err, &ze, &se); if (zip_error_get_sys_type(ze) == ZIP_ET_SYS) errno = se; } if (zep) *zep = ze; } /* _zip_readcdir: tries to find a valid end-of-central-directory at the beginning of buf, and then the corresponding central directory entries. Returns a struct zip_cdir which contains the central directory entries, or NULL if unsuccessful. */ static struct zip_cdir * _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, int flags, struct zip_error *error) { struct zip_cdir *cd; unsigned char *cdp, **bufp; int i, comlen, nentry; comlen = buf + buflen - eocd - EOCDLEN; if (comlen < 0) { /* not enough bytes left for comment */ _zip_error_set(error, ZIP_ER_NOZIP, 0); return NULL; } /* check for end-of-central-dir magic */ if (memcmp(eocd, EOCD_MAGIC, 4) != 0) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return NULL; } if (memcmp(eocd+4, "\0\0\0\0", 4) != 0) { _zip_error_set(error, ZIP_ER_MULTIDISK, 0); return NULL; } cdp = eocd + 8; /* number of cdir-entries on this disk */ i = _zip_read2(&cdp); /* number of cdir-entries */ nentry = _zip_read2(&cdp); if ((cd=_zip_cdir_new(nentry, error)) == NULL) return NULL; cd->size = _zip_read4(&cdp); cd->offset = _zip_read4(&cdp); cd->comment = NULL; cd->comment_len = _zip_read2(&cdp); if ((comlen < cd->comment_len) || (cd->nentry != i)) { _zip_error_set(error, ZIP_ER_NOZIP, 0); free(cd); return NULL; } if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) { _zip_error_set(error, ZIP_ER_INCONS, 0); free(cd); return NULL; } if (cd->comment_len) if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN, cd->comment_len, error)) == NULL) { free(cd); return NULL; } cdp = eocd; if (cd->size < (unsigned int)(eocd-buf)) { /* if buffer already read in, use it */ cdp = eocd - cd->size; bufp = &cdp; } else { /* go to start of cdir and read it entry by entry */ bufp = NULL; clearerr(fp); fseek(fp, -(cd->size+cd->comment_len+EOCDLEN), SEEK_END); if (ferror(fp) || ((unsigned int)ftell(fp) != cd->offset)) { /* seek error or offset of cdir wrong */ if (ferror(fp)) _zip_error_set(error, ZIP_ER_SEEK, errno); else _zip_error_set(error, ZIP_ER_NOZIP, 0); free(cd); return NULL; } } for (i=0; i<cd->nentry; i++) { if ((_zip_dirent_read(cd->entry+i, fp, bufp, eocd-cdp, 0, error)) < 0) { cd->nentry = i; _zip_cdir_free(cd); return NULL; } } return cd; } /* _zip_checkcons: Checks the consistency of the central directory by comparing central directory entries with local headers and checking for plausible file and header offsets. Returns -1 if not plausible, else the difference between the lowest and the highest fileposition reached */ static int _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) { int i; unsigned int min, max, j; struct zip_dirent temp; if (cd->nentry) { max = cd->entry[0].offset; min = cd->entry[0].offset; } else min = max = 0; for (i=0; i<cd->nentry; i++) { if (cd->entry[i].offset < min) min = cd->entry[i].offset; if (min > cd->offset) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } j = cd->entry[i].offset + cd->entry[i].comp_size + cd->entry[i].filename_len + LENTRYSIZE; if (j > max) max = j; if (max > cd->offset) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } if (fseek(fp, cd->entry[i].offset, SEEK_SET) != 0) { _zip_error_set(error, ZIP_ER_SEEK, 0); return -1; } if (_zip_dirent_read(&temp, fp, NULL, 0, 1, error) == -1) return -1; if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { _zip_error_set(error, ZIP_ER_NOZIP, 0); _zip_dirent_finalize(&temp); return -1; } _zip_dirent_finalize(&temp); } return max - min; } /* _zip_headercomp: compares two headers h1 and h2; if they are local headers, set local1p or local2p respectively to 1, else 0. Return 0 if they are identical, -1 if not. */ static int _zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, int local2p) { if ((h1->version_needed != h2->version_needed) #if 0 /* some zip-files have different values in local and global headers for the bitflags */ || (h1->bitflags != h2->bitflags) #endif || (h1->comp_method != h2->comp_method) || (h1->last_mod != h2->last_mod) || (h1->crc != h2->crc) || (h1->comp_size != h2->comp_size) || (h1->uncomp_size != h2->uncomp_size) || (h1->filename_len != h2->filename_len) || !h1->filename || !h2->filename || strcmp(h1->filename, h2->filename)) return -1; if ((local1p == local2p) && ((h1->extrafield_len != h2->extrafield_len) || (h1->extrafield_len && h2->extrafield && memcmp(h1->extrafield, h2->extrafield, h1->extrafield_len)))) return -1; /* if either is local, nothing more to check */ if (local1p || local2p) return 0; if ((h1->version_madeby != h2->version_madeby) || (h1->disk_number != h2->disk_number) || (h1->int_attrib != h2->int_attrib) || (h1->ext_attrib != h2->ext_attrib) || (h1->offset != h2->offset) || (h1->comment_len != h2->comment_len) || (h1->comment_len && h2->comment && memcmp(h1->comment, h2->comment, h1->comment_len))) return -1; return 0; } static unsigned char * _zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, int littlelen) { const unsigned char *p; if ((biglen < littlelen) || (littlelen == 0)) return NULL; p = big-1; while ((p=(const unsigned char *) memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1))) != NULL) { if (memcmp(p+1, little+1, littlelen-1)==0) return (unsigned char *)p; } return NULL; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_rename.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_rename.c +++ php-src/ext/zip/lib/zip_rename.c /* $NiH: zip_rename.c,v 1.15 2004/11/30 22:19:38 wiz Exp $ zip_rename.c -- rename file in zip archive Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_rename(struct zip *za, int idx, const char *name) { if (idx >= za->nentry || idx < 0) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } return _zip_set_name(za, idx, name); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_replace.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_replace.c +++ php-src/ext/zip/lib/zip_replace.c /* $NiH: zip_replace.c,v 1.20 2006/04/09 14:52:02 wiz Exp $ zip_replace.c -- replace file via callback function Copyright (C) 1999, 2003, 2004, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_replace(struct zip *za, int idx, struct zip_source *source) { if (idx < 0 || idx >= za->nentry || source == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (_zip_replace(za, idx, NULL, source) == -1) return -1; return 0; } int _zip_replace(struct zip *za, int idx, const char *name, struct zip_source *source) { if (idx == -1) { if (_zip_entry_new(za) == NULL) return -1; idx = za->nentry - 1; } _zip_unchange_data(za->entry+idx); if (name && _zip_set_name(za, idx, name) != 0) return -1; za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry) ? ZIP_ST_ADDED : ZIP_ST_REPLACED); za->entry[idx].source = source; return idx; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_set_archive_comment.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_set_archive_comment.c +++ php-src/ext/zip/lib/zip_set_archive_comment.c /* $NiH: zip_set_archive_comment.c,v 1.3 2006/04/24 10:34:39 dillo Exp $ zip_set_archive_comment.c -- set archive comment Copyright (C) 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" int zip_set_archive_comment(struct zip *za, const char *comment, int len) { char *tmpcom; if (len < 0 || len > MAXCOMLEN || (len > 0 && comment == NULL)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (len > 0) { if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) return -1; } else tmpcom = NULL; free(za->ch_comment); za->ch_comment = tmpcom; za->ch_comment_len = len; return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_set_file_comment.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_set_file_comment.c +++ php-src/ext/zip/lib/zip_set_file_comment.c /* $NiH: zip_set_file_comment.c,v 1.4 2006/04/24 10:34:39 dillo Exp $ zip_set_file_comment.c -- set comment for file in archive Copyright (C) 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" int zip_set_file_comment(struct zip *za, int idx, const char *comment, int len) { char *tmpcom; if (idx < 0 || idx >= za->nentry || len < 0 || len > MAXCOMLEN || (len > 0 && comment == NULL)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (len > 0) { if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) return -1; } else tmpcom = NULL; free(za->entry[idx].ch_comment); za->entry[idx].ch_comment = tmpcom; za->entry[idx].ch_comment_len = len; return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_set_name.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_set_name.c +++ php-src/ext/zip/lib/zip_set_name.c /* $NiH: zip_set_name.c,v 1.16 2004/11/30 23:02:47 wiz Exp $ zip_set_name.c -- rename helper function Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" int _zip_set_name(struct zip *za, int idx, const char *name) { char *s; int i; if (idx < 0 || idx >= za->nentry || name == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) { _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); return -1; } /* no effective name change */ if (i == idx) return 0; if ((s=strdup(name)) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } if (za->entry[idx].state == ZIP_ST_UNCHANGED) za->entry[idx].state = ZIP_ST_RENAMED; free(za->entry[idx].ch_filename); za->entry[idx].ch_filename = s; return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_buffer.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_source_buffer.c +++ php-src/ext/zip/lib/zip_source_buffer.c /* $NiH: zip_source_buffer.c,v 1.8 2006/04/23 14:50:49 wiz Exp $ zip_source_buffer.c -- create zip data source from buffer Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" struct read_data { const char *buf, *data, *end; time_t mtime; int freep; }; static ssize_t read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd); struct zip_source * zip_source_buffer(struct zip *za, const void *data, off_t len, int freep) { struct read_data *f; struct zip_source *zs; if (za == NULL) return NULL; if (len < 0 || (data == NULL && len > 0)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((f=(struct read_data *)malloc(sizeof(*f))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } f->data = (const char *)data; f->end = ((const char *)data)+len; f->freep = freep; f->mtime = time(NULL); if ((zs=zip_source_function(za, read_data, f)) == NULL) { free(f); return NULL; } return zs; } static ssize_t read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd) { struct read_data *z; char *buf; size_t n; z = (struct read_data *)state; buf = (char *)data; switch (cmd) { case ZIP_SOURCE_OPEN: z->buf = z->data; return 0; case ZIP_SOURCE_READ: n = z->end - z->buf; if (n > len) n = len; if (n < 0) n = 0; if (n) { memcpy(buf, z->buf, n); z->buf += n; } return n; case ZIP_SOURCE_CLOSE: return 0; case ZIP_SOURCE_STAT: { struct zip_stat *st; if (len < sizeof(*st)) return -1; st = (struct zip_stat *)data; st->mtime = z->mtime; st->crc = 0; st->size = z->end - z->data; st->comp_size = -1; st->comp_method = ZIP_CM_STORE; return sizeof(*st); } case ZIP_SOURCE_ERROR: { int *e; if (len < sizeof(int)*2) return -1; e = (int *)data; e[0] = e[1] = 0; } return sizeof(int)*2; case ZIP_SOURCE_FREE: if (z->freep) { free((void *)z->data); z->data = NULL; } free(z); return 0; default: ; } return -1; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_file.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_source_file.c +++ php-src/ext/zip/lib/zip_source_file.c /* $NiH: zip_source_file.c,v 1.2 2004/11/18 16:28:13 wiz Exp $ zip_source_file.c -- create data source from file Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <errno.h> #include <stdio.h> #include "zip.h" #include "zipint.h" struct zip_source * zip_source_file(struct zip *za, const char *fname, off_t start, off_t len) { struct zip_source *zs; FILE *fp; if (za == NULL) return NULL; if (fname == NULL || start < 0 || len < -1) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((fp=fopen(fname, "rb")) == NULL) { _zip_error_set(&za->error, ZIP_ER_OPEN, errno); return NULL; } if ((zs=zip_source_filep(za, fp, start, len)) == NULL) { fclose(fp); return NULL; } return zs; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_filep.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_source_filep.c +++ php-src/ext/zip/lib/zip_source_filep.c /* $NiH: zip_source_filep.c,v 1.6 2005/06/09 19:57:10 dillo Exp $ zip_source_filep.c -- create data source from FILE * Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/stat.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" struct read_file { FILE *f; /* file to copy from */ off_t off; /* start offset of */ off_t len; /* lengt of data to copy */ off_t remain; /* bytes remaining to be copied */ int e[2]; /* error codes */ }; static ssize_t read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd); struct zip_source * zip_source_filep(struct zip *za, FILE *file, off_t start, off_t len) { struct read_file *f; struct zip_source *zs; if (za == NULL) return NULL; if (file == NULL || start < 0 || len < -1) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } f->f = file; f->off = start; f->len = (len ? len : -1); if ((zs=zip_source_function(za, read_file, f)) == NULL) { free(f); return NULL; } return zs; } static ssize_t read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) { struct read_file *z; char *buf; int i, n; z = (struct read_file *)state; buf = (char *)data; switch (cmd) { case ZIP_SOURCE_OPEN: if (fseeko(z->f, z->off, SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; return -1; } z->remain = z->len; return 0; case ZIP_SOURCE_READ: if (z->remain != -1) n = len > z->remain ? z->remain : len; else n = len; if ((i=fread(buf, 1, n, z->f)) < 0) { z->e[0] = ZIP_ER_READ; z->e[1] = errno; return -1; } if (z->remain != -1) z->remain -= i; return i; case ZIP_SOURCE_CLOSE: return 0; case ZIP_SOURCE_STAT: { struct zip_stat *st; struct stat fst; if (len < sizeof(*st)) return -1; st = (struct zip_stat *)data; if (fstat(fileno(z->f), &fst) != 0) { z->e[0] = ZIP_ER_READ; /* best match */ z->e[1] = errno; return -1; } st->mtime = fst.st_mtime; st->crc = 0; if (z->len != -1) st->size = z->len; else if ((fst.st_mode&S_IFMT) == S_IFREG) st->size = fst.st_size; else st->size = -1; st->comp_size = -1; st->comp_method = ZIP_CM_STORE; return sizeof(*st); } case ZIP_SOURCE_ERROR: if (len < sizeof(int)*2) return -1; memcpy(data, z->e, sizeof(int)*2); return sizeof(int)*2; case ZIP_SOURCE_FREE: fclose(z->f); free(z); return 0; default: ; } return -1; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_free.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_source_free.c +++ php-src/ext/zip/lib/zip_source_free.c /* $NiH: zip_source_free.c,v 1.2 2004/12/22 16:32:00 dillo Exp $ zip_source_free.c -- free zip data source Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" void zip_source_free(struct zip_source *source) { if (source == NULL) return; (void)source->f(source->ud, NULL, 0, ZIP_SOURCE_FREE); free(source); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_function.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_source_function.c +++ php-src/ext/zip/lib/zip_source_function.c /* $NiH: zip_source_function.c,v 1.4 2006/02/21 09:41:00 dillo Exp $ zip_source_function.c -- create zip data source from callback function Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" struct zip_source * zip_source_function(struct zip *za, zip_source_callback zcb, void *ud) { struct zip_source *zs; if (za == NULL) return NULL; if ((zs=(struct zip_source *)malloc(sizeof(*zs))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } zs->f = zcb; zs->ud = ud; return zs; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_zip.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_source_zip.c +++ php-src/ext/zip/lib/zip_source_zip.c /* $NiH: zip_source_zip.c,v 1.7 2006/02/21 09:41:00 dillo Exp $ zip_source_zip.c -- create data source from zip file Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <string.h> #include "zip.h" #include "zipint.h" struct read_zip { struct zip_file *zf; struct zip_stat st; off_t off, len; }; static ssize_t read_zip(void *st, void *data, size_t len, enum zip_source_cmd cmd); struct zip_source * zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, off_t start, off_t len) { struct zip_error error; struct zip_source *zs; struct read_zip *p; if (za == NULL) return NULL; if (srcza == NULL || start < 0 || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } if ((flags & ZIP_FL_UNCHANGED) == 0 && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) { _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); return NULL; } if (len == 0) len = -1; if (start == 0 && len == -1) flags |= ZIP_FL_COMPRESSED; else flags &= ~ZIP_FL_COMPRESSED; if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } _zip_error_copy(&error, &srcza->error); if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0 || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) { free(p); _zip_error_copy(&za->error, &srcza->error); _zip_error_copy(&srcza->error, &error); return NULL; } p->off = start; p->len = len; if ((flags & ZIP_FL_COMPRESSED) == 0) { p->st.size = p->st.comp_size = len; p->st.comp_method = ZIP_CM_STORE; p->st.crc = 0; } if ((zs=zip_source_function(za, read_zip, p)) == NULL) { free(p); return NULL; } return zs; } static ssize_t read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd) { struct read_zip *z; char b[8192], *buf; int i, n; z = (struct read_zip *)state; buf = (char *)data; switch (cmd) { case ZIP_SOURCE_OPEN: for (n=0; n<z->off; n+= i) { i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n); if ((i=zip_fread(z->zf, b, i)) < 0) { zip_fclose(z->zf); z->zf = NULL; return -1; } } return 0; case ZIP_SOURCE_READ: if (z->len != -1) n = len > z->len ? z->len : len; else n = len; if ((i=zip_fread(z->zf, buf, n)) < 0) return -1; if (z->len != -1) z->len -= i; return i; case ZIP_SOURCE_CLOSE: return 0; case ZIP_SOURCE_STAT: if (len < sizeof(z->st)) return -1; len = sizeof(z->st); memcpy(data, &z->st, len); return len; case ZIP_SOURCE_ERROR: { int *e; if (len < sizeof(int)*2) return -1; e = (int *)data; zip_file_error_get(z->zf, e, e+1); } return sizeof(int)*2; case ZIP_SOURCE_FREE: zip_fclose(z->zf); free(z); return 0; default: ; } return -1; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_stat.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_stat.c +++ php-src/ext/zip/lib/zip_stat.c /* $NiH: zip_stat.c,v 1.3 2004/04/16 09:40:30 dillo Exp $ zip_stat.c -- get information about file by name Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st) { int idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return -1; return zip_stat_index(za, idx, flags, st); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_stat_index.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_stat_index.c +++ php-src/ext/zip/lib/zip_stat_index.c /* $NiH: zip_stat_index.c,v 1.10 2006/04/24 14:04:19 dillo Exp $ zip_stat_index.c -- get information about file by index Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" int zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st) { const char *name; if (index < 0 || index >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if ((name=zip_get_name(za, index, flags)) == NULL) return -1; if ((flags & ZIP_FL_UNCHANGED) == 0 && ZIP_ENTRY_DATA_CHANGED(za->entry+index)) { if (za->entry[index].source->f(za->entry[index].source->ud, st, sizeof(*st), ZIP_SOURCE_STAT) < 0) { _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); return -1; } } else { if (za->cdir == NULL || index >= za->cdir->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } st->index = index; st->crc = za->cdir->entry[index].crc; st->size = za->cdir->entry[index].uncomp_size; st->mtime = za->cdir->entry[index].last_mod; st->comp_size = za->cdir->entry[index].comp_size; st->comp_method = za->cdir->entry[index].comp_method; if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) { if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { /* XXX */ st->encryption_method = ZIP_EM_UNKNOWN; } else st->encryption_method = ZIP_EM_TRAD_PKWARE; } else st->encryption_method = ZIP_EM_NONE; /* st->bitflags = za->cdir->entry[index].bitflags; */ } st->name = name; return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_strerror.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_strerror.c +++ php-src/ext/zip/lib/zip_strerror.c /* $NiH: zip_strerror.c,v 1.1 2003/10/05 16:05:22 dillo Exp $ zip_sterror.c -- get string representation of zip error Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zip.h" #include "zipint.h" const char * zip_strerror(struct zip *za) { return _zip_error_strerror(&za->error); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_unchange.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_unchange.c +++ php-src/ext/zip/lib/zip_unchange.c /* $NiH: zip_unchange.c,v 1.19 2006/04/23 13:21:18 wiz Exp $ zip_unchange.c -- undo changes to file in zip archive Copyright (C) 1999, 2004, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" int zip_unchange(struct zip *za, int idx) { return _zip_unchange(za, idx, 0); } int _zip_unchange(struct zip *za, int idx, int allow_duplicates) { int i; if (idx < 0 || idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (za->entry[idx].ch_filename) { if (!allow_duplicates) { i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL); if (i != -1 && i != idx) { _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); return -1; } } free(za->entry[idx].ch_filename); za->entry[idx].ch_filename = NULL; } free(za->entry[idx].ch_comment); za->entry[idx].ch_comment = NULL; za->entry[idx].ch_comment_len = -1; _zip_unchange_data(za->entry+idx); return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_unchange_all.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_unchange_all.c +++ php-src/ext/zip/lib/zip_unchange_all.c /* $NiH: zip_unchange_all.c,v 1.10 2006/04/23 13:14:46 wiz Exp $ zip_unchange.c -- undo changes to all files in zip archive Copyright (C) 1999, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" int zip_unchange_all(struct zip *za) { int ret, i; ret = 0; for (i=0; i<za->nentry; i++) ret |= _zip_unchange(za, i, 1); ret |= zip_unchange_archive(za); return ret; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_unchange_archive.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_unchange_archive.c +++ php-src/ext/zip/lib/zip_unchange_archive.c /* $NiH: zip_unchange_archive.c,v 1.1 2006/04/23 13:14:46 wiz Exp $ zip_unchange_archive.c -- undo global changes to ZIP archive Copyright (C) 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zip.h" #include "zipint.h" int zip_unchange_archive(struct zip *za) { free(za->ch_comment); za->ch_comment = NULL; za->ch_comment_len = -1; return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_unchange_data.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_unchange_data.c +++ php-src/ext/zip/lib/zip_unchange_data.c /* $NiH: zip_unchange_data.c,v 1.15 2004/12/22 16:32:00 dillo Exp $ zip_unchange_data.c -- undo helper function Copyright (C) 1999, 2004 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "zipint.h" void _zip_unchange_data(struct zip_entry *ze) { if (ze->source) { (void)ze->source->f(ze->source->ud, NULL, 0, ZIP_SOURCE_FREE); free(ze->source); ze->source = NULL; } ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_win32.h?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_win32.h +++ php-src/ext/zip/lib/zip_win32.h #ifdef _MSC_VER #define _POSIX_ #include <windows.h> #include <io.h> #include <fcntl.h> #ifndef ssize_t # define ssize_t SSIZE_T #endif #ifndef mode_t # define mode_t int #endif #ifndef strcasecmp # define strcasecmp stricmp #endif #ifndef snprintf # define snprintf _snprintf #endif #ifndef mkstemp # define mkstemp(t) _creat(_mktemp(t), _S_IREAD|_S_IWRITE) #endif /* #ifndef fseeko # define fseeko fseek #endif */ #endif http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zipint.h?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zipint.h +++ php-src/ext/zip/lib/zipint.h #ifndef _HAD_ZIPINT_H #define _HAD_ZIPINT_H /* $NiH: zipint.h,v 1.48 2006/04/24 14:04:19 dillo Exp $ zipint.h -- internal declarations. Copyright (C) 1999, 2003, 2004, 2005, 2006 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <nih@giga.or.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <zlib.h> #include "zip.h" #ifndef HAVE_FSEEKO #define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) #endif #define CENTRAL_MAGIC "PK\1\2" #define LOCAL_MAGIC "PK\3\4" #define EOCD_MAGIC "PK\5\6" #define DATADES_MAGIC "PK\7\8" #define CDENTRYSIZE 46u #define LENTRYSIZE 30 #define MAXCOMLEN 65536 #define EOCDLEN 22 #define CDBUFSIZE (MAXCOMLEN+EOCDLEN) #define BUFSIZE 8192 /* state of change of a file in zip archive */ enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED, ZIP_ST_ADDED, ZIP_ST_RENAMED }; /* constants for struct zip_file's member flags */ #define ZIP_ZF_EOF 1 /* EOF reached */ #define ZIP_ZF_DECOMP 2 /* decompress data */ #define ZIP_ZF_CRC 4 /* compute and compare CRC */ /* directory entry: general purpose bit flags */ #define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */ #define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */ #define ZIP_GPBF_USE_DATA_DESCRIPTOR 0x0008 /* uses crc and size from data header */ /* error information */ struct zip_error { int zip_err; /* libzip error code (ZIP_ER_*) */ int sys_err; /* copy of errno (E*) or zlib error code */ char *str; /* string representation or NULL */ }; /* zip archive, part of API */ struct zip { char *zn; /* file name */ FILE *zp; /* file */ struct zip_error error; /* error information */ struct zip_cdir *cdir; /* central directory */ char *ch_comment; /* changed archive comment */ int ch_comment_len; /* length of changed zip archive * comment, -1 if unchanged */ int nentry; /* number of entries */ int nentry_alloc; /* number of entries allocated */ struct zip_entry *entry; /* entries */ int nfile; /* number of opened files within archive */ int nfile_alloc; /* number of files allocated */ struct zip_file **file; /* opened files within archive */ }; /* file in zip archive, part of API */ struct zip_file { struct zip *za; /* zip archive containing this file */ struct zip_error error; /* error information */ int flags; /* -1: eof, >0: error */ int method; /* compression method */ long fpos; /* position within zip file (fread/fwrite) */ unsigned long bytes_left; /* number of bytes left to read */ unsigned long cbytes_left; /* number of bytes of compressed data left */ unsigned long crc; /* CRC so far */ unsigned long crc_orig; /* CRC recorded in archive */ char *buffer; z_stream *zstr; }; /* zip archive directory entry (central or local) */ struct zip_dirent { unsigned short version_madeby; /* (c) version of creator */ unsigned short version_needed; /* (cl) version needed to extract */ unsigned short bitflags; /* (cl) general purpose bit flag */ unsigned short comp_method; /* (cl) compression method used */ time_t last_mod; /* (cl) time of last modification */ unsigned int crc; /* (cl) CRC-32 of uncompressed data */ unsigned int comp_size; /* (cl) size of commpressed data */ unsigned int uncomp_size; /* (cl) size of uncommpressed data */ char *filename; /* (cl) file name (NUL-terminated) */ unsigned short filename_len; /* (cl) length of filename (w/o NUL) */ char *extrafield; /* (cl) extra field */ unsigned short extrafield_len; /* (cl) length of extra field */ char *comment; /* (c) file comment */ unsigned short comment_len; /* (c) length of file comment */ unsigned short disk_number; /* (c) disk number start */ unsigned short int_attrib; /* (c) internal file attributes */ unsigned int ext_attrib; /* (c) external file attributes */ unsigned int offset; /* (c) offset of local header */ }; /* zip archive central directory */ struct zip_cdir { struct zip_dirent *entry; /* directory entries */ int nentry; /* number of entries */ unsigned int size; /* size of central direcotry */ unsigned int offset; /* offset of central directory in file */ char *comment; /* zip archive comment */ unsigned short comment_len; /* length of zip archive comment */ }; struct zip_source { zip_source_callback f; void *ud; }; /* entry in zip archive directory */ struct zip_entry { enum zip_state state; struct zip_source *source; char *ch_filename; char *ch_comment; int ch_comment_len; }; extern const char * const _zip_err_str[]; extern const int _zip_nerr_str; extern const int _zip_err_type[]; #define ZIP_ENTRY_DATA_CHANGED(x) \ ((x)->state == ZIP_ST_REPLACED \ || (x)->state == ZIP_ST_ADDED) void _zip_cdir_free(struct zip_cdir *); struct zip_cdir *_zip_cdir_new(int, struct zip_error *); int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); void _zip_dirent_finalize(struct zip_dirent *); void _zip_dirent_init(struct zip_dirent *); int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **, unsigned int, int, struct zip_error *); int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); void _zip_entry_free(struct zip_entry *); void _zip_entry_init(struct zip *, int); struct zip_entry *_zip_entry_new(struct zip *); void _zip_error_copy(struct zip_error *, struct zip_error *); void _zip_error_fini(struct zip_error *); void _zip_error_get(struct zip_error *, int *, int *); void _zip_error_init(struct zip_error *); void _zip_error_set(struct zip_error *, int, int); const char *_zip_error_strerror(struct zip_error *); int _zip_file_fillbuf(void *, size_t, struct zip_file *); unsigned int _zip_file_get_offset(struct zip *, int); void _zip_free(struct zip *); const char *_zip_get_name(struct zip *, int, int, struct zip_error *); int _zip_local_header_read(struct zip *, int); void *_zip_memdup(const void *, size_t, struct zip_error *); int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); struct zip *_zip_new(struct zip_error *); unsigned short _zip_read2(unsigned char **); unsigned int _zip_read4(unsigned char **); int _zip_replace(struct zip *, int, const char *, struct zip_source *); int _zip_set_name(struct zip *, int, const char *); int _zip_unchange(struct zip *, int, int); void _zip_unchange_data(struct zip_entry *); #endif /* zipint.h */ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/binarynull.zip?view=markup&rev=1.1 Index: php-src/ext/zip/tests/binarynull.zip +++ php-src/ext/zip/tests/binarynull.zip PK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/bug7214.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/bug7214.phpt +++ php-src/ext/zip/tests/bug7214.phpt --TEST-- bug #7214, zip_entry_read() binary safe --SKIPIF-- <?php /* $Id: bug7214.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/binarynull.zip"); if (!is_resource($zip)) die("Failure"); $entries = 0; $entry = zip_read($zip); $contents = zip_entry_read($entry, zip_entry_filesize($entry)); if (strlen($contents) == zip_entry_filesize($entry)) { echo "Ok"; } else { echo "failed"; } ?> --EXPECT-- Ok http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/bug7658.odt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/bug7658.odt +++ php-src/ext/zip/tests/bug7658.odt PK JÁЧ? ñS’0uñÆ%)FîÙñܻÑáÐCå HFÙÃbÄ ¶ë_JŠzÏ)u‚·&úçB}± tRU&Ï©N «§ °Òž2ý•Òó1a}•¥p­í5äáÆ·h@y2µFKDÆ(à2t}3¨·VB77|mJ25…ʁ¾'3ôÌÄk_g·áÞN$… çó=Û5› ZÈëM«Uê)ÓAÝêœËq¡á4M|;O¹líçJx†„1»fÅ¹£¶ðzöÉÏ%ÔD©)éÄ3šš#ìµ`÷N2¹®3:†Â’a9†²cý­˜ڗÖåFo`ßdEÆWœrÂußæò…‹Q+Žc㢕„ùˈÎI·ÓûìÎ^5îl§Õëu·ùžœž=Ç×ËÍqö^uDUGG¢ŸãÔõÚíVûìÄ8¡)‘>##mÚQ’!%MÑÇmûS…I:ž ˆÓÇ£Q52¶«×¯œæ öt?Šô¡|0dU®ñdfø’YE{$’B{#̔­Œf0ÏكY ¢Ÿ‰”,†Áû}„"¿„?^8¬ ‘¥Tå ?ø¢ÐŒr}J¬'Ï»Ø|ÇXaƒ¦‚o¶°Çdw‹Ë‘Ãf<É[÷ý‰`=k¹S©¦þ­Æ<Å2-=8sñ, Ëò–²)èŠH <œ~Ž@*i…N dBÐ#ÊQ.‰ÒT D‘"ãÂh#F‡’Îß$ßÑ1{ΰŸó3Çêu““®¬{7¶¤>o­·àá4ì«rµª2ÝÂtb¦–@²29̰՛ðñ޳‚øú!‡qÈs·ÕэÄÅ0ÏÄ#ÕÁªáý\¹:À•ï¸ùþKºÝ`«à…hž÷.v“k‘Â4è-F?RžÐæènÎÅ0ŒâN·wrº'ùÇBñ@?Ž¢`‘J¨0‚#ö)–IƒÙÝ Ýí¨·;¯lC°&(5P†y€°·–"¡EBF´ÆÇ†î+CØÑ­’Žãå·÷Jù½„íˆS”Rt­WŠ¡¦dÚV¥ˆ^CïjŽôÇH|ÇÕóvÒ¦úA8:a¦¥øŽ´@–éaáx$ToMþê?ŸW ×®ˆ`núĔP4¥$ÏéŸ@ǨA ΰ¦OÔÜo´QŒ¶4ŠÑž¢½¶žÛ°ó3×P¾$9Áš¤ç^´o+iî—_¨•ŒžßJF·’‡¹r 'NIsåú S­¾G»f:â_Ÿ6­®õC¦—SÕÙ®»Â»˜±­E;fxÍ­C{E«œ§±çm“JA{Q†Câð°Ýèœf²! _3Cî¯ãÕâ"-â1âa@4p88ÑMáØ&¹Tü ¸N²®/Ï2ß¡é)+ôâ¹ZOXGt¶iGÃMNÜ ´£B›]QEm†Âü8òZ‰6 ªËu|4žüP嬄9K–DÐ,cŠXoÐØá‚w!ÌÄVU—©©ÂÈpúCì ڗÅ#0lÝD3*ÊP­‡ËÈ`ñÿÂÑï05rÔ=/^C81߆S¬ ¼$8™{ ­O˜ªZç–'ƒ½ä…I°' ±À‚† (´ÒˆÚ§&J6ã°2¨Â«ˆ‘{fr¼da•=d84èÀûj&£*‹'›ß>Aµ÷ `úò9Õw ô¿×«¿·2;xQ¨ÌJÐé9¢<iº72înèÕC]«  Z d ÚË ÛC¿¶•ÆàÎÔd¤>¤ïwF³ M=%”[QÈ0–ÊGÇ»xµ¾8s);D”vˆ ¢¡ýP» za;%:૾Gœ4¸ð1ÑÙFÅ¿¢E¡üìýÇÈc¶óÌn T93…ø’ùžßbŸ@ރ2wA­?d‹†<ÏP„˜¢çQißÝÜ«u×ñ-ŞòþÑhõˆÈå8ø*v2Áó <office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.0"><office:meta><meta:generator>OpenOffice.org/2.0$Linux OpenOffice.org_project/680m1$Build-8990</meta:generator><meta:initial-creator>Dario Rigolin</meta:initial-creator><meta:creation-date>2006-05-09T11:31:29</meta:creation-date><dc:date>2006-05-17T11:53:17</dc:date><dc:language>it-IT</dc:language><meta:editing-cycles>12</meta:editing-cycles><meta:editing-duration>PT1H23M43S</meta:editing-duration><meta:user-defined meta:name="Info 1"/><meta:user-defined meta:name="Info 2"/><meta:user-defined meta:name="Info 3"/><meta:user-defined meta:name="Info 4"/><meta:document-statistic meta:table-count="2" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="17! " meta:word-count="53" meta:character-count="379"/></office:meta></office:document-meta>PK µ)ï‹[ÿ½?üÈ)­µ×îºótÅýŸ¿7ß_xYÇq®©uuq7;>æ=}ç­[¿Oüý×´_µ|ç·ïWuþ§œYÖ±TtG•˜Üýëk*vÕìÊyÝüÿɽÄoó4ÞØ~i<sOÀº89Á¥áYÇÎF7+ËûÇbŸnÞå¶<\y×]çÿ[]ûÉ|¿PúžU^þM‘¯ƒ­ØÖûbÝÛ¿?æqlp=2÷^púšìëžuŠÞ<ëu{áë©3¬¯GX¹n»¼ú¥Ÿ—ýÿ7;jî˜Ý•[ܹu9O°3ó쉗svŸž«æ£?}_ÿ-¿w~ìk6éÎòoØÎ·°x÷´ý²þNyÖü÷â~5 ý¸ó™œ;Þ©%ݱ¹zïnß÷S:V'ÖõßI zÿ÷¬í⟐¨uOí~êæÞùò“éeÏ¢í;¥ÿèÚÚ.~jƲôøÏ—¹ªaÛðÁÒ¬ü´5»zÜ™Ùó~G<uù”%7;yñ×Ã@­©¿ß×ñߣkóËýáÕ²Zíµçה–smx+3{ª_Ès¿cÛktÖ?O®a~ƒEòoF|Uµ:¿¿ÁçÎì# Æþ1†'ÂÖ»´¹ž¶îôÍîçïß§9¯Îù5åè~›E½¦¸2°›ÁâóÐÇø·=¯>KöMõK{¯ñFþËÜþ¯—‚–Zš.Քo[+\ÕQXZûvyæÕóßÑÓ–ä1ԅ>ðÛ 45¯Í˜ÌI ž®~.뜚 ëð ndÒW¤;ł¾;0’º1f1(kh&Ù×úsX¡”Luh4ŸS"»Vê‡-cæäT´=u’U"ÔwØì[aþ¾îrÉÔÆ«¹äT¥¬×æ€é$39ÀR5@á`ý)<¨\B–‰sGJ4i))V¸’J0D> œ1q·½ °%څpôwÚïŽæLŽ˜$M<|!‰¼ƒñ5ÿ™t/QŠ¢e¹euÂ~N0QÁAÊgýá±òêþðý‡}¶> „ÄVóÔÖæY±x$G³ÿ(’®ªiÚ¡9*§=d3x#·‹Ó“†>ª”=uþOpº:¿o6:fb¨øž?ho.í»ñéï‘z:©Y×:Æ(MvéÄÞG'[•A꘎V®ð¿R¼–<pQ4…ÀUjƒ“çºFMÄd˜Ó՜r5“nü·D>ߨ´ÑÏÜ,0™0ÑUÀ^\¦)iíþ®0¸!öVÊmj¯ÞmUeLö9·»;\’ —ÝÐvª¬8‘ò¨T©m2$CG‚ÏG”üûâHy´©ª¦ Xçï»;û ?ܶ*ۀóÒè’<Ð{’¦’º)Érñœ?‘á ×¿›ÌƋù4k¹–5x,‹l¾½¾Œ3’36³ gu-PãÆ&‹Iövˆ‹lƦï$#‡G´ÂŠDø%3&¥ýq[’àta¸—¾Ð¼_ (LtUF„4_㋮ŒA/;k© nwV http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/bug7658.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/bug7658.phpt +++ php-src/ext/zip/tests/bug7658.phpt --TEST-- bug #7658, modify archive with general bit flag 3 set --SKIPIF-- <?php /* $Id: bug7658.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; include $dirname . 'utils.php'; $file = $dirname . '__tmp_bug7658.odt'; $zip = new ZipArchive(); copy($dirname . 'bug7658.odt', $file); if(!$zip->open($file)) { echo 'failed'; } dump_entries_name($zip); $zip->deleteName('content.xml'); $zip->addFile($dirname . "bug7658.xml","content.xml"); $zip->close(); echo "\n"; $zip->open($file); dump_entries_name($zip); @unlink($file); ?> --EXPECT-- 0 mimetype 1 Configurations2/statusbar/ 2 Configurations2/accelerator/current.xml 3 Configurations2/floater/ 4 Configurations2/popupmenu/ 5 Configurations2/progressbar/ 6 Configurations2/menubar/ 7 Configurations2/toolbar/ 8 Configurations2/images/Bitmaps/ 9 content.xml 10 styles.xml 11 meta.xml 12 Thumbnails/thumbnail.png 13 settings.xml 14 META-INF/manifest.xml 0 mimetype 1 Configurations2/statusbar/ 2 Configurations2/accelerator/current.xml 3 Configurations2/floater/ 4 Configurations2/popupmenu/ 5 Configurations2/progressbar/ 6 Configurations2/menubar/ 7 Configurations2/toolbar/ 8 Configurations2/images/Bitmaps/ 9 styles.xml 10 meta.xml 11 Thumbnails/thumbnail.png 12 settings.xml 13 META-INF/manifest.xml 14 content.xml http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/bug7658.xml?view=markup&rev=1.1 Index: php-src/ext/zip/tests/bug7658.xml +++ php-src/ext/zip/tests/bug7658.xml <?xml version="1.0" encoding="UTF-8"?> <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns! :ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0"><office:scripts/><office:font-face-decls><style:font-face style:name="Tahoma1" svg:font-family="Tahoma"/><style:font-face style:name="Arial Unicode MS" svg:font-family="&apos;Arial Unicode MS&apos;" style:font-pitch="variable"/><style:font-face style:name="Estrangelo Edessa" svg:font-family="&apos;Estrangelo Edessa&apos;" style:font-pitch="variable"/><style:font-face style:name="MS Mincho" svg:font-family="&apos;MS Mincho&apos;" style:font-pitch="variable"/><style:font-face style:name="Miriam CLM" svg:font-family="&apos;Miriam CLM&apos;" style:font-pitch="variable"/><style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:fon! t-pitch="variable"/><style:font-face style:name="Times New Roman" svg: font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/></office:font-face-decls><office:automatic-styles><style:style style:name="Tabella1" style:family="table"><style:table-properties style:width="6.6924in" table:align="margins"/></style:style><style:style style:name="Tabella1.A" style:family="table-column"><style:table-column-properties style:column-width="4.8556in" style:rel-column-width="47546*"/></style:style><style:style style:name="Tabella1.B" style:family="table-column"><style:table-column-properties style:column-width="1.8368in" style:rel-column-width="17989*"/></style:style><style:style style:name="Tabella1.A1" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="0.0007in solid #000000" fo:borde! r-bottom="0.0007in solid #000000"/></style:style><style:style style:name="Tabella1.B1" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border="0.0007in solid #000000"/></style:style><style:style style:name="Tabella1.A2" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/></style:style><style:style style:name="Tabella1.B2" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="0.0007in solid #000000" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/></style:style><style:style style:name="Tabella2" style:family="table"><style:table-properties style:width="6.6924in" table:align="margins"/></style:style><style:style style:name="Tabella2.A" style:family="table-column"><style:table-column-properties style:co! lumn-width="2.584in" style:rel-column-width="25303*"/></style:style><s tyle:style style:name="Tabella2.C" style:family="table-column"><style:table-column-properties style:column-width="1.5243in" style:rel-column-width="14929*"/></style:style><style:style style:name="Tabella2.A1" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="0.0007in solid #000000" fo:border-bottom="0.0007in solid #000000"/></style:style><style:style style:name="Tabella2.C1" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border="0.0007in solid #000000"/></style:style><style:style style:name="Tabella2.A2" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/></style:style><style:style style:name="Tabella2.C2" style:family="table-cell"><style:table-cell-properties fo:padding="0.0382in" fo:borde! r-left="0.0007in solid #000000" fo:border-right="0.0007in solid #000000" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/></style:style><style:style style:name="P1" style:family="paragraph" style:parent-style-name="Table_20_Heading"><style:text-properties style:font-name="Estrangelo Edessa" fo:font-style="italic" fo:font-weight="bold" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-style-complex="italic" style:font-weight-complex="bold"/></style:style><style:style style:name="P2" style:family="paragraph" style:parent-style-name="Table_20_Heading"><style:paragraph-properties fo:padding="0.0193in" fo:border="0.0008in solid #000000" style:shadow="none"/><style:text-properties style:font-name="Estrangelo Edessa" fo:font-style="italic" fo:font-weight="bold" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-style-complex="italic" style:font-weight-complex="bold"/></style:style><style:style style:name="P3" style:fami! ly="paragraph" style:parent-style-name="Table_20_Contents"><style:text -properties fo:color="#ff0000" style:font-name="Miriam CLM" fo:font-style="italic" fo:font-weight="bold" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-style-complex="italic" style:font-weight-complex="bold"/></style:style></office:automatic-styles><office:body><office:text><office:forms form:automatic-focus="false" form:apply-design-mode="false"/><text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls><text:p text:style-name="Standard"/><text:p text:style-name="Standard"/><text:p text:style-name="Standard">Other text Silvio Berlusconi, le ricordo che ha in prestito i seguenti libri</text:p><text:p text:style-name="Standard"/><table:table table:name="Tabella1" table:style-name="! Tabella1"><table:table-column table:style-name="Tabella1.A"/><table:table-column table:style-name="Tabella1.B"/><table:table-header-rows><table:table-row><table:table-cell table:style-name="Tabella1.A1" office:value-type="string"><text:p text:style-name="P1">Titolo</text:p></table:table-cell><table:table-cell table:style-name="Tabella1.B1" office:value-type="string"><text:p text:style-name="P1">Inventario</text:p></table:table-cell></table:table-row></table:table-header-rows><table:table-row><table:table-cell table:style-name="Tabella1.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">Codice Da Vinci</text:p></table:table-cell><table:table-cell table:style-name="Tabella1.B2" office:value-type="string"><text:p text:style-name="Table_20_Contents">112345678</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella1.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">Lo Zen e il tiro! con l&apos;arco</text:p></table:table-cell><table:table-cell table:st yle-name="Tabella1.B2" office:value-type="string"><text:p text:style-name="Table_20_Contents">1020304</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella1.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">Lo Zen e l&apos;arte della manutenzione della motocicletta</text:p></table:table-cell><table:table-cell table:style-name="Tabella1.B2" office:value-type="string"><text:p text:style-name="Table_20_Contents">1020305</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella1.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">101 Storie Zen</text:p></table:table-cell><table:table-cell table:style-name="Tabella1.B2" office:value-type="string"><text:p text:style-name="Table_20_Contents">1020306</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella1.A2" office:value-type="string"><! text:p text:style-name="Table_20_Contents">Antani di Blinda come fosse di Cappotto</text:p></table:table-cell><table:table-cell table:style-name="Tabella1.B2" office:value-type="string"><text:p text:style-name="Table_20_Contents">4112345</text:p></table:table-cell></table:table-row></table:table><text:p text:style-name="Standard"/><text:p text:style-name="Standard">peraltro, sottolineiamo la perentorietà della restituzione anche dei vieppiù interessanti testi:</text:p><text:p text:style-name="Standard"/><table:table table:name="Tabella2" table:style-name="Tabella2"><table:table-column table:style-name="Tabella2.A" table:number-columns-repeated="2"/><table:table-column table:style-name="Tabella2.C"/><table:table-header-rows><table:table-row><table:table-cell table:style-name="Tabella2.A1" office:value-type="string"><text:p text:style-name="P2">Titolo</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.A1" office:value-type="string"><text:p text:style-na! me="P2">Autore</text:p></table:table-cell><table:table-cell table:styl e-name="Tabella2.C1" office:value-type="string"><text:p text:style-name="P2">Inventario</text:p></table:table-cell></table:table-row></table:table-header-rows><table:table-row><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">Angeli e Demoni</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="P3">Dan Brown</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.C2" office:value-type="string"><text:p text:style-name="Table_20_Contents">12131415</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">La versione di Barney</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="P3">Mordecai Richler</text:p></table:table-cell! ><table:table-cell table:style-name="Tabella2.C2" office:value-type="string"><text:p text:style-name="Table_20_Contents">2010322</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">Manuale PHP</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="P3">Varii</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.C2" office:value-type="string"><text:p text:style-name="Table_20_Contents">32413543</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">La prematurata supercazzola negli anni a venire</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="P3">Ugo Togna! zzi</text:p></table:table-cell><table:table-cell table:style-name="Tab ella2.C2" office:value-type="string"><text:p text:style-name="Table_20_Contents">31213243</text:p></table:table-cell></table:table-row><table:table-row><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="Table_20_Contents">La sbiriguda in vicesindaco</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.A2" office:value-type="string"><text:p text:style-name="P3">Ugo Tognazzi</text:p></table:table-cell><table:table-cell table:style-name="Tabella2.C2" office:value-type="string"><text:p text:style-name="Table_20_Contents">1324354654</text:p></table:table-cell></table:table-row></table:table><text:p text:style-name="Standard"/><text:p text:style-name="Standard"/><text:p text:style-name="Standard">Gentili saluti, la sua biblioteca</text:p></office:text></office:body></office:document-content> http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/bug8009.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/bug8009.phpt +++ php-src/ext/zip/tests/bug8009.phpt --TEST-- bug #8009, cannot add again same entry to an archive --SKIPIF-- <?php /* $Id: bug8009.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $thisdir = dirname(__FILE__); $src = $thisdir . "/bug8009.zip"; $filename = $thisdir . "/tmp8009.zip"; copy($src, $filename); $zip = new ZipArchive(); if (!$zip->open($filename)) { exit("cannot open $filename\n"); } $zip->addFromString("2.txt", "=)"); $zip->close(); unlink($filename); echo "status: " . $zip->status . "\n"; echo "\n"; --EXPECT-- status: 0 http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/bug8009.zip?view=markup&rev=1.1 Index: php-src/ext/zip/tests/bug8009.zip +++ php-src/ext/zip/tests/bug8009.zip PK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_addfile.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_addfile.phpt +++ php-src/ext/zip/tests/oo_addfile.phpt --TEST-- ziparchive::addFile() function --SKIPIF-- <?php /* $Id: oo_addfile.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; include $dirname . 'utils.php'; $file = $dirname . '__tmp_oo_addfile.zip'; copy($dirname . 'test.zip', $file); $zip = new ZipArchive; if (!$zip->open($file)) { exit('failed'); } if (!$zip->addFile($dirname . 'utils.php', 'test.php')) { echo "failed\n"; } if ($zip->status == ZIPARCHIVE::ER_OK) { dump_entries_name($zip); $zip->close(); } else { echo "failed\n"; } @unlink($file); ?> --EXPECTF-- 0 bar 1 foobar/ 2 foobar/baz 3 entry1.txt 4 test.php http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_close.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_close.phpt +++ php-src/ext/zip/tests/oo_close.phpt --TEST-- zip::close() function --SKIPIF-- <?php /* $Id: oo_close.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; $zip = new ZipArchive; if (!$zip->open($dirname . 'test.zip')) { exit('failed'); } if ($zip->status == ZIPARCHIVE::ER_OK) { $zip->close(); echo "ok\n"; } else { echo "failed\n"; } ?> --EXPECTF-- ok http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_delete.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_delete.phpt +++ php-src/ext/zip/tests/oo_delete.phpt --TEST-- Delete entries --SKIPIF-- <?php /* $Id: oo_delete.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; $file = $dirname . '__tmp_oo_delete.zip'; if (file_exists($file)) { unlink($file); } $zip = new ZipArchive; if (!$zip->open($file, ZIPARCHIVE::CREATE)) { exit('failed'); } $zip->addFromString('entry1.txt', 'entry #1'); $zip->addFromString('entry2.txt', 'entry #2'); $zip->addFromString('dir/entry2.txt', 'entry #2'); if ($zip->status == ZIPARCHIVE::ER_OK) { $zip->close(); echo "ok\n"; } else { var_dump($zip); echo "failed\n"; } if (!$zip->open($file, ZIPARCHIVE::CREATE)) { exit('failed'); } if ($zip->deleteIndex(0)) { echo "ok\n"; } if ($zip->deleteName('entry2.txt')) { echo "ok\n"; } else { echo "failed 3\n"; } if ($zip->deleteName('dir/entry2.txt')) { echo "ok\n"; } else { echo "failed 3\n"; } if (!$zip->deleteIndex(123)) { echo "ok\n"; } else { print_r($zip); echo "failed\n"; } $sb = $zip->statIndex(0); var_dump($sb); $sb = $zip->statIndex(1); var_dump($sb); $sb = $zip->statIndex(2); var_dump($sb); @unlink($file); ?> --EXPECTF-- ok ok ok ok ok bool(false) bool(false) bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_ext_zip.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_ext_zip.phpt +++ php-src/ext/zip/tests/oo_ext_zip.phpt --TEST-- Extending Zip class and array property --SKIPIF-- <?php /* $Id: oo_ext_zip.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php class myZip extends ZipArchive { private $test = 0; public $testp = 1; private $testarray = array(); public function __construct() { $this->testarray[] = 1; var_dump($this->testarray); } } $z = new myZip; ?> --EXPECTF-- array(1) { [0]=> int(1) } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_namelocate.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_namelocate.phpt +++ php-src/ext/zip/tests/oo_namelocate.phpt --TEST-- Locate entries by name --SKIPIF-- <?php /* $Id: oo_namelocate.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; include $dirname . 'utils.php'; $file = $dirname . '__tmp_oo_rename.zip'; @unlink($file); $zip = new ZipArchive; if (!$zip->open($file, ZIPARCHIVE::CREATE)) { exit('failed'); } $zip->addFromString('entry1.txt', 'entry #1'); $zip->addFromString('entry2.txt', 'entry #2'); $zip->addFromString('dir/entry2d.txt', 'entry #2'); if (!$zip->status == ZIPARCHIVE::ER_OK) { echo "failed to write zip\n"; } $zip->close(); if (!$zip->open($file)) { exit('failed'); } echo $zip->locateName('entry1.txt') . "\n"; echo $zip->locateName('eNtry2.txt') . "\n"; echo $zip->locateName('eNtry2.txt', ZIPARCHIVE::FL_NOCASE) . "\n"; echo $zip->locateName('enTRy2d.txt', ZIPARCHIVE::FL_NOCASE|ZIPARCHIVE::FL_NODIR) . "\n"; $zip->close(); ?> --EXPECTF-- 0 -1 1 2 http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_open.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_open.phpt +++ php-src/ext/zip/tests/oo_open.phpt --TEST-- zip::open() function --SKIPIF-- <?php /* $Id: oo_open.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; $zip = new ZipArchive; $r = $zip->open($dirname . 'nofile'); if ($r !== TRUE) { echo "ER_OPEN: ok\n"; } else { echo "ER_OPEN: FAILED\n"; } $r = $zip->open($dirname . 'nofile', ZIPARCHIVE::CREATE); if (!$r) { echo "create: failed\n"; } else { echo "create: ok\n"; } @unlink($dirname . 'nofile'); $zip = new ZipArchive; $zip->open(''); if (!$zip->open($dirname . 'test.zip')) { exit("failed 1\n"); } if ($zip->status == ZIPARCHIVE::ER_OK) { echo "OK\n"; } else { echo "failed\n"; } ?> --EXPECTF-- ER_OPEN: ok create: ok Warning: ZipArchive::open(): Empty string as source in %s on line %d OK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/oo_rename.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/oo_rename.phpt +++ php-src/ext/zip/tests/oo_rename.phpt --TEST-- Rename entries --SKIPIF-- <?php /* $Id: oo_rename.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $dirname = dirname(__FILE__) . '/'; include $dirname . 'utils.php'; $file = $dirname . '__tmp_oo_rename.zip'; @unlink($file); $zip = new ZipArchive; if (!$zip->open($file, ZIPARCHIVE::CREATE)) { exit('failed'); } $zip->addFromString('entry1.txt', 'entry #1'); $zip->addFromString('entry2.txt', 'entry #2'); $zip->addFromString('dir/entry2.txt', 'entry #2'); if (!$zip->status == ZIPARCHIVE::ER_OK) { var_dump($zip); echo "failed\n"; } $zip->close(); if (!$zip->open($file)) { exit('failed'); } dump_entries_name($zip); echo "\n"; if (!$zip->renameIndex(0, 'ren_entry1.txt')) { echo "failed index 0\n"; } if (!$zip->renameName('dir/entry2.txt', 'dir3/ren_entry2.txt')) { echo "failed name dir/entry2.txt\n"; } dump_entries_name($zip); $zip->close(); @unlink($file); ?> --EXPECTF-- 0 entry1.txt 1 entry2.txt 2 dir/entry2.txt 0 ren_entry1.txt 1 entry2.txt 2 dir3/ren_entry2.txt http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/test.zip?view=markup&rev=1.1 Index: php-src/ext/zip/tests/test.zip +++ php-src/ext/zip/tests/test.zip PK PK E‰I`ºøðžœ*. http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/test_procedural.zip?view=markup&rev=1.1 Index: php-src/ext/zip/tests/test_procedural.zip +++ php-src/ext/zip/tests/test_procedural.zip PK PK PK E‰I`ºøðžœ*. http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/utils.php?view=markup&rev=1.1 Index: php-src/ext/zip/tests/utils.php +++ php-src/ext/zip/tests/utils.php <?php /* $Id: utils.php,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ function dump_entries_name($z) { for($i=0; $i<$z->numFiles; $i++) { $sb = $z->statIndex($i); echo $i . ' ' . $sb['name'] . "\n"; } } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_close.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_close.phpt +++ php-src/ext/zip/tests/zip_close.phpt --TEST-- zip_close() function --SKIPIF-- <?php /* $Id: zip_close.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); if (!is_resource($zip)) die("Failure"); zip_close($zip); echo "OK"; ?> --EXPECT-- OK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_entry_compressedsize.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_entry_compressedsize.phpt +++ php-src/ext/zip/tests/zip_entry_compressedsize.phpt --TEST-- zip_entry_compressedsize() function --SKIPIF-- <?php /* $Id: zip_entry_compressedsize.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); if (!is_resource($zip)) die("Failure"); $entries = 0; while ($entry = zip_read($zip)) { echo zip_entry_compressedsize($entry)."\n"; } zip_close($zip); ?> --EXPECT-- 5 4 0 24 http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_entry_compressionmethod.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_entry_compressionmethod.phpt +++ php-src/ext/zip/tests/zip_entry_compressionmethod.phpt --TEST-- zip_entry_compressionmethod() function --SKIPIF-- <?php /* $Id: zip_entry_compressionmethod.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); if (!is_resource($zip)) die("Failure"); $entries = 0; while ($entry = zip_read($zip)) { echo zip_entry_compressionmethod($entry)."\n"; } zip_close($zip); ?> --EXPECT-- stored stored stored deflated http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_entry_filesize.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_entry_filesize.phpt +++ php-src/ext/zip/tests/zip_entry_filesize.phpt --TEST-- zip_entry_filesize() function --SKIPIF-- <?php /* $Id: zip_entry_filesize.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); if (!is_resource($zip)) die("Failure"); $entries = 0; while ($entry = zip_read($zip)) { echo zip_entry_filesize($entry)."\n"; } zip_close($zip); ?> --EXPECT-- 5 4 0 27 http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_entry_name.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_entry_name.phpt +++ php-src/ext/zip/tests/zip_entry_name.phpt --TEST-- zip_entry_name() function --SKIPIF-- <?php /* $Id: zip_entry_name.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); if (!is_resource($zip)) die("Failure"); $entries = 0; while ($entry = zip_read($zip)) { echo zip_entry_name($entry)."\n"; } zip_close($zip); ?> --EXPECT-- foo bar foobar/ foobar/baz http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_entry_open.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_entry_open.phpt +++ php-src/ext/zip/tests/zip_entry_open.phpt --TEST-- zip_entry_open() function --SKIPIF-- <?php /* $Id: zip_entry_open.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); $entry = zip_read($zip); echo zip_entry_open($zip, $entry, "r") ? "OK" : "Failure"; zip_close($zip); ?> --EXPECT-- OK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_entry_read.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_entry_read.phpt +++ php-src/ext/zip/tests/zip_entry_read.phpt --TEST-- zip_entry_read() function --SKIPIF-- <?php /* $Id: zip_entry_read.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); $entry = zip_read($zip); if (!zip_entry_open($zip, $entry, "r")) die("Failure"); echo zip_entry_read($entry); zip_close($zip); ?> --EXPECT-- foo http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_open.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_open.phpt +++ php-src/ext/zip/tests/zip_open.phpt --TEST-- zip_open() function --SKIPIF-- <?php /* $Id: zip_open.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); echo is_resource($zip) ? "OK" : "Failure"; ?> --EXPECT-- OK http://cvs.php.net/viewvc.cgi/php-src/ext/zip/tests/zip_read.phpt?view=markup&rev=1.1 Index: php-src/ext/zip/tests/zip_read.phpt +++ php-src/ext/zip/tests/zip_read.phpt --TEST-- zip_read() function --SKIPIF-- <?php /* $Id: zip_read.phpt,v 1.1 2006/07/24 16:58:58 pajoye Exp $ */ if(!extension_loaded('zip')) die('skip'); ?> --FILE-- <?php $zip = zip_open(dirname(__FILE__)."/test_procedural.zip"); if (!is_resource($zip)) die("Failure"); $entries = 0; while ($entry = zip_read($zip)) { $entries++; } zip_close($zip); echo "$entries entries"; ?> --EXPECT-- 4 entries
« previous php.cvs (#39488) next »