mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00
This commit was manufactured by cvs2svn to create branch 'PHP_5_2'.
This commit is contained in:
parent
467e129ce5
commit
664d102aa6
102 changed files with 8730 additions and 0 deletions
2
ext/zip/CREDITS
Normal file
2
ext/zip/CREDITS
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Zip
|
||||||
|
Pierre-Alain Joye
|
4
ext/zip/TODO
Normal file
4
ext/zip/TODO
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
- add pattern support to extract or add files
|
||||||
|
- stream to add or modify entries
|
||||||
|
- crypt support for zip (read and write)
|
||||||
|
- Iterators
|
68
ext/zip/config.m4
Normal file
68
ext/zip/config.m4
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
dnl
|
||||||
|
dnl $Id$
|
||||||
|
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
|
37
ext/zip/config.w32
Normal file
37
ext/zip/config.w32
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
// $Id$
|
||||||
|
// 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
6
ext/zip/examples/comment.php
Normal file
6
ext/zip/examples/comment.php
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?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();
|
23
ext/zip/examples/create.php
Normal file
23
ext/zip/examples/create.php
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<?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);
|
21
ext/zip/examples/dir.php
Normal file
21
ext/zip/examples/dir.php
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<?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";
|
28
ext/zip/examples/extract.php
Normal file
28
ext/zip/examples/extract.php
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?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();
|
24
ext/zip/examples/extractAll.php
Normal file
24
ext/zip/examples/extractAll.php
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?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();
|
35
ext/zip/examples/fopen.php
Normal file
35
ext/zip/examples/fopen.php
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?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";
|
||||||
|
|
||||||
|
|
38
ext/zip/examples/get_set_comments.php
Normal file
38
ext/zip/examples/get_set_comments.php
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?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";
|
||||||
|
|
11
ext/zip/examples/im.php
Normal file
11
ext/zip/examples/im.php
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
$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');
|
||||||
|
|
20
ext/zip/examples/odt.php
Normal file
20
ext/zip/examples/odt.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
$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);
|
17
ext/zip/examples/oldapi.php
Normal file
17
ext/zip/examples/oldapi.php
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?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);
|
||||||
|
}
|
BIN
ext/zip/examples/test.odt
Normal file
BIN
ext/zip/examples/test.odt
Normal file
Binary file not shown.
BIN
ext/zip/examples/test.zip
Normal file
BIN
ext/zip/examples/test.zip
Normal file
Binary file not shown.
BIN
ext/zip/examples/test1.zip
Normal file
BIN
ext/zip/examples/test1.zip
Normal file
Binary file not shown.
BIN
ext/zip/examples/test_im.zip
Normal file
BIN
ext/zip/examples/test_im.zip
Normal file
Binary file not shown.
BIN
ext/zip/examples/test_with_comment.zip
Normal file
BIN
ext/zip/examples/test_with_comment.zip
Normal file
Binary file not shown.
2
ext/zip/examples/too.php
Normal file
2
ext/zip/examples/too.php
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
<?php
|
||||||
|
echo "too";
|
136
ext/zip/lib/mkstemp.c
Normal file
136
ext/zip/lib/mkstemp.c
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
/* $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*/
|
||||||
|
}
|
3
ext/zip/lib/unistd.h
Normal file
3
ext/zip/lib/unistd.h
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
205
ext/zip/lib/zip.h
Normal file
205
ext/zip/lib/zip.h
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
#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 */
|
170
ext/zip/lib/zip.h.orig
Normal file
170
ext/zip/lib/zip.h.orig
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
#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 */
|
51
ext/zip/lib/zip_add.c
Normal file
51
ext/zip/lib/zip_add.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
61
ext/zip/lib/zip_delete.c
Normal file
61
ext/zip/lib/zip_delete.c
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
532
ext/zip/lib/zip_dirent.c
Normal file
532
ext/zip/lib/zip_dirent.c
Normal file
|
@ -0,0 +1,532 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
55
ext/zip/lib/zip_entry_free.c
Normal file
55
ext/zip/lib/zip_entry_free.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
81
ext/zip/lib/zip_entry_new.c
Normal file
81
ext/zip/lib/zip_entry_new.c
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
72
ext/zip/lib/zip_err_str.c
Normal file
72
ext/zip/lib/zip_err_str.c
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
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,
|
||||||
|
};
|
95
ext/zip/lib/zip_error.c
Normal file
95
ext/zip/lib/zip_error.c
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
}
|
47
ext/zip/lib/zip_error_get.c
Normal file
47
ext/zip/lib/zip_error_get.c
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
50
ext/zip/lib/zip_error_get_sys_type.c
Normal file
50
ext/zip/lib/zip_error_get_sys_type.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
$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];
|
||||||
|
}
|
93
ext/zip/lib/zip_error_strerror.c
Normal file
93
ext/zip/lib/zip_error_strerror.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
}
|
73
ext/zip/lib/zip_error_to_str.c
Normal file
73
ext/zip/lib/zip_error_to_str.c
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
$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 : ""));
|
||||||
|
}
|
74
ext/zip/lib/zip_fclose.c
Normal file
74
ext/zip/lib/zip_fclose.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
47
ext/zip/lib/zip_file_error_get.c
Normal file
47
ext/zip/lib/zip_file_error_get.c
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
80
ext/zip/lib/zip_file_get_offset.c
Normal file
80
ext/zip/lib/zip_file_get_offset.c
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
47
ext/zip/lib/zip_file_strerror.c
Normal file
47
ext/zip/lib/zip_file_strerror.c
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
52
ext/zip/lib/zip_fopen.c
Normal file
52
ext/zip/lib/zip_fopen.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
219
ext/zip/lib/zip_fopen_index.c
Normal file
219
ext/zip/lib/zip_fopen_index.c
Normal file
|
@ -0,0 +1,219 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
125
ext/zip/lib/zip_fread.c
Normal file
125
ext/zip/lib/zip_fread.c
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
83
ext/zip/lib/zip_free.c
Normal file
83
ext/zip/lib/zip_free.c
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
56
ext/zip/lib/zip_get_archive_comment.c
Normal file
56
ext/zip/lib/zip_get_archive_comment.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
61
ext/zip/lib/zip_get_file_comment.c
Normal file
61
ext/zip/lib/zip_get_file_comment.c
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
74
ext/zip/lib/zip_get_name.c
Normal file
74
ext/zip/lib/zip_get_name.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
50
ext/zip/lib/zip_get_num_files.c
Normal file
50
ext/zip/lib/zip_get_num_files.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
58
ext/zip/lib/zip_memdup.c
Normal file
58
ext/zip/lib/zip_memdup.c
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
91
ext/zip/lib/zip_name_locate.c
Normal file
91
ext/zip/lib/zip_name_locate.c
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
71
ext/zip/lib/zip_new.c
Normal file
71
ext/zip/lib/zip_new.c
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
464
ext/zip/lib/zip_open.c
Normal file
464
ext/zip/lib/zip_open.c
Normal file
|
@ -0,0 +1,464 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
52
ext/zip/lib/zip_rename.c
Normal file
52
ext/zip/lib/zip_rename.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
79
ext/zip/lib/zip_replace.c
Normal file
79
ext/zip/lib/zip_replace.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
68
ext/zip/lib/zip_set_archive_comment.c
Normal file
68
ext/zip/lib/zip_set_archive_comment.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
69
ext/zip/lib/zip_set_file_comment.c
Normal file
69
ext/zip/lib/zip_set_file_comment.c
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
77
ext/zip/lib/zip_set_name.c
Normal file
77
ext/zip/lib/zip_set_name.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
162
ext/zip/lib/zip_source_buffer.c
Normal file
162
ext/zip/lib/zip_source_buffer.c
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
71
ext/zip/lib/zip_source_file.c
Normal file
71
ext/zip/lib/zip_source_file.c
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
180
ext/zip/lib/zip_source_filep.c
Normal file
180
ext/zip/lib/zip_source_filep.c
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
54
ext/zip/lib/zip_source_free.c
Normal file
54
ext/zip/lib/zip_source_free.c
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
62
ext/zip/lib/zip_source_function.c
Normal file
62
ext/zip/lib/zip_source_function.c
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
189
ext/zip/lib/zip_source_zip.c
Normal file
189
ext/zip/lib/zip_source_zip.c
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
52
ext/zip/lib/zip_stat.c
Normal file
52
ext/zip/lib/zip_stat.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
93
ext/zip/lib/zip_stat_index.c
Normal file
93
ext/zip/lib/zip_stat_index.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
47
ext/zip/lib/zip_strerror.c
Normal file
47
ext/zip/lib/zip_strerror.c
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
$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);
|
||||||
|
}
|
84
ext/zip/lib/zip_unchange.c
Normal file
84
ext/zip/lib/zip_unchange.c
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
56
ext/zip/lib/zip_unchange_all.c
Normal file
56
ext/zip/lib/zip_unchange_all.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
52
ext/zip/lib/zip_unchange_archive.c
Normal file
52
ext/zip/lib/zip_unchange_archive.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
53
ext/zip/lib/zip_unchange_data.c
Normal file
53
ext/zip/lib/zip_unchange_data.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
|
29
ext/zip/lib/zip_win32.h
Normal file
29
ext/zip/lib/zip_win32.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
#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
|
225
ext/zip/lib/zipint.h
Normal file
225
ext/zip/lib/zipint.h
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
#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 */
|
362
ext/zip/package.xml
Normal file
362
ext/zip/package.xml
Normal file
|
@ -0,0 +1,362 @@
|
||||||
|
<?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>
|
1934
ext/zip/php_zip.c
Normal file
1934
ext/zip/php_zip.c
Normal file
File diff suppressed because it is too large
Load diff
101
ext/zip/php_zip.h
Normal file
101
ext/zip/php_zip.h
Normal file
|
@ -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$ */
|
||||||
|
|
||||||
|
#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
|
||||||
|
*/
|
12
ext/zip/tests/001.phpt
Normal file
12
ext/zip/tests/001.phpt
Normal file
|
@ -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
|
BIN
ext/zip/tests/binarynull.zip
Normal file
BIN
ext/zip/tests/binarynull.zip
Normal file
Binary file not shown.
23
ext/zip/tests/bug7214.phpt
Normal file
23
ext/zip/tests/bug7214.phpt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
--TEST--
|
||||||
|
bug #7214, zip_entry_read() binary safe
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
BIN
ext/zip/tests/bug7658.odt
Normal file
BIN
ext/zip/tests/bug7658.odt
Normal file
Binary file not shown.
60
ext/zip/tests/bug7658.phpt
Normal file
60
ext/zip/tests/bug7658.phpt
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
--TEST--
|
||||||
|
bug #7658, modify archive with general bit flag 3 set
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
2
ext/zip/tests/bug7658.xml
Normal file
2
ext/zip/tests/bug7658.xml
Normal file
File diff suppressed because one or more lines are too long
27
ext/zip/tests/bug8009.phpt
Normal file
27
ext/zip/tests/bug8009.phpt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
--TEST--
|
||||||
|
bug #8009, cannot add again same entry to an archive
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
BIN
ext/zip/tests/bug8009.zip
Normal file
BIN
ext/zip/tests/bug8009.zip
Normal file
Binary file not shown.
37
ext/zip/tests/oo_addfile.phpt
Normal file
37
ext/zip/tests/oo_addfile.phpt
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
--TEST--
|
||||||
|
ziparchive::addFile() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
25
ext/zip/tests/oo_close.phpt
Normal file
25
ext/zip/tests/oo_close.phpt
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
--TEST--
|
||||||
|
zip::close() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
76
ext/zip/tests/oo_delete.phpt
Normal file
76
ext/zip/tests/oo_delete.phpt
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
--TEST--
|
||||||
|
Delete entries
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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)
|
27
ext/zip/tests/oo_ext_zip.phpt
Normal file
27
ext/zip/tests/oo_ext_zip.phpt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
--TEST--
|
||||||
|
Extending Zip class and array property
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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)
|
||||||
|
}
|
45
ext/zip/tests/oo_namelocate.phpt
Normal file
45
ext/zip/tests/oo_namelocate.phpt
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
--TEST--
|
||||||
|
Locate entries by name
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
46
ext/zip/tests/oo_open.phpt
Normal file
46
ext/zip/tests/oo_open.phpt
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
--TEST--
|
||||||
|
zip::open() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
58
ext/zip/tests/oo_rename.phpt
Normal file
58
ext/zip/tests/oo_rename.phpt
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
--TEST--
|
||||||
|
Rename entries
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
BIN
ext/zip/tests/test.zip
Normal file
BIN
ext/zip/tests/test.zip
Normal file
Binary file not shown.
BIN
ext/zip/tests/test_procedural.zip
Normal file
BIN
ext/zip/tests/test_procedural.zip
Normal file
Binary file not shown.
8
ext/zip/tests/utils.php
Normal file
8
ext/zip/tests/utils.php
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
function dump_entries_name($z) {
|
||||||
|
for($i=0; $i<$z->numFiles; $i++) {
|
||||||
|
$sb = $z->statIndex($i);
|
||||||
|
echo $i . ' ' . $sb['name'] . "\n";
|
||||||
|
}
|
||||||
|
}
|
17
ext/zip/tests/zip_close.phpt
Normal file
17
ext/zip/tests/zip_close.phpt
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
--TEST--
|
||||||
|
zip_close() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
23
ext/zip/tests/zip_entry_compressedsize.phpt
Normal file
23
ext/zip/tests/zip_entry_compressedsize.phpt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
--TEST--
|
||||||
|
zip_entry_compressedsize() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
24
ext/zip/tests/zip_entry_compressionmethod.phpt
Normal file
24
ext/zip/tests/zip_entry_compressionmethod.phpt
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
--TEST--
|
||||||
|
zip_entry_compressionmethod() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
||||||
|
|
23
ext/zip/tests/zip_entry_filesize.phpt
Normal file
23
ext/zip/tests/zip_entry_filesize.phpt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
--TEST--
|
||||||
|
zip_entry_filesize() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
23
ext/zip/tests/zip_entry_name.phpt
Normal file
23
ext/zip/tests/zip_entry_name.phpt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
--TEST--
|
||||||
|
zip_entry_name() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
17
ext/zip/tests/zip_entry_open.phpt
Normal file
17
ext/zip/tests/zip_entry_open.phpt
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
--TEST--
|
||||||
|
zip_entry_open() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
18
ext/zip/tests/zip_entry_read.phpt
Normal file
18
ext/zip/tests/zip_entry_read.phpt
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
--TEST--
|
||||||
|
zip_entry_read() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
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
|
16
ext/zip/tests/zip_open.phpt
Normal file
16
ext/zip/tests/zip_open.phpt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
--TEST--
|
||||||
|
zip_open() function
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
/* $Id$ */
|
||||||
|
if(!extension_loaded('zip')) die('skip');
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
|
||||||
|
|
||||||
|
echo is_resource($zip) ? "OK" : "Failure";
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
OK
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue