Browse Source
- reimport (cannot symlink without replacing 4.4 and 5.0 versions)
migration/RELEASE_1_0_0
- reimport (cannot symlink without replacing 4.4 and 5.0 versions)
migration/RELEASE_1_0_0
102 changed files with 8730 additions and 0 deletions
-
2ext/zip/CREDITS
-
4ext/zip/TODO
-
68ext/zip/config.m4
-
37ext/zip/config.w32
-
6ext/zip/examples/comment.php
-
23ext/zip/examples/create.php
-
21ext/zip/examples/dir.php
-
28ext/zip/examples/extract.php
-
24ext/zip/examples/extractAll.php
-
35ext/zip/examples/fopen.php
-
38ext/zip/examples/get_set_comments.php
-
11ext/zip/examples/im.php
-
20ext/zip/examples/odt.php
-
17ext/zip/examples/oldapi.php
-
BINext/zip/examples/test.odt
-
BINext/zip/examples/test.zip
-
BINext/zip/examples/test1.zip
-
BINext/zip/examples/test_im.zip
-
BINext/zip/examples/test_with_comment.zip
-
2ext/zip/examples/too.php
-
136ext/zip/lib/mkstemp.c
-
3ext/zip/lib/unistd.h
-
205ext/zip/lib/zip.h
-
170ext/zip/lib/zip.h.orig
-
51ext/zip/lib/zip_add.c
-
61ext/zip/lib/zip_delete.c
-
532ext/zip/lib/zip_dirent.c
-
55ext/zip/lib/zip_entry_free.c
-
81ext/zip/lib/zip_entry_new.c
-
72ext/zip/lib/zip_err_str.c
-
95ext/zip/lib/zip_error.c
-
47ext/zip/lib/zip_error_get.c
-
50ext/zip/lib/zip_error_get_sys_type.c
-
93ext/zip/lib/zip_error_strerror.c
-
73ext/zip/lib/zip_error_to_str.c
-
74ext/zip/lib/zip_fclose.c
-
47ext/zip/lib/zip_file_error_get.c
-
80ext/zip/lib/zip_file_get_offset.c
-
47ext/zip/lib/zip_file_strerror.c
-
52ext/zip/lib/zip_fopen.c
-
219ext/zip/lib/zip_fopen_index.c
-
125ext/zip/lib/zip_fread.c
-
83ext/zip/lib/zip_free.c
-
56ext/zip/lib/zip_get_archive_comment.c
-
61ext/zip/lib/zip_get_file_comment.c
-
74ext/zip/lib/zip_get_name.c
-
50ext/zip/lib/zip_get_num_files.c
-
58ext/zip/lib/zip_memdup.c
-
91ext/zip/lib/zip_name_locate.c
-
71ext/zip/lib/zip_new.c
-
464ext/zip/lib/zip_open.c
-
52ext/zip/lib/zip_rename.c
-
79ext/zip/lib/zip_replace.c
-
68ext/zip/lib/zip_set_archive_comment.c
-
69ext/zip/lib/zip_set_file_comment.c
-
77ext/zip/lib/zip_set_name.c
-
162ext/zip/lib/zip_source_buffer.c
-
71ext/zip/lib/zip_source_file.c
-
180ext/zip/lib/zip_source_filep.c
-
54ext/zip/lib/zip_source_free.c
-
62ext/zip/lib/zip_source_function.c
-
189ext/zip/lib/zip_source_zip.c
-
52ext/zip/lib/zip_stat.c
-
93ext/zip/lib/zip_stat_index.c
-
47ext/zip/lib/zip_strerror.c
-
84ext/zip/lib/zip_unchange.c
-
56ext/zip/lib/zip_unchange_all.c
-
52ext/zip/lib/zip_unchange_archive.c
-
53ext/zip/lib/zip_unchange_data.c
-
29ext/zip/lib/zip_win32.h
-
225ext/zip/lib/zipint.h
-
362ext/zip/package.xml
-
1934ext/zip/php_zip.c
-
101ext/zip/php_zip.h
-
12ext/zip/tests/001.phpt
-
BINext/zip/tests/binarynull.zip
-
23ext/zip/tests/bug7214.phpt
-
BINext/zip/tests/bug7658.odt
-
60ext/zip/tests/bug7658.phpt
-
2ext/zip/tests/bug7658.xml
-
27ext/zip/tests/bug8009.phpt
-
BINext/zip/tests/bug8009.zip
-
37ext/zip/tests/oo_addfile.phpt
-
25ext/zip/tests/oo_close.phpt
-
76ext/zip/tests/oo_delete.phpt
-
27ext/zip/tests/oo_ext_zip.phpt
-
45ext/zip/tests/oo_namelocate.phpt
-
46ext/zip/tests/oo_open.phpt
-
58ext/zip/tests/oo_rename.phpt
-
BINext/zip/tests/test.zip
-
BINext/zip/tests/test_procedural.zip
-
8ext/zip/tests/utils.php
-
17ext/zip/tests/zip_close.phpt
-
23ext/zip/tests/zip_entry_compressedsize.phpt
-
24ext/zip/tests/zip_entry_compressionmethod.phpt
-
23ext/zip/tests/zip_entry_filesize.phpt
-
23ext/zip/tests/zip_entry_name.phpt
-
17ext/zip/tests/zip_entry_open.phpt
-
18ext/zip/tests/zip_entry_read.phpt
-
16ext/zip/tests/zip_open.phpt
@ -0,0 +1,2 @@ |
|||
Zip |
|||
Pierre-Alain Joye |
|||
@ -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 |
|||
@ -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 |
|||
@ -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"); |
|||
} |
|||
} |
|||
|
|||
@ -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(); |
|||
@ -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); |
|||
@ -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"; |
|||
@ -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(); |
|||
@ -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(); |
|||
@ -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"; |
|||
|
|||
|
|||
@ -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"; |
|||
|
|||
@ -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'); |
|||
|
|||
@ -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); |
|||
@ -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); |
|||
} |
|||
@ -0,0 +1,2 @@ |
|||
<?php |
|||
echo "too"; |
|||
@ -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*/ |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
#ifndef _MSC_VER |
|||
#include <unistd.h> |
|||
#endif |
|||
@ -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 */ |
|||
@ -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 */ |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
|
|||
|
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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, |
|||
}; |
|||
@ -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; |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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]; |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
@ -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 : "")); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
@ -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; |
|||
} |
|||
|
|||
@ -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 |
|||
@ -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 */ |
|||
@ -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
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View 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 |
|||
*/ |
|||
@ -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 |
|||
@ -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 |
|||
@ -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
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View 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 |
|||
@ -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 |
|||
@ -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 |
|||
@ -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) |
|||
@ -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) |
|||
} |
|||
@ -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 |
|||
@ -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 |
|||
@ -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 |
|||
@ -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"; |
|||
} |
|||
} |
|||
@ -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 |
|||
@ -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 |
|||
@ -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 |
|||
|
|||
@ -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 |
|||
@ -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 |
|||
@ -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 |
|||
@ -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 |
|||
@ -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 changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue