This commit was manufactured by cvs2svn to create branch 'PHP_5_2'.

This commit is contained in:
SVN Migration 2006-07-24 16:58:59 +00:00
parent 467e129ce5
commit 664d102aa6
102 changed files with 8730 additions and 0 deletions

2
ext/zip/CREDITS Normal file
View file

@ -0,0 +1,2 @@
Zip
Pierre-Alain Joye

4
ext/zip/TODO Normal file
View file

@ -0,0 +1,4 @@
- add pattern support to extract or add files
- stream to add or modify entries
- crypt support for zip (read and write)
- Iterators

68
ext/zip/config.m4 Normal file
View file

@ -0,0 +1,68 @@
dnl
dnl $Id$
dnl
PHP_ARG_ENABLE(zip, for zip archive read/writesupport,
[ --enable-zip Include Zip read/write support.])
if test -z "$PHP_ZLIB_DIR"; then
PHP_ARG_WITH(zlib-dir, for the location of libz,
[ --with-zlib-dir[=DIR] zip: Set the path to libz install prefix.], no, no)
fi
if test "$PHP_ZIP" != "no"; then
if test "$PHP_ZLIB_DIR" != "no" && test "$PHP_ZLIB_DIR" != "yes"; then
if test -f "$PHP_ZLIB_DIR/include/zlib/zlib.h"; then
PHP_ZLIB_DIR="$PHP_ZLIB_DIR"
PHP_ZLIB_INCDIR="$PHP_ZLIB_DIR/include/zlib"
elif test -f "$PHP_ZLIB_DIR/include/zlib.h"; then
PHP_ZLIB_DIR="$PHP_ZLIB_DIR"
PHP_ZLIB_INCDIR="$PHP_ZLIB_DIR/include"
else
AC_MSG_ERROR([Can't find zlib headers under "$PHP_ZLIB_DIR"])
fi
else
for i in /usr/local /usr; do
if test -f "$i/include/zlib/zlib.h"; then
PHP_ZLIB_DIR="$i"
PHP_ZLIB_INCDIR="$i/include/zlib"
elif test -f "$i/include/zlib.h"; then
PHP_ZLIB_DIR="$i"
PHP_ZLIB_INCDIR="$i/include"
fi
done
fi
dnl # zlib
AC_MSG_CHECKING([for the location of zlib])
if test "$PHP_ZLIB_DIR" = "no"; then
AC_MSG_ERROR([zip support requires ZLIB. Use --with-zlib-dir=<DIR> to specify prefix where ZLIB include and library are located])
else
AC_MSG_RESULT([$PHP_ZLIB_DIR])
PHP_ADD_LIBRARY_WITH_PATH(z, $PHP_ZLIB_DIR/lib, ZIP_SHARED_LIBADD)
PHP_ADD_INCLUDE($PHP_ZLIB_INCDIR)
fi
PHP_ZIP_SOURCES="$PHP_ZIP_SOURCES lib/zip_add.c lib/zip_error.c lib/zip_fclose.c \
lib/zip_fread.c lib/zip_open.c lib/zip_source_filep.c \
lib/zip_strerror.c lib/zip_close.c lib/zip_error_get.c \
lib/zip_file_error_get.c lib/zip_free.c lib/zip_rename.c \
lib/zip_source_free.c lib/zip_unchange_all.c lib/zip_delete.c \
lib/zip_error_get_sys_type.c lib/zip_file_get_offset.c \
lib/zip_get_name.c lib/zip_replace.c lib/zip_source_function.c \
lib/zip_unchange.c lib/zip_dirent.c lib/zip_error_strerror.c \
lib/zip_file_strerror.c lib/zip_get_num_files.c \
lib/zip_set_name.c lib/zip_source_zip.c lib/zip_unchange_data.c \
lib/zip_entry_free.c lib/zip_error_to_str.c lib/zip_fopen.c \
lib/zip_name_locate.c lib/zip_source_buffer.c lib/zip_stat.c \
lib/zip_entry_new.c lib/zip_err_str.c lib/zip_fopen_index.c \
lib/zip_new.c lib/zip_source_file.c lib/zip_stat_index.c lib/zip_get_archive_comment.c \
lib/zip_get_file_comment.c lib/zip_set_archive_comment.c lib/zip_set_file_comment.c \
lib/zip_unchange_archive.c lib/zip_memdup.c"
AC_DEFINE(HAVE_ZIP,1,[ ])
PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c $PHP_ZIP_SOURCES, $ext_shared)
PHP_ADD_BUILD_DIR($ext_builddir/lib, 1)
PHP_SUBST(ZIP_SHARED_LIBADD)
fi

37
ext/zip/config.w32 Normal file
View file

@ -0,0 +1,37 @@
// $Id$
// vim:ft=javascript
ARG_ENABLE("zip", "ZIP support", "no");
if (PHP_ZIP != "no") {
if (CHECK_HEADER_ADD_INCLUDE("zlib.h", "CFLAGS_ZIP", "..\\zlib;" + php_usual_include_suspects + ";" + PHP_ZIP)) {
if (PHP_ZLIB_SHARED) {
CHECK_LIB("zlib.lib", "zip", PHP_ZIP);
}
EXTENSION('zip', 'php_zip.c zip_stream.c');
ADD_SOURCES(configure_module_dirname + "/lib", "zip_add.c zip_error.c zip_fclose.c \
zip_fread.c zip_open.c zip_source_filep.c \
zip_strerror.c zip_close.c zip_error_get.c \
zip_file_error_get.c zip_free.c zip_rename.c \
zip_source_free.c zip_unchange_all.c zip_delete.c \
zip_error_get_sys_type.c zip_file_get_offset.c \
zip_get_name.c zip_replace.c zip_source_function.c \
zip_unchange.c zip_dirent.c zip_error_strerror.c \
zip_file_strerror.c zip_get_num_files.c \
zip_set_name.c zip_source_zip.c zip_unchange_data.c \
zip_entry_free.c zip_error_to_str.c zip_fopen.c \
zip_name_locate.c zip_source_buffer.c zip_stat.c \
zip_entry_new.c zip_err_str.c zip_fopen_index.c \
zip_new.c zip_source_file.c zip_stat_index.c \
zip_get_archive_comment.c zip_get_file_comment.c \
zip_set_archive_comment.c zip_set_file_comment.c \
zip_unchange_archive.c zip_memdup.c", "zip");
AC_DEFINE('HAVE_ZLIB', 1);
AC_DEFINE('HAVE_ZIP', 1);
} else {
WARNING("zip not enabled; libraries and headers not found");
}
}

View file

@ -0,0 +1,6 @@
<?php
$z = new ZipArchive;
$z->open('test_with_comment.zip');
// Add "Foo Comment" as comment for the foo entry
$z->setCommentName('foo', 'Too Comment ' . time());
$z->close();

View file

@ -0,0 +1,23 @@
<?php
error_reporting(E_ALL);
if (!extension_loaded('zip')) {
dl('zip.so');
}
$thisdir = dirname(__FILE__);
unlink("./test112.zip");
$zip = new ZipArchive();
$filename = "./test112.zip";
if (!$zip->open($filename, ZIPARCHIVE::CREATE)) {
exit("cannot open <$filename>\n");
} else {
echo "file <$filename> OK\n";
}
$zip->addFromString("testfilephp.txt" . time(), "#1 This is a test string added as testfilephp.txt.\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 This is a test string added as testfilephp2.txt.\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo "numfiles: " . $zip->numFiles . "\n";
echo "status:" . $zip->status . "\n";
$zip->close();
unset($zip);

21
ext/zip/examples/dir.php Normal file
View file

@ -0,0 +1,21 @@
<?php
if (!extension_loaded('zip')) {
dl('zip.so');
}
$za = new ZipArchive();
$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo "numFiles: " . $za->numFiles . "\n";
echo "status: " . $za->status . "\n";
echo "statusSys: " . $za->statusSys . "\n";
echo "filename: " . $za->filename . "\n";
echo "comment: " . $za->comment . "\n";
for ($i=0; $i<$za->numFiles;$i++) {
echo "index: $i\n";
print_r($za->statIndex($i));
}
echo "numFile:" . $za->numFiles . "\n";

View file

@ -0,0 +1,28 @@
<?php
if (!extension_loaded('zip')) {
dl('zip.so');
}
$zip = new ZipArchive();
echo $zip->filename . "\n";
$zip->open("test.zip");
/*
$zip->addFile("./modules/");
$zip->addFile("./testempty");
*/
echo $zip->status . "\n";
echo $zip->statusSys . "\n";
echo $zip->numFiles . "\n";
echo $zip->filename . "\n";
var_dump($zip);
$files = array('test', 'testdir/test2');
if (!$zip->extractTo("./testext/path/to", $files)) {
echo "error!\n";
echo $zip->status . "\n";
echo $zip->statusSys . "\n";
}
$zip->close();

View file

@ -0,0 +1,24 @@
<?php
$zip = new ZipArchive();
echo $zip->filename . "\n";
$zip->open("test.zip");
/*
$zip->addFile("./modules/");
$zip->addFile("./testempty");
*/
echo $zip->status . "\n";
echo $zip->statusSys . "\n";
echo $zip->numFiles . "\n";
echo $zip->filename . "\n";
var_dump($zip);
$files = array('test', 'testdir/test2');
if (!$zip->extractTo("./testext/path/to")) {
echo "error!\n";
echo $zip->status . "\n";
echo $zip->statusSys . "\n";
}
$zip->close();

View file

@ -0,0 +1,35 @@
<?php
if (!extension_loaded('zip')) {
dl('zip.so');
}
$fp = fopen('zip://' . dirname(__FILE__) . '/test.zip#test', 'r');
if (!$fp) {
exit("cannot open\n");
}
while (!feof($fp)) {
$contents .= fread($fp, 2);
echo "$contents\n";
}
fclose($fp);
echo "done.\n";
$content = '';
$z = new ZipArchive();
$z->open(dirname(__FILE__) . '/test.zip');
$fp = $z->getStream('test');
var_dump($fp);
if(!$fp) exit("\n");
while (!feof($fp)) {
$contents .= fread($fp, 2);
}
fclose($fp);
file_put_contents('t',$contents);
echo "done.\n";

View file

@ -0,0 +1,38 @@
<?php
error_reporting(E_ALL|E_STRICT);
copy('test_with_comment.zip', 't.zip');
$z = new ZipArchive;
$z->open('t.zip');
print_r($z);
for ($i=0; $i<$z->numFiles; $i++) {
echo "index: $i\n";
print_r($z->getCommentIndex($i));
echo "\n\n";
}
echo "foobar/ " . $z->getCommentName('foobar/') . "\n";
echo "Archive comment: " . $z->getArchiveComment() . "\n";
$z->setCommentIndex(1, 'new comment idx 1');
$z->setCommentName('foobar/', 'new comment foobar/');
$z->setArchiveComment( 'new archive comment');
for ($i=0; $i<$z->numFiles; $i++) {
echo "index: $i\n";
print_r($z->getCommentIndex($i));
echo "\n\n";
}
echo $z->getCommentName('foobar/') . "\n";
// Get the original comment
echo $z->getCommentName('foobar/', ZIPARCHIVE::FL_UNCHANGED) . "\n";
echo "Archive comment: " . $z->getArchiveComment() . "\n";
echo "Archive comment (original): " . $z->getArchiveComment(ZIPARCHIVE::FL_UNCHANGED) . "\n";

11
ext/zip/examples/im.php Normal file
View file

@ -0,0 +1,11 @@
<?php
/* $Id$ */
$im = imagecreatefromgif('zip://' . dirname(__FILE__) . '/test_im.zip#pear_item.gif');
imagepng($im, 'a.png');
$z = new ZipArchive();
$z->open(dirname(__FILE__) . '/test_im.zip');
$im_string = $z->getFromName("pear_item.gif");
$im = imagecreatefromstring($im_string);
imagepng($im, 'b.png');

20
ext/zip/examples/odt.php Normal file
View file

@ -0,0 +1,20 @@
<?php
/* $Id$ */
$reader = new XMLReader();
$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while ($reader->read()) {
if ($reader->nodeType == XMLREADER::ELEMENT) {
$elm = $reader->name;
} else {
if ($reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
break;
}
if (!trim($reader->value)) {
continue;
}
$odt_meta[$elm] = $reader->value;
}
}
print_r($odt_meta);

View file

@ -0,0 +1,17 @@
<?php
$zip = zip_open('examples/test1.zip');
var_dump($zip);
if ($zip) {
$i = 0;
while ($zip_entry = zip_read($zip)) {
var_dump($zip_entry);
$txt = zip_entry_read($zip_entry, 10);
echo $i . ": " . $txt . "size: " . zip_entry_filesize($zip_entry) .
"comp_method: " . zip_entry_compressionmethod($zip_entry) .
"\n";
$i++;
}
var_dump($zip_entry);
}

BIN
ext/zip/examples/test.odt Normal file

Binary file not shown.

BIN
ext/zip/examples/test.zip Normal file

Binary file not shown.

BIN
ext/zip/examples/test1.zip Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
ext/zip/examples/too.php Normal file
View file

@ -0,0 +1,2 @@
<?php
echo "too";

136
ext/zip/lib/mkstemp.c Normal file
View file

@ -0,0 +1,136 @@
/* $NiH: mkstemp.c,v 1.3 2006/04/23 14:51:45 wiz Exp $ */
/* Adapted from NetBSB libc by Dieter Baron */
/* NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp */
/*
* Copyright (c) 1987, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
_zip_mkstemp(char *path)
{
int fd;
char *start, *trv;
struct stat sbuf;
pid_t pid;
/* To guarantee multiple calls generate unique names even if
the file is not created. 676 different possibilities with 7
or more X's, 26 with 6 or less. */
static char xtra[2] = "aa";
int xcnt = 0;
pid = getpid();
/* Move to end of path and count trailing X's. */
for (trv = path; *trv; ++trv)
if (*trv == 'X')
xcnt++;
else
xcnt = 0;
/* Use at least one from xtra. Use 2 if more than 6 X's. */
if (*(trv - 1) == 'X')
*--trv = xtra[0];
if (xcnt > 6 && *(trv - 1) == 'X')
*--trv = xtra[1];
/* Set remaining X's to pid digits with 0's to the left. */
while (*--trv == 'X') {
*trv = (pid % 10) + '0';
pid /= 10;
}
/* update xtra for next call. */
if (xtra[0] != 'z')
xtra[0]++;
else {
xtra[0] = 'a';
if (xtra[1] != 'z')
xtra[1]++;
else
xtra[1] = 'a';
}
/*
* check the target directory; if you have six X's and it
* doesn't exist this runs for a *very* long time.
*/
for (start = trv + 1;; --trv) {
if (trv <= path)
break;
if (*trv == '/') {
*trv = '\0';
if (stat(path, &sbuf))
return (0);
if (!S_ISDIR(sbuf.st_mode)) {
errno = ENOTDIR;
return (0);
}
*trv = '/';
break;
}
}
for (;;) {
if ((fd = open(path, O_CREAT | O_EXCL | O_RDWR, 0600)) >= 0)
return (1);
if (errno != EEXIST)
return (0);
/* tricky little algorithm for backward compatibility */
for (trv = start;;) {
if (!*trv)
return (0);
if (*trv == 'z')
*trv++ = 'a';
else {
if (isdigit((unsigned char)*trv))
*trv = 'a';
else
++*trv;
break;
}
}
}
/*NOTREACHED*/
}

3
ext/zip/lib/unistd.h Normal file
View file

@ -0,0 +1,3 @@
#ifndef _MSC_VER
#include <unistd.h>
#endif

205
ext/zip/lib/zip.h Normal file
View file

@ -0,0 +1,205 @@
#ifndef _HAD_ZIP_H
#define _HAD_ZIP_H
/*
$NiH: zip.h,v 1.57 2006/04/24 14:04:19 dillo Exp $
zip.h -- exported declarations.
Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <stdio.h>
#include <time.h>
#include "zip_win32.h"
/* flags for zip_open */
#define ZIP_CREATE 1
#define ZIP_EXCL 2
#define ZIP_CHECKCONS 4
/* flags for zip_name_locate, zip_fopen, zip_stat, ... */
#define ZIP_FL_NOCASE 1 /* ignore case on name lookup */
#define ZIP_FL_NODIR 2 /* ignore directory component */
#define ZIP_FL_COMPRESSED 4 /* read compressed data */
#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */
/* libzip error codes */
#define ZIP_ER_OK 0 /* N No error */
#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */
#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */
#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */
#define ZIP_ER_SEEK 4 /* S Seek error */
#define ZIP_ER_READ 5 /* S Read error */
#define ZIP_ER_WRITE 6 /* S Write error */
#define ZIP_ER_CRC 7 /* N CRC error */
#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */
#define ZIP_ER_NOENT 9 /* N No such file */
#define ZIP_ER_EXISTS 10 /* N File already exists */
#define ZIP_ER_OPEN 11 /* S Can't open file */
#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */
#define ZIP_ER_ZLIB 13 /* Z Zlib error */
#define ZIP_ER_MEMORY 14 /* N Malloc failure */
#define ZIP_ER_CHANGED 15 /* N Entry has been changed */
#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */
#define ZIP_ER_EOF 17 /* N Premature EOF */
#define ZIP_ER_INVAL 18 /* N Invalid argument */
#define ZIP_ER_NOZIP 19 /* N Not a zip archive */
#define ZIP_ER_INTERNAL 20 /* N Internal error */
#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */
#define ZIP_ER_REMOVE 22 /* S Can't remove file */
#define ZIP_ER_DELETED 23 /* N Entry has been deleted */
/* type of system error value */
#define ZIP_ET_NONE 0 /* sys_err unused */
#define ZIP_ET_SYS 1 /* sys_err is errno */
#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */
/* compression methods */
#define ZIP_CM_DEFAULT -1 /* better of deflate or store */
#define ZIP_CM_STORE 0 /* stored (uncompressed) */
#define ZIP_CM_SHRINK 1 /* shrunk */
#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */
#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */
#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */
#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */
#define ZIP_CM_IMPLODE 6 /* imploded */
/* 7 - Reserved for Tokenizing compression algorithm */
#define ZIP_CM_DEFLATE 8 /* deflated */
#define ZIP_CM_DEFLATE64 9 /* deflate64 */
#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */
/* 11 - Reserved by PKWARE */
#define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */
/* encryption methods */
#define ZIP_EM_NONE 0 /* not encrypted */
#define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */
#if 0 /* Strong Encryption Header not parsed yet */
#define ZIP_EM_DES 0x6601 /* strong encryption: DES */
#define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */
#define ZIP_EM_3DES_168 0x6603
#define ZIP_EM_3DES_112 0x6609
#define ZIP_EM_AES_128 0x660e
#define ZIP_EM_AES_192 0x660f
#define ZIP_EM_AES_256 0x6610
#define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */
#define ZIP_EM_RC4 0x6801
#endif
#define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */
enum zip_source_cmd {
ZIP_SOURCE_OPEN, /* prepare for reading */
ZIP_SOURCE_READ, /* read data */
ZIP_SOURCE_CLOSE, /* reading is done */
ZIP_SOURCE_STAT, /* get meta information */
ZIP_SOURCE_ERROR, /* get error information */
ZIP_SOURCE_FREE /* cleanup and free resources */
};
typedef ssize_t (*zip_source_callback)(void *state, void *data,
size_t len, enum zip_source_cmd cmd);
struct zip_stat {
const char *name; /* name of the file */
int index; /* index within archive */
unsigned int crc; /* crc of file data */
time_t mtime; /* modification time */
off_t size; /* size of file (uncompressed) */
off_t comp_size; /* size of file (compressed) */
unsigned short comp_method; /* compression method used */
unsigned short encryption_method; /* encryption method used */
};
struct zip;
struct zip_file;
struct zip_source;
int zip_add(struct zip *, const char *, struct zip_source *);
int zip_close(struct zip *);
int zip_delete(struct zip *, int);
void zip_error_get(struct zip *, int *, int *);
int zip_error_get_sys_type(int);
int zip_error_to_str(char *, size_t, int, int);
int zip_fclose(struct zip_file *);
void zip_file_error_get(struct zip_file *, int *, int *);
const char *zip_file_strerror(struct zip_file *);
struct zip_file *zip_fopen(struct zip *, const char *, int);
struct zip_file *zip_fopen_index(struct zip *, int, int);
ssize_t zip_fread(struct zip_file *, void *, size_t);
const char *zip_get_archive_comment(struct zip *, int *, int);
const char *zip_get_file_comment(struct zip *, int, int *, int);
const char *zip_get_name(struct zip *, int, int);
int zip_get_num_files(struct zip *);
int zip_name_locate(struct zip *, const char *, int);
struct zip *zip_open(const char *, int, int *);
int zip_rename(struct zip *, int, const char *);
int zip_replace(struct zip *, int, struct zip_source *);
int zip_set_archive_comment(struct zip *, const char *, int);
int zip_set_file_comment(struct zip *, int, const char *, int);
struct zip_source *zip_source_buffer(struct zip *, const void *, off_t, int);
struct zip_source *zip_source_file(struct zip *, const char *, off_t, off_t);
struct zip_source *zip_source_filep(struct zip *, FILE *, off_t, off_t);
void zip_source_free(struct zip_source *);
struct zip_source *zip_source_function(struct zip *,
zip_source_callback, void *);
struct zip_source *zip_source_zip(struct zip *, struct zip *, int, int,
off_t, off_t);
int zip_stat(struct zip *, const char *, int, struct zip_stat *);
int zip_stat_index(struct zip *, int, int, struct zip_stat *);
const char *zip_strerror(struct zip *);
int zip_unchange(struct zip *, int);
int zip_unchange_all(struct zip *);
int zip_unchange_archive(struct zip *);
#ifdef __cplusplus
}
#endif
#endif /* _HAD_ZIP_H */

170
ext/zip/lib/zip.h.orig Normal file
View file

@ -0,0 +1,170 @@
#ifndef _HAD_ZIP_H
#define _HAD_ZIP_H
/*
$NiH: zip.h,v 1.49 2005/06/09 19:57:09 dillo Exp $
zip.h -- exported declarations.
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/types.h>
#include <stdio.h>
#include <time.h>
/* flags for zip_open */
#define ZIP_CREATE 1
#define ZIP_EXCL 2
#define ZIP_CHECKCONS 4
/* flags for zip_name_locate, zip_fopen, zip_stat, ... */
#define ZIP_FL_NOCASE 1 /* ignore case on name lookup */
#define ZIP_FL_NODIR 2 /* ignore directory component */
#define ZIP_FL_COMPRESSED 4 /* read compressed data */
#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */
/* libzip error codes */
#define ZIP_ER_OK 0 /* N No error */
#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */
#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */
#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */
#define ZIP_ER_SEEK 4 /* S Seek error */
#define ZIP_ER_READ 5 /* S Read error */
#define ZIP_ER_WRITE 6 /* S Write error */
#define ZIP_ER_CRC 7 /* N CRC error */
#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */
#define ZIP_ER_NOENT 9 /* N No such file */
#define ZIP_ER_EXISTS 10 /* N File already exists */
#define ZIP_ER_OPEN 11 /* S Can't open file */
#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */
#define ZIP_ER_ZLIB 13 /* Z Zlib error */
#define ZIP_ER_MEMORY 14 /* N Malloc failure */
#define ZIP_ER_CHANGED 15 /* N Entry has been changed */
#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */
#define ZIP_ER_EOF 17 /* N Premature EOF */
#define ZIP_ER_INVAL 18 /* N Invalid argument */
#define ZIP_ER_NOZIP 19 /* N Not a zip archive */
#define ZIP_ER_INTERNAL 20 /* N Internal error */
#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */
#define ZIP_ER_REMOVE 22 /* S Can't remove file */
#define ZIP_ER_DELETED 23 /* N Entry has been deleted */
/* type of system error value */
#define ZIP_ET_NONE 0 /* sys_err unused */
#define ZIP_ET_SYS 1 /* sys_err is errno */
#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */
/* compression methods */
#define ZIP_CM_DEFAULT -1 /* better of deflate or store */
#define ZIP_CM_STORE 0 /* stored (uncompressed) */
#define ZIP_CM_SHRINK 1 /* shrunk */
#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */
#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */
#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */
#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */
#define ZIP_CM_IMPLODE 6 /* imploded */
/* 7 - Reserved for Tokenizing compression algorithm */
#define ZIP_CM_DEFLATE 8 /* deflated */
#define ZIP_CM_DEFLATE64 9 /* deflate64 */
#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */
enum zip_source_cmd {
ZIP_SOURCE_OPEN, /* prepare for reading */
ZIP_SOURCE_READ, /* read data */
ZIP_SOURCE_CLOSE, /* reading is done */
ZIP_SOURCE_STAT, /* get meta information */
ZIP_SOURCE_ERROR, /* get error information */
ZIP_SOURCE_FREE /* cleanup and free resources */
};
typedef ssize_t (*zip_source_callback)(void *state, void *data,
size_t len, enum zip_source_cmd cmd);
struct zip_stat {
const char *name; /* name of the file */
int index; /* index within archive */
unsigned int crc; /* crc of file data */
time_t mtime; /* modification time */
off_t size; /* size of file (uncompressed) */
off_t comp_size; /* size of file (compressed) */
unsigned short comp_method; /* compression method used */
};
struct zip;
struct zip_file;
struct zip_source;
int zip_add(struct zip *, const char *, struct zip_source *);
int zip_close(struct zip *);
int zip_delete(struct zip *, int);
void zip_error_get(struct zip *, int *, int *);
int zip_error_get_sys_type(int);
int zip_error_to_str(char *, size_t, int, int);
int zip_fclose(struct zip_file *);
void zip_file_error_get(struct zip_file *, int *, int *);
const char *zip_file_strerror(struct zip_file *);
struct zip_file *zip_fopen(struct zip *, const char *, int);
struct zip_file *zip_fopen_index(struct zip *, int, int);
ssize_t zip_fread(struct zip_file *, void *, size_t);
const char *zip_get_name(struct zip *, int, int);
int zip_get_num_files(struct zip *);
int zip_name_locate(struct zip *, const char *, int);
struct zip *zip_open(const char *, int, int *);
int zip_rename(struct zip *, int, const char *);
int zip_replace(struct zip *, int, struct zip_source *);
struct zip_source *zip_source_buffer(struct zip *, const void *, off_t, int);
struct zip_source *zip_source_file(struct zip *, const char *, off_t, off_t);
struct zip_source *zip_source_filep(struct zip *, FILE *, off_t, off_t);
void zip_source_free(struct zip_source *);
struct zip_source *zip_source_function(struct zip *,
zip_source_callback, void *);
struct zip_source *zip_source_zip(struct zip *, struct zip *, int, int,
off_t, off_t);
int zip_stat(struct zip *, const char *, int, struct zip_stat *);
int zip_stat_index(struct zip *, int, int, struct zip_stat *);
const char *zip_strerror(struct zip *);
int zip_unchange(struct zip *, int);
int zip_unchange_all(struct zip *);
#endif /* _HAD_ZIP_H */

51
ext/zip/lib/zip_add.c Normal file
View file

@ -0,0 +1,51 @@
/*
$NiH: zip_add.c,v 1.14 2004/11/18 15:04:04 wiz Exp $
zip_add.c -- add file via callback function
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_add(struct zip *za, const char *name, struct zip_source *source)
{
if (name == NULL || source == NULL) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
return _zip_replace(za, -1, name, source);
}

61
ext/zip/lib/zip_delete.c Normal file
View file

@ -0,0 +1,61 @@
/*
$NiH: zip_delete.c,v 1.17 2005/06/09 19:57:09 dillo Exp $
zip_delete.c -- delete file from zip archive
Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_delete(struct zip *za, int idx)
{
if (idx < 0 || idx >= za->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
/* allow duplicate file names, because the file will
* be removed directly afterwards */
if (_zip_unchange(za, idx, 1) != 0)
return -1;
za->entry[idx].state = ZIP_ST_DELETED;
return 0;
}

532
ext/zip/lib/zip_dirent.c Normal file
View file

@ -0,0 +1,532 @@
/*
$NiH: zip_dirent.c,v 1.9 2006/04/23 14:51:45 wiz Exp $
zip_dirent.c -- read directory entry (local or central), clean dirent
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include "zip.h"
#include "zipint.h"
static time_t _zip_d2u_time(int, int);
static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *);
static char *_zip_readstr(unsigned char **, int, int, struct zip_error *);
static void _zip_u2d_time(time_t, unsigned short *, unsigned short *);
static void _zip_write2(unsigned short, FILE *);
static void _zip_write4(unsigned int, FILE *);
void
_zip_cdir_free(struct zip_cdir *cd)
{
int i;
if (!cd)
return;
for (i=0; i<cd->nentry; i++)
_zip_dirent_finalize(cd->entry+i);
free(cd->comment);
free(cd->entry);
free(cd);
}
struct zip_cdir *
_zip_cdir_new(int nentry, struct zip_error *error)
{
struct zip_cdir *cd;
if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) {
_zip_error_set(error, ZIP_ER_MEMORY, 0);
return NULL;
}
if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry))
== NULL) {
_zip_error_set(error, ZIP_ER_MEMORY, 0);
free(cd);
return NULL;
}
/* entries must be initialized by caller */
cd->nentry = nentry;
cd->size = cd->offset = 0;
cd->comment = NULL;
cd->comment_len = 0;
return cd;
}
int
_zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error)
{
int i;
cd->offset = ftell(fp);
for (i=0; i<cd->nentry; i++) {
if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0)
return -1;
}
cd->size = ftell(fp) - cd->offset;
/* clearerr(fp); */
fwrite(EOCD_MAGIC, 1, 4, fp);
_zip_write4(0, fp);
_zip_write2((unsigned short)cd->nentry, fp);
_zip_write2((unsigned short)cd->nentry, fp);
_zip_write4(cd->size, fp);
_zip_write4(cd->offset, fp);
_zip_write2(cd->comment_len, fp);
fwrite(cd->comment, 1, cd->comment_len, fp);
if (ferror(fp)) {
_zip_error_set(error, ZIP_ER_WRITE, errno);
return -1;
}
return 0;
}
void
_zip_dirent_finalize(struct zip_dirent *zde)
{
free(zde->filename);
zde->filename = NULL;
free(zde->extrafield);
zde->extrafield = NULL;
free(zde->comment);
zde->comment = NULL;
}
void
_zip_dirent_init(struct zip_dirent *de)
{
de->version_madeby = 0;
de->version_needed = 20; /* 2.0 */
de->bitflags = 0;
de->comp_method = 0;
de->last_mod = 0;
de->crc = 0;
de->comp_size = 0;
de->uncomp_size = 0;
de->filename = NULL;
de->filename_len = 0;
de->extrafield = NULL;
de->extrafield_len = 0;
de->comment = NULL;
de->comment_len = 0;
de->disk_number = 0;
de->int_attrib = 0;
de->ext_attrib = 0;
de->offset = 0;
}
/* _zip_dirent_read(zde, fp, bufp, left, localp, error):
Fills the zip directory entry zde.
If bufp is non-NULL, data is taken from there and bufp is advanced
by the amount of data used; no more than left bytes are used.
Otherwise data is read from fp as needed.
If localp != 0, it reads a local header instead of a central
directory entry.
Returns 0 if successful. On error, error is filled in and -1 is
returned.
*/
int
_zip_dirent_read(struct zip_dirent *zde, FILE *fp,
unsigned char **bufp, unsigned int left, int localp,
struct zip_error *error)
{
unsigned char buf[CDENTRYSIZE];
unsigned char *cur;
unsigned short dostime, dosdate;
unsigned int size;
if (localp)
size = LENTRYSIZE;
else
size = CDENTRYSIZE;
if (bufp) {
/* use data from buffer */
cur = *bufp;
if (left < size) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return -1;
}
}
else {
/* read entry from disk */
if ((fread(buf, 1, size, fp)<size)) {
_zip_error_set(error, ZIP_ER_READ, errno);
return -1;
}
left = size;
cur = buf;
}
if (memcmp(cur, (localp ? LOCAL_MAGIC : CENTRAL_MAGIC), 4) != 0) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return -1;
}
cur += 4;
/* convert buffercontents to zip_dirent */
if (!localp)
zde->version_madeby = _zip_read2(&cur);
else
zde->version_madeby = 0;
zde->version_needed = _zip_read2(&cur);
zde->bitflags = _zip_read2(&cur);
zde->comp_method = _zip_read2(&cur);
/* convert to time_t */
dostime = _zip_read2(&cur);
dosdate = _zip_read2(&cur);
zde->last_mod = _zip_d2u_time(dostime, dosdate);
zde->crc = _zip_read4(&cur);
zde->comp_size = _zip_read4(&cur);
zde->uncomp_size = _zip_read4(&cur);
zde->filename_len = _zip_read2(&cur);
zde->extrafield_len = _zip_read2(&cur);
if (localp) {
zde->comment_len = 0;
zde->disk_number = 0;
zde->int_attrib = 0;
zde->ext_attrib = 0;
zde->offset = 0;
} else {
zde->comment_len = _zip_read2(&cur);
zde->disk_number = _zip_read2(&cur);
zde->int_attrib = _zip_read2(&cur);
zde->ext_attrib = _zip_read4(&cur);
zde->offset = _zip_read4(&cur);
}
zde->filename = NULL;
zde->extrafield = NULL;
zde->comment = NULL;
if (bufp) {
if (left < CDENTRYSIZE + (zde->filename_len+zde->extrafield_len
+zde->comment_len)) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return -1;
}
if (zde->filename_len) {
zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error);
if (!zde->filename)
return -1;
}
if (zde->extrafield_len) {
zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0,
error);
if (!zde->extrafield)
return -1;
}
if (zde->comment_len) {
zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error);
if (!zde->comment)
return -1;
}
}
else {
if (zde->filename_len) {
zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error);
if (!zde->filename)
return -1;
}
if (zde->extrafield_len) {
zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0,
error);
if (!zde->extrafield)
return -1;
}
if (zde->comment_len) {
zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error);
if (!zde->comment)
return -1;
}
}
if (bufp)
*bufp = cur;
return 0;
}
/* _zip_dirent_write(zde, fp, localp, error):
Writes zip directory entry zde to file fp.
If localp != 0, it writes a local header instead of a central
directory entry.
Returns 0 if successful. On error, error is filled in and -1 is
returned.
*/
int
_zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp,
struct zip_error *error)
{
unsigned short dostime, dosdate;
fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp);
if (!localp)
_zip_write2(zde->version_madeby, fp);
_zip_write2(zde->version_needed, fp);
_zip_write2(zde->bitflags, fp);
_zip_write2(zde->comp_method, fp);
_zip_u2d_time(zde->last_mod, &dostime, &dosdate);
_zip_write2(dostime, fp);
_zip_write2(dosdate, fp);
_zip_write4(zde->crc, fp);
_zip_write4(zde->comp_size, fp);
_zip_write4(zde->uncomp_size, fp);
_zip_write2(zde->filename_len, fp);
_zip_write2(zde->extrafield_len, fp);
if (!localp) {
_zip_write2(zde->comment_len, fp);
_zip_write2(zde->disk_number, fp);
_zip_write2(zde->int_attrib, fp);
_zip_write4(zde->ext_attrib, fp);
_zip_write4(zde->offset, fp);
}
if (zde->filename_len)
fwrite(zde->filename, 1, zde->filename_len, fp);
if (zde->extrafield_len)
fwrite(zde->extrafield, 1, zde->extrafield_len, fp);
if (!localp) {
if (zde->comment_len)
fwrite(zde->comment, 1, zde->comment_len, fp);
}
if (ferror(fp)) {
_zip_error_set(error, ZIP_ER_WRITE, errno);
return -1;
}
return 0;
}
static time_t
_zip_d2u_time(int dtime, int ddate)
{
struct tm *tm;
time_t now;
now = time(NULL);
tm = localtime(&now);
tm->tm_year = ((ddate>>9)&127) + 1980 - 1900;
tm->tm_mon = ((ddate>>5)&15) - 1;
tm->tm_mday = ddate&31;
tm->tm_hour = (dtime>>11)&31;
tm->tm_min = (dtime>>5)&63;
tm->tm_sec = (dtime<<1)&62;
return mktime(tm);
}
unsigned short
_zip_read2(unsigned char **a)
{
unsigned short ret;
ret = (*a)[0]+((*a)[1]<<8);
*a += 2;
return ret;
}
unsigned int
_zip_read4(unsigned char **a)
{
unsigned int ret;
ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0];
*a += 4;
return ret;
}
static char *
_zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error)
{
char *r, *o;
r = (char *)malloc(nulp ? len+1 : len);
if (!r) {
_zip_error_set(error, ZIP_ER_MEMORY, 0);
return NULL;
}
if (fread(r, 1, len, fp)<len) {
free(r);
_zip_error_set(error, ZIP_ER_READ, errno);
return NULL;
}
if (nulp) {
/* replace any in-string NUL characters with spaces */
r[len] = 0;
for (o=r; o<r+len; o++)
if (*o == '\0')
*o = ' ';
}
return r;
}
static char *
_zip_readstr(unsigned char **buf, int len, int nulp, struct zip_error *error)
{
char *r, *o;
r = (char *)malloc(nulp ? len+1 : len);
if (!r) {
_zip_error_set(error, ZIP_ER_MEMORY, 0);
return NULL;
}
memcpy(r, *buf, len);
*buf += len;
if (nulp) {
/* replace any in-string NUL characters with spaces */
r[len] = 0;
for (o=r; o<r+len; o++)
if (*o == '\0')
*o = ' ';
}
return r;
}
static void
_zip_write2(unsigned short i, FILE *fp)
{
putc(i&0xff, fp);
putc((i>>8)&0xff, fp);
return;
}
static void
_zip_write4(unsigned int i, FILE *fp)
{
putc(i&0xff, fp);
putc((i>>8)&0xff, fp);
putc((i>>16)&0xff, fp);
putc((i>>24)&0xff, fp);
return;
}
static void
_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate)
{
struct tm *tm;
tm = localtime(&time);
*ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5)
+ tm->tm_mday;
*dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5)
+ ((tm->tm_sec)>>1);
return;
}

View file

@ -0,0 +1,55 @@
/*
$NiH: zip_entry_free.c,v 1.2 2006/04/09 19:05:47 wiz Exp $
zip_entry_free.c -- free struct zip_entry
Copyright (C) 1999, 2003, 2004, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
void
_zip_entry_free(struct zip_entry *ze)
{
free(ze->ch_filename);
ze->ch_filename = NULL;
free(ze->ch_comment);
ze->ch_comment = NULL;
ze->ch_comment_len = -1;
_zip_unchange_data(ze);
}

View file

@ -0,0 +1,81 @@
/*
$NiH: zip_entry_new.c,v 1.2 2006/04/09 19:05:47 wiz Exp $
zip_entry_new.c -- create and init struct zip_entry
Copyright (C) 1999, 2003, 2004, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
struct zip_entry *
_zip_entry_new(struct zip *za)
{
struct zip_entry *ze;
if (!za) {
ze = (struct zip_entry *)malloc(sizeof(struct zip_entry));
if (!ze) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
}
else {
if (za->nentry >= za->nentry_alloc-1) {
za->nentry_alloc += 16;
za->entry = (struct zip_entry *)realloc(za->entry,
sizeof(struct zip_entry)
* za->nentry_alloc);
if (!za->entry) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
}
ze = za->entry+za->nentry;
}
ze->state = ZIP_ST_UNCHANGED;
ze->ch_filename = NULL;
ze->ch_comment = NULL;
ze->ch_comment_len = -1;
ze->source = NULL;
if (za)
za->nentry++;
return ze;
}

72
ext/zip/lib/zip_err_str.c Normal file
View file

@ -0,0 +1,72 @@
/*
This file was generated automatically by ./make_zip_err_str.sh
from ./zip.h; make changes there.
NiH: make_zip_err_str.sh,v 1.8 2004/11/17 21:55:09 wiz Exp
NiH: zip.h,v 1.57 2006/04/24 14:04:19 dillo Exp
*/
#include "zip.h"
#include "zipint.h"
const char * const _zip_err_str[] = {
"No error",
"Multi-disk zip archives not supported",
"Renaming temporary file failed",
"Closing zip archive failed",
"Seek error",
"Read error",
"Write error",
"CRC error",
"Containing zip archive was closed",
"No such file",
"File already exists",
"Can't open file",
"Failure to create temporary file",
"Zlib error",
"Malloc failure",
"Entry has been changed",
"Compression method not supported",
"Premature EOF",
"Invalid argument",
"Not a zip archive",
"Internal error",
"Zip archive inconsistent",
"Can't remove file",
"Entry has been deleted",
};
const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]);
#define N ZIP_ET_NONE
#define S ZIP_ET_SYS
#define Z ZIP_ET_ZLIB
const int _zip_err_type[] = {
N,
N,
S,
S,
S,
S,
S,
N,
N,
N,
N,
S,
S,
Z,
N,
N,
N,
N,
N,
N,
N,
N,
S,
N,
};

95
ext/zip/lib/zip_error.c Normal file
View file

@ -0,0 +1,95 @@
/*
$NiH: zip_error.c,v 1.7 2005/06/09 19:57:09 dillo Exp $
zip_error.c -- struct zip_error helper functions
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
void
_zip_error_copy(struct zip_error *dst, struct zip_error *src)
{
dst->zip_err = src->zip_err;
dst->sys_err = src->sys_err;
}
void
_zip_error_fini(struct zip_error *err)
{
free(err->str);
err->str = NULL;
}
void
_zip_error_get(struct zip_error *err, int *zep, int *sep)
{
if (zep)
*zep = err->zip_err;
if (sep) {
if (zip_error_get_sys_type(err->zip_err) != ZIP_ET_NONE)
*sep = err->sys_err;
else
*sep = 0;
}
}
void
_zip_error_init(struct zip_error *err)
{
err->zip_err = 0;
err->sys_err = 0;
err->str = NULL;
}
void
_zip_error_set(struct zip_error *err, int ze, int se)
{
if (err) {
err->zip_err = ze;
err->sys_err = se;
}
}

View file

@ -0,0 +1,47 @@
/*
$NiH: zip_error_get.c,v 1.1 2004/11/18 15:06:20 wiz Exp $
zip_error_get.c -- get zip error
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
void
zip_error_get(struct zip *za, int *zep, int *sep)
{
_zip_error_get(&za->error, zep, sep);
}

View file

@ -0,0 +1,50 @@
/*
$NiH: zip_error_get_sys_type.c,v 1.1 2004/12/22 15:49:18 wiz Exp $
zip_error_get_sys_type.c -- return type of system error code
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_error_get_sys_type(int ze)
{
if (ze < 0 || ze >= _zip_nerr_str)
return 0;
return _zip_err_type[ze];
}

View file

@ -0,0 +1,93 @@
/*
$NiH: zip_error_strerror.c,v 1.4 2006/02/21 09:41:00 dillo Exp $
zip_error_sterror.c -- get string representation of struct zip_error
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
const char *
_zip_error_strerror(struct zip_error *err)
{
const char *zs, *ss;
char buf[128], *s;
_zip_error_fini(err);
if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) {
sprintf(buf, "Unknown error %d", err->zip_err);
zs = NULL;
ss = buf;
}
else {
zs = _zip_err_str[err->zip_err];
switch (_zip_err_type[err->zip_err]) {
case ZIP_ET_SYS:
ss = strerror(err->sys_err);
break;
case ZIP_ET_ZLIB:
ss = zError(err->sys_err);
break;
default:
ss = NULL;
}
}
if (ss == NULL)
return zs;
else {
if ((s=(char *)malloc(strlen(ss)
+ (zs ? strlen(zs)+2 : 0) + 1)) == NULL)
return _zip_err_str[ZIP_ER_MEMORY];
sprintf(s, "%s%s%s",
(zs ? zs : ""),
(zs ? ": " : ""),
ss);
err->str = s;
return ss;
}
}

View file

@ -0,0 +1,73 @@
/*
$NiH: zip_error_to_str.c,v 1.1 2004/11/18 15:06:20 wiz Exp $
zip_error_to_str.c -- get string representation of zip error code
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
int
zip_error_to_str(char *buf, size_t len, int ze, int se)
{
const char *zs, *ss;
if (ze < 0 || ze >= _zip_nerr_str)
return snprintf(buf, len, "Unknown error %d", ze);
zs = _zip_err_str[ze];
switch (_zip_err_type[ze]) {
case ZIP_ET_SYS:
ss = strerror(se);
break;
case ZIP_ET_ZLIB:
ss = zError(se);
break;
default:
ss = NULL;
}
return snprintf(buf, len, "%s%s%s",
zs, (ss ? ": " : ""), (ss ? ss : ""));
}

74
ext/zip/lib/zip_fclose.c Normal file
View file

@ -0,0 +1,74 @@
/*
$NiH: zip_fclose.c,v 1.14 2005/06/09 19:57:09 dillo Exp $
zip_fclose.c -- close file in zip archive
Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
int
zip_fclose(struct zip_file *zf)
{
int i, ret;
if (zf->zstr)
inflateEnd(zf->zstr);
free(zf->buffer);
free(zf->zstr);
for (i=0; i<zf->za->nfile; i++) {
if (zf->za->file[i] == zf) {
zf->za->file[i] = zf->za->file[zf->za->nfile-1];
zf->za->nfile--;
break;
}
}
ret = 0;
if (zf->error.zip_err)
ret = zf->error.zip_err;
else if ((zf->flags & ZIP_ZF_CRC) && (zf->flags & ZIP_ZF_EOF)) {
/* if EOF, compare CRC */
if (zf->crc_orig != zf->crc)
ret = ZIP_ER_CRC;
}
free(zf);
return ret;
}

View file

@ -0,0 +1,47 @@
/*
$NiH: zip_file_error_get.c,v 1.1 2004/11/18 15:06:21 wiz Exp $
zip_file_error_get.c -- get zip file error
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
void
zip_file_error_get(struct zip_file *zf, int *zep, int *sep)
{
_zip_error_get(&zf->error, zep, sep);
}

View file

@ -0,0 +1,80 @@
/*
$NiH: zip_file_get_offset.c,v 1.4 2006/04/23 14:51:45 wiz Exp $
zip_file_get_offset.c -- get offset of file data in archive.
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include "zip.h"
#include "zipint.h"
/* _zip_file_get_offset(za, ze):
Returns the offset of the file data for entry ze.
On error, fills in za->error and returns 0.
*/
unsigned int
_zip_file_get_offset(struct zip *za, int idx)
{
struct zip_dirent de;
unsigned int offset;
offset = za->cdir->entry[idx].offset;
if (fseek(za->zp, offset, SEEK_SET) != 0) {
_zip_error_set(&za->error, ZIP_ER_SEEK, errno);
return 0;
}
if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0)
return 0;
offset += LENTRYSIZE + de.filename_len + de.extrafield_len;
_zip_dirent_finalize(&de);
return offset;
}

View file

@ -0,0 +1,47 @@
/*
$NiH: zip_file_strerror.c,v 1.1 2003/10/05 16:05:22 dillo Exp $
zip_file_sterror.c -- get string representation of zip file error
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
const char *
zip_file_strerror(struct zip_file *zf)
{
return _zip_error_strerror(&zf->error);
}

52
ext/zip/lib/zip_fopen.c Normal file
View file

@ -0,0 +1,52 @@
/*
$NiH: zip_fopen.c,v 1.12 2005/06/09 19:57:09 dillo Exp $
zip_fopen.c -- open file in zip archive for reading
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
struct zip_file *
zip_fopen(struct zip *za, const char *fname, int flags)
{
int idx;
if ((idx=zip_name_locate(za, fname, flags)) < 0)
return NULL;
return zip_fopen_index(za, idx, flags);
}

View file

@ -0,0 +1,219 @@
/*
$NiH: zip_fopen_index.c,v 1.24 2005/05/20 21:54:53 wiz Exp $
zip_fopen_index.c -- open file in zip archive for reading by index
Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
static struct zip_file *_zip_file_new(struct zip *za);
struct zip_file *
zip_fopen_index(struct zip *za, int fileno, int flags)
{
int len, ret;
int zfflags;
struct zip_file *zf;
if ((fileno < 0) || (fileno >= za->nentry)) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((flags & ZIP_FL_UNCHANGED) == 0
&& ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) {
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
return NULL;
}
if (fileno >= za->cdir->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
zfflags = 0;
switch (za->cdir->entry[fileno].comp_method) {
case ZIP_CM_STORE:
zfflags |= ZIP_ZF_CRC;
break;
case ZIP_CM_DEFLATE:
if ((flags & ZIP_FL_COMPRESSED) == 0)
zfflags |= ZIP_ZF_CRC | ZIP_ZF_DECOMP;
break;
default:
if ((flags & ZIP_FL_COMPRESSED) == 0) {
_zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
return NULL;
}
break;
}
zf = _zip_file_new(za);
zf->flags = zfflags;
/* zf->name = za->cdir->entry[fileno].filename; */
zf->method = za->cdir->entry[fileno].comp_method;
zf->bytes_left = za->cdir->entry[fileno].uncomp_size;
zf->cbytes_left = za->cdir->entry[fileno].comp_size;
zf->crc_orig = za->cdir->entry[fileno].crc;
if ((zf->fpos=_zip_file_get_offset(za, fileno)) == 0) {
zip_fclose(zf);
return NULL;
}
if ((zf->flags & ZIP_ZF_DECOMP) == 0)
zf->bytes_left = zf->cbytes_left;
else {
if ((zf->buffer=(char *)malloc(BUFSIZE)) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
zip_fclose(zf);
return NULL;
}
len = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf);
if (len <= 0) {
_zip_error_copy(&za->error, &zf->error);
zip_fclose(zf);
return NULL;
}
if ((zf->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
zip_fclose(zf);
return NULL;
}
zf->zstr->zalloc = Z_NULL;
zf->zstr->zfree = Z_NULL;
zf->zstr->opaque = NULL;
zf->zstr->next_in = (Bytef *)zf->buffer;
zf->zstr->avail_in = len;
/* negative value to tell zlib that there is no header */
if ((ret=inflateInit2(zf->zstr, -MAX_WBITS)) != Z_OK) {
_zip_error_set(&za->error, ZIP_ER_ZLIB, ret);
zip_fclose(zf);
return NULL;
}
}
return zf;
}
int
_zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf)
{
int i, j;
if (zf->error.zip_err != ZIP_ER_OK)
return -1;
if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0)
return 0;
if (fseek(zf->za->zp, zf->fpos, SEEK_SET) < 0) {
_zip_error_set(&zf->error, ZIP_ER_SEEK, errno);
return -1;
}
if (buflen < zf->cbytes_left)
i = buflen;
else
i = zf->cbytes_left;
j = fread(buf, 1, i, zf->za->zp);
if (j == 0) {
_zip_error_set(&zf->error, ZIP_ER_EOF, 0);
j = -1;
}
else if (j < 0)
_zip_error_set(&zf->error, ZIP_ER_READ, errno);
else {
zf->fpos += j;
zf->cbytes_left -= j;
}
return j;
}
static struct zip_file *
_zip_file_new(struct zip *za)
{
struct zip_file *zf, **file;
int n;
if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
if (za->nfile >= za->nfile_alloc-1) {
n = za->nfile_alloc + 10;
file = (struct zip_file **)realloc(za->file,
n*sizeof(struct zip_file *));
if (file == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
free(zf);
return NULL;
}
za->nfile_alloc = n;
za->file = file;
}
za->file[za->nfile++] = zf;
zf->za = za;
_zip_error_init(&zf->error);
zf->flags = 0;
zf->crc = crc32(0L, Z_NULL, 0);
zf->crc_orig = 0;
zf->method = -1;
zf->bytes_left = zf->cbytes_left = 0;
zf->fpos = 0;
zf->buffer = NULL;
zf->zstr = NULL;
return zf;
}

125
ext/zip/lib/zip_fread.c Normal file
View file

@ -0,0 +1,125 @@
/*
$NiH: zip_fread.c,v 1.21 2006/04/23 14:49:50 wiz Exp $
zip_fread.c -- read from file
Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
ssize_t
zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
{
int ret;
size_t out_before, len;
int i;
if (!zf)
return -1;
if (zf->error.zip_err != 0)
return -1;
if ((zf->flags & ZIP_ZF_EOF) || (toread == 0))
return 0;
if (zf->bytes_left == 0) {
zf->flags |= ZIP_ZF_EOF;
if (zf->flags & ZIP_ZF_CRC) {
if (zf->crc != zf->crc_orig) {
_zip_error_set(&zf->error, ZIP_ER_CRC, 0);
return -1;
}
}
return 0;
}
if ((zf->flags & ZIP_ZF_DECOMP) == 0) {
ret = _zip_file_fillbuf(outbuf, toread, zf);
if (ret > 0) {
if (zf->flags & ZIP_ZF_CRC)
zf->crc = crc32(zf->crc, (Bytef *)outbuf, ret);
zf->bytes_left -= ret;
}
return ret;
}
zf->zstr->next_out = (Bytef *)outbuf;
zf->zstr->avail_out = toread;
out_before = zf->zstr->total_out;
/* endless loop until something has been accomplished */
for (;;) {
ret = inflate(zf->zstr, Z_SYNC_FLUSH);
switch (ret) {
case Z_OK:
case Z_STREAM_END:
/* all ok */
/* Z_STREAM_END probably won't happen, since we didn't
have a header */
len = zf->zstr->total_out - out_before;
if (len >= zf->bytes_left || len >= toread) {
if (zf->flags & ZIP_ZF_CRC)
zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
zf->bytes_left -= len;
return len;
}
break;
case Z_BUF_ERROR:
if (zf->zstr->avail_in == 0) {
i = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf);
if (i == 0) {
_zip_error_set(&zf->error, ZIP_ER_INCONS, 0);
return -1;
}
else if (i < 0)
return -1;
zf->zstr->next_in = (Bytef *)zf->buffer;
zf->zstr->avail_in = i;
continue;
}
/* fallthrough */
case Z_NEED_DICT:
case Z_DATA_ERROR:
case Z_STREAM_ERROR:
case Z_MEM_ERROR:
_zip_error_set(&zf->error, ZIP_ER_ZLIB, ret);
return -1;
}
}
}

83
ext/zip/lib/zip_free.c Normal file
View file

@ -0,0 +1,83 @@
/*
$NiH: zip_free.c,v 1.17 2005/06/09 19:57:10 dillo Exp $
zip_free.c -- free struct zip
Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
/* _zip_free:
frees the space allocated to a zipfile struct, and closes the
corresponding file. */
void
_zip_free(struct zip *za)
{
int i;
if (za == NULL)
return;
if (za->zn)
free(za->zn);
if (za->zp)
fclose(za->zp);
_zip_cdir_free(za->cdir);
if (za->entry) {
for (i=0; i<za->nentry; i++) {
_zip_entry_free(za->entry+i);
}
free(za->entry);
}
for (i=0; i<za->nfile; i++) {
if (za->file[i]->error.zip_err == ZIP_ER_OK) {
_zip_error_set(&za->file[i]->error, ZIP_ER_ZIPCLOSED, 0);
za->file[i]->za = NULL;
}
}
free(za->file);
free(za);
return;
}

View file

@ -0,0 +1,56 @@
/*
$NiH: zip_get_archive_comment.c,v 1.4 2006/04/23 16:11:33 wiz Exp $
zip_get_archive_comment.c -- get archive comment
Copyright (C) 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
const char *
zip_get_archive_comment(struct zip *za, int *lenp, int flags)
{
if ((flags & ZIP_FL_UNCHANGED)
|| (za->ch_comment_len == -1)) {
if (lenp != NULL)
*lenp = za->cdir->comment_len;
return za->cdir->comment;
}
if (lenp != NULL)
*lenp = za->ch_comment_len;
return za->ch_comment;
}

View file

@ -0,0 +1,61 @@
/*
$NiH: zip_get_file_comment.c,v 1.2 2006/04/23 13:06:28 wiz Exp $
zip_get_file_comment.c -- get file comment
Copyright (C) 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
const char *
zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags)
{
if (idx < 0 || idx >= za->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((flags & ZIP_FL_UNCHANGED)
|| (za->entry[idx].ch_comment_len == -1)) {
if (lenp != NULL)
*lenp = za->cdir->entry[idx].comment_len;
return za->cdir->entry[idx].comment;
}
if (lenp != NULL)
*lenp = za->entry[idx].ch_comment_len;
return za->entry[idx].ch_comment;
}

View file

@ -0,0 +1,74 @@
/*
$NiH: zip_get_name.c,v 1.13 2005/01/20 21:00:54 dillo Exp $
zip_get_name.c -- get filename for a file in zip file
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
const char *
zip_get_name(struct zip *za, int idx, int flags)
{
return _zip_get_name(za, idx, flags, &za->error);
}
const char *
_zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error)
{
if (idx < 0 || idx >= za->nentry) {
_zip_error_set(error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((flags & ZIP_FL_UNCHANGED) == 0) {
if (za->entry[idx].state == ZIP_ST_DELETED) {
_zip_error_set(error, ZIP_ER_DELETED, 0);
return NULL;
}
if (za->entry[idx].ch_filename)
return za->entry[idx].ch_filename;
}
if (za->cdir == NULL || idx >= za->cdir->nentry) {
_zip_error_set(error, ZIP_ER_INVAL, 0);
return NULL;
}
return za->cdir->entry[idx].filename;
}

View file

@ -0,0 +1,50 @@
/*
$NiH: zip_get_num_files.c,v 1.2 2003/12/27 22:53:15 wiz Exp $
zip_get_num_files.c -- get number of files in archive
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_get_num_files(struct zip *za)
{
if (za == NULL)
return -1;
return za->nentry;
}

58
ext/zip/lib/zip_memdup.c Normal file
View file

@ -0,0 +1,58 @@
/*
$NiH: zip_memdup.c,v 1.2 2006/04/24 10:34:39 dillo Exp $
zip_memdup.c -- internal zip function, "strdup" with len
Copyright (C) 1999, 2003, 2004, 2005, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
void *
_zip_memdup(const void *mem, size_t len, struct zip_error *error)
{
void *ret;
ret = malloc(len);
if (!ret) {
_zip_error_set(error, ZIP_ER_MEMORY, 0);
return NULL;
}
memcpy(ret, mem, len);
return ret;
}

View file

@ -0,0 +1,91 @@
/*
$NiH: zip_name_locate.c,v 1.19 2005/06/09 19:57:10 dillo Exp $
zip_name_locate.c -- get index by name
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <string.h>
#include "zip.h"
#include "zipint.h"
int
zip_name_locate(struct zip *za, const char *fname, int flags)
{
return _zip_name_locate(za, fname, flags, &za->error);
}
int
_zip_name_locate(struct zip *za, const char *fname, int flags,
struct zip_error *error)
{
int (*cmp)(const char *, const char *);
const char *fn, *p;
int i, n;
if (fname == NULL) {
_zip_error_set(error, ZIP_ER_INVAL, 0);
return -1;
}
cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp;
n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry;
for (i=0; i<n; i++) {
if (flags & ZIP_FL_UNCHANGED)
fn = za->cdir->entry[i].filename;
else
fn = _zip_get_name(za, i, flags, error);
/* newly added (partially filled) entry */
if (fn == NULL)
continue;
if (flags & ZIP_FL_NODIR) {
p = strrchr(fn, '/');
if (p)
fn = p+1;
}
if (cmp(fname, fn) == 0)
return i;
}
_zip_error_set(error, ZIP_ER_NOENT, 0);
return -1;
}

71
ext/zip/lib/zip_new.c Normal file
View file

@ -0,0 +1,71 @@
/*
$NiH: zip_new.c,v 1.12 2006/04/23 00:40:47 wiz Exp $
zip_new.c -- create and init struct zip
Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
/* _zip_new:
creates a new zipfile struct, and sets the contents to zero; returns
the new struct. */
struct zip *
_zip_new(struct zip_error *error)
{
struct zip *za;
za = (struct zip *)malloc(sizeof(struct zip));
if (!za) {
_zip_error_set(error, ZIP_ER_MEMORY, 0);
return NULL;
}
za->zn = NULL;
za->zp = NULL;
_zip_error_init(&za->error);
za->cdir = NULL;
za->ch_comment = NULL;
za->ch_comment_len = -1;
za->nentry = za->nentry_alloc = 0;
za->entry = NULL;
za->nfile = za->nfile_alloc = 0;
za->file = NULL;
return za;
}

464
ext/zip/lib/zip_open.c Normal file
View file

@ -0,0 +1,464 @@
/*
$NiH: zip_open.c,v 1.38 2006/05/04 00:01:26 dillo Exp $
zip_open.c -- open zip archive
Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <sys/types.h>
#include "zip.h"
#include "zipint.h"
static void set_error(int *, struct zip_error *, int);
static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *);
static int _zip_headercomp(struct zip_dirent *, int,
struct zip_dirent *, int);
static unsigned char *_zip_memmem(const unsigned char *, int,
const unsigned char *, int);
static struct zip_cdir *_zip_readcdir(FILE *, unsigned char *, unsigned char *,
int, int, struct zip_error *);
struct zip *
zip_open(const char *fn, int flags, int *zep)
{
FILE *fp;
unsigned char *buf, *match;
int a, i, buflen, best;
struct zip *za;
struct zip_cdir *cdir, *cdirnew;
long len;
struct stat st;
struct zip_error error, err2;
if (fn == NULL) {
set_error(zep, NULL, ZIP_ER_INVAL);
return NULL;
}
if (stat(fn, &st) != 0) {
if (flags & ZIP_CREATE) {
if ((za=_zip_new(&error)) == NULL) {
set_error(zep, &error, 0);
return NULL;
}
za->zn = strdup(fn);
if (!za->zn) {
_zip_free(za);
set_error(zep, NULL, ZIP_ER_MEMORY);
return NULL;
}
return za;
}
else {
set_error(zep, NULL, ZIP_ER_OPEN);
return NULL;
}
}
else if ((flags & ZIP_EXCL)) {
set_error(zep, NULL, ZIP_ER_EXISTS);
return NULL;
}
/* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL,
just like open() */
if ((fp=fopen(fn, "rb")) == NULL) {
set_error(zep, NULL, ZIP_ER_OPEN);
return NULL;
}
clearerr(fp);
fseek(fp, 0, SEEK_END);
len = ftell(fp);
i = fseek(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END);
if (i == -1 && errno != EFBIG) {
/* seek before start of file on my machine */
set_error(zep, NULL, ZIP_ER_SEEK);
fclose(fp);
return NULL;
}
/* 64k is too much for stack */
if ((buf=(unsigned char *)malloc(CDBUFSIZE)) == NULL) {
set_error(zep, NULL, ZIP_ER_MEMORY);
fclose(fp);
return NULL;
}
clearerr(fp);
buflen = fread(buf, 1, CDBUFSIZE, fp);
if (ferror(fp)) {
set_error(zep, NULL, ZIP_ER_READ);
free(buf);
fclose(fp);
return NULL;
}
best = -2;
cdir = NULL;
match = buf;
while ((match=_zip_memmem(match, buflen-(match-buf)-18,
(const unsigned char *)EOCD_MAGIC, 4))!=NULL) {
/* found match -- check, if good */
/* to avoid finding the same match all over again */
match++;
if ((cdirnew=_zip_readcdir(fp, buf, match-1, buflen, flags,
&err2)) == NULL) {
if (best == -2) {
set_error(zep, &err2, 0);
best = -1;
}
continue;
}
if (cdir) {
if (best <= 0)
best = _zip_checkcons(fp, cdir, &err2);
a = _zip_checkcons(fp, cdirnew, &err2);
if (best < a) {
_zip_cdir_free(cdir);
cdir = cdirnew;
best = a;
}
else
_zip_cdir_free(cdirnew);
}
else {
cdir = cdirnew;
if (flags & ZIP_CHECKCONS)
best = _zip_checkcons(fp, cdir, &err2);
else
best = 0;
}
cdirnew = NULL;
}
free(buf);
if (best < 0) {
/* no consistent eocd found */
if (best == -2) {
/* no eocd found at all */
set_error(zep, NULL, ZIP_ER_NOZIP);
}
_zip_cdir_free(cdir);
fclose(fp);
return NULL;
}
if ((za=_zip_new(&error)) == NULL) {
set_error(zep, &error, 0);
_zip_cdir_free(cdir);
fclose(fp);
return NULL;
}
za->zp = fp;
za->cdir = cdir;
if ((za->zn=strdup(fn)) == NULL) {
set_error(zep, NULL, ZIP_ER_MEMORY);
_zip_free(za);
return NULL;
}
if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry))
* cdir->nentry)) == NULL) {
set_error(zep, NULL, ZIP_ER_MEMORY);
_zip_free(za);
return NULL;
}
for (i=0; i<cdir->nentry; i++)
_zip_entry_new(za);
return za;
}
static void
set_error(int *zep, struct zip_error *err, int ze)
{
int se;
if (err) {
_zip_error_get(err, &ze, &se);
if (zip_error_get_sys_type(ze) == ZIP_ET_SYS)
errno = se;
}
if (zep)
*zep = ze;
}
/* _zip_readcdir:
tries to find a valid end-of-central-directory at the beginning of
buf, and then the corresponding central directory entries.
Returns a struct zip_cdir which contains the central directory
entries, or NULL if unsuccessful. */
static struct zip_cdir *
_zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen,
int flags, struct zip_error *error)
{
struct zip_cdir *cd;
unsigned char *cdp, **bufp;
int i, comlen, nentry;
comlen = buf + buflen - eocd - EOCDLEN;
if (comlen < 0) {
/* not enough bytes left for comment */
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return NULL;
}
/* check for end-of-central-dir magic */
if (memcmp(eocd, EOCD_MAGIC, 4) != 0) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return NULL;
}
if (memcmp(eocd+4, "\0\0\0\0", 4) != 0) {
_zip_error_set(error, ZIP_ER_MULTIDISK, 0);
return NULL;
}
cdp = eocd + 8;
/* number of cdir-entries on this disk */
i = _zip_read2(&cdp);
/* number of cdir-entries */
nentry = _zip_read2(&cdp);
if ((cd=_zip_cdir_new(nentry, error)) == NULL)
return NULL;
cd->size = _zip_read4(&cdp);
cd->offset = _zip_read4(&cdp);
cd->comment = NULL;
cd->comment_len = _zip_read2(&cdp);
if ((comlen < cd->comment_len) || (cd->nentry != i)) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
free(cd);
return NULL;
}
if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) {
_zip_error_set(error, ZIP_ER_INCONS, 0);
free(cd);
return NULL;
}
if (cd->comment_len)
if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN,
cd->comment_len, error))
== NULL) {
free(cd);
return NULL;
}
cdp = eocd;
if (cd->size < (unsigned int)(eocd-buf)) {
/* if buffer already read in, use it */
cdp = eocd - cd->size;
bufp = &cdp;
}
else {
/* go to start of cdir and read it entry by entry */
bufp = NULL;
clearerr(fp);
fseek(fp, -(cd->size+cd->comment_len+EOCDLEN), SEEK_END);
if (ferror(fp) || ((unsigned int)ftell(fp) != cd->offset)) {
/* seek error or offset of cdir wrong */
if (ferror(fp))
_zip_error_set(error, ZIP_ER_SEEK, errno);
else
_zip_error_set(error, ZIP_ER_NOZIP, 0);
free(cd);
return NULL;
}
}
for (i=0; i<cd->nentry; i++) {
if ((_zip_dirent_read(cd->entry+i, fp, bufp, eocd-cdp, 0,
error)) < 0) {
cd->nentry = i;
_zip_cdir_free(cd);
return NULL;
}
}
return cd;
}
/* _zip_checkcons:
Checks the consistency of the central directory by comparing central
directory entries with local headers and checking for plausible
file and header offsets. Returns -1 if not plausible, else the
difference between the lowest and the highest fileposition reached */
static int
_zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error)
{
int i;
unsigned int min, max, j;
struct zip_dirent temp;
if (cd->nentry) {
max = cd->entry[0].offset;
min = cd->entry[0].offset;
}
else
min = max = 0;
for (i=0; i<cd->nentry; i++) {
if (cd->entry[i].offset < min)
min = cd->entry[i].offset;
if (min > cd->offset) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return -1;
}
j = cd->entry[i].offset + cd->entry[i].comp_size
+ cd->entry[i].filename_len + LENTRYSIZE;
if (j > max)
max = j;
if (max > cd->offset) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
return -1;
}
if (fseek(fp, cd->entry[i].offset, SEEK_SET) != 0) {
_zip_error_set(error, ZIP_ER_SEEK, 0);
return -1;
}
if (_zip_dirent_read(&temp, fp, NULL, 0, 1, error) == -1)
return -1;
if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) {
_zip_error_set(error, ZIP_ER_NOZIP, 0);
_zip_dirent_finalize(&temp);
return -1;
}
_zip_dirent_finalize(&temp);
}
return max - min;
}
/* _zip_headercomp:
compares two headers h1 and h2; if they are local headers, set
local1p or local2p respectively to 1, else 0. Return 0 if they
are identical, -1 if not. */
static int
_zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2,
int local2p)
{
if ((h1->version_needed != h2->version_needed)
#if 0
/* some zip-files have different values in local
and global headers for the bitflags */
|| (h1->bitflags != h2->bitflags)
#endif
|| (h1->comp_method != h2->comp_method)
|| (h1->last_mod != h2->last_mod)
|| (h1->crc != h2->crc)
|| (h1->comp_size != h2->comp_size)
|| (h1->uncomp_size != h2->uncomp_size)
|| (h1->filename_len != h2->filename_len)
|| !h1->filename || !h2->filename
|| strcmp(h1->filename, h2->filename))
return -1;
if ((local1p == local2p)
&& ((h1->extrafield_len != h2->extrafield_len)
|| (h1->extrafield_len && h2->extrafield
&& memcmp(h1->extrafield, h2->extrafield,
h1->extrafield_len))))
return -1;
/* if either is local, nothing more to check */
if (local1p || local2p)
return 0;
if ((h1->version_madeby != h2->version_madeby)
|| (h1->disk_number != h2->disk_number)
|| (h1->int_attrib != h2->int_attrib)
|| (h1->ext_attrib != h2->ext_attrib)
|| (h1->offset != h2->offset)
|| (h1->comment_len != h2->comment_len)
|| (h1->comment_len && h2->comment
&& memcmp(h1->comment, h2->comment, h1->comment_len)))
return -1;
return 0;
}
static unsigned char *
_zip_memmem(const unsigned char *big, int biglen, const unsigned char *little,
int littlelen)
{
const unsigned char *p;
if ((biglen < littlelen) || (littlelen == 0))
return NULL;
p = big-1;
while ((p=(const unsigned char *)
memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1)))
!= NULL) {
if (memcmp(p+1, little+1, littlelen-1)==0)
return (unsigned char *)p;
}
return NULL;
}

52
ext/zip/lib/zip_rename.c Normal file
View file

@ -0,0 +1,52 @@
/*
$NiH: zip_rename.c,v 1.15 2004/11/30 22:19:38 wiz Exp $
zip_rename.c -- rename file in zip archive
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_rename(struct zip *za, int idx, const char *name)
{
if (idx >= za->nentry || idx < 0) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
return _zip_set_name(za, idx, name);
}

79
ext/zip/lib/zip_replace.c Normal file
View file

@ -0,0 +1,79 @@
/*
$NiH: zip_replace.c,v 1.20 2006/04/09 14:52:02 wiz Exp $
zip_replace.c -- replace file via callback function
Copyright (C) 1999, 2003, 2004, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_replace(struct zip *za, int idx, struct zip_source *source)
{
if (idx < 0 || idx >= za->nentry || source == NULL) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
if (_zip_replace(za, idx, NULL, source) == -1)
return -1;
return 0;
}
int
_zip_replace(struct zip *za, int idx, const char *name,
struct zip_source *source)
{
if (idx == -1) {
if (_zip_entry_new(za) == NULL)
return -1;
idx = za->nentry - 1;
}
_zip_unchange_data(za->entry+idx);
if (name && _zip_set_name(za, idx, name) != 0)
return -1;
za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry)
? ZIP_ST_ADDED : ZIP_ST_REPLACED);
za->entry[idx].source = source;
return idx;
}

View file

@ -0,0 +1,68 @@
/*
$NiH: zip_set_archive_comment.c,v 1.3 2006/04/24 10:34:39 dillo Exp $
zip_set_archive_comment.c -- set archive comment
Copyright (C) 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
int
zip_set_archive_comment(struct zip *za, const char *comment, int len)
{
char *tmpcom;
if (len < 0 || len > MAXCOMLEN
|| (len > 0 && comment == NULL)) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
if (len > 0) {
if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL)
return -1;
}
else
tmpcom = NULL;
free(za->ch_comment);
za->ch_comment = tmpcom;
za->ch_comment_len = len;
return 0;
}

View file

@ -0,0 +1,69 @@
/*
$NiH: zip_set_file_comment.c,v 1.4 2006/04/24 10:34:39 dillo Exp $
zip_set_file_comment.c -- set comment for file in archive
Copyright (C) 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
int
zip_set_file_comment(struct zip *za, int idx, const char *comment, int len)
{
char *tmpcom;
if (idx < 0 || idx >= za->nentry
|| len < 0 || len > MAXCOMLEN
|| (len > 0 && comment == NULL)) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
if (len > 0) {
if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL)
return -1;
}
else
tmpcom = NULL;
free(za->entry[idx].ch_comment);
za->entry[idx].ch_comment = tmpcom;
za->entry[idx].ch_comment_len = len;
return 0;
}

View file

@ -0,0 +1,77 @@
/*
$NiH: zip_set_name.c,v 1.16 2004/11/30 23:02:47 wiz Exp $
zip_set_name.c -- rename helper function
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
int
_zip_set_name(struct zip *za, int idx, const char *name)
{
char *s;
int i;
if (idx < 0 || idx >= za->nentry || name == NULL) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) {
_zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
return -1;
}
/* no effective name change */
if (i == idx)
return 0;
if ((s=strdup(name)) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return -1;
}
if (za->entry[idx].state == ZIP_ST_UNCHANGED)
za->entry[idx].state = ZIP_ST_RENAMED;
free(za->entry[idx].ch_filename);
za->entry[idx].ch_filename = s;
return 0;
}

View file

@ -0,0 +1,162 @@
/*
$NiH: zip_source_buffer.c,v 1.8 2006/04/23 14:50:49 wiz Exp $
zip_source_buffer.c -- create zip data source from buffer
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
struct read_data {
const char *buf, *data, *end;
time_t mtime;
int freep;
};
static ssize_t read_data(void *state, void *data, size_t len,
enum zip_source_cmd cmd);
struct zip_source *
zip_source_buffer(struct zip *za, const void *data, off_t len, int freep)
{
struct read_data *f;
struct zip_source *zs;
if (za == NULL)
return NULL;
if (len < 0 || (data == NULL && len > 0)) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((f=(struct read_data *)malloc(sizeof(*f))) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
f->data = (const char *)data;
f->end = ((const char *)data)+len;
f->freep = freep;
f->mtime = time(NULL);
if ((zs=zip_source_function(za, read_data, f)) == NULL) {
free(f);
return NULL;
}
return zs;
}
static ssize_t
read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd)
{
struct read_data *z;
char *buf;
size_t n;
z = (struct read_data *)state;
buf = (char *)data;
switch (cmd) {
case ZIP_SOURCE_OPEN:
z->buf = z->data;
return 0;
case ZIP_SOURCE_READ:
n = z->end - z->buf;
if (n > len)
n = len;
if (n < 0)
n = 0;
if (n) {
memcpy(buf, z->buf, n);
z->buf += n;
}
return n;
case ZIP_SOURCE_CLOSE:
return 0;
case ZIP_SOURCE_STAT:
{
struct zip_stat *st;
if (len < sizeof(*st))
return -1;
st = (struct zip_stat *)data;
st->mtime = z->mtime;
st->crc = 0;
st->size = z->end - z->data;
st->comp_size = -1;
st->comp_method = ZIP_CM_STORE;
return sizeof(*st);
}
case ZIP_SOURCE_ERROR:
{
int *e;
if (len < sizeof(int)*2)
return -1;
e = (int *)data;
e[0] = e[1] = 0;
}
return sizeof(int)*2;
case ZIP_SOURCE_FREE:
if (z->freep) {
free((void *)z->data);
z->data = NULL;
}
free(z);
return 0;
default:
;
}
return -1;
}

View file

@ -0,0 +1,71 @@
/*
$NiH: zip_source_file.c,v 1.2 2004/11/18 16:28:13 wiz Exp $
zip_source_file.c -- create data source from file
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <errno.h>
#include <stdio.h>
#include "zip.h"
#include "zipint.h"
struct zip_source *
zip_source_file(struct zip *za, const char *fname, off_t start, off_t len)
{
struct zip_source *zs;
FILE *fp;
if (za == NULL)
return NULL;
if (fname == NULL || start < 0 || len < -1) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((fp=fopen(fname, "rb")) == NULL) {
_zip_error_set(&za->error, ZIP_ER_OPEN, errno);
return NULL;
}
if ((zs=zip_source_filep(za, fp, start, len)) == NULL) {
fclose(fp);
return NULL;
}
return zs;
}

View file

@ -0,0 +1,180 @@
/*
$NiH: zip_source_filep.c,v 1.6 2005/06/09 19:57:10 dillo Exp $
zip_source_filep.c -- create data source from FILE *
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
struct read_file {
FILE *f; /* file to copy from */
off_t off; /* start offset of */
off_t len; /* lengt of data to copy */
off_t remain; /* bytes remaining to be copied */
int e[2]; /* error codes */
};
static ssize_t read_file(void *state, void *data, size_t len,
enum zip_source_cmd cmd);
struct zip_source *
zip_source_filep(struct zip *za, FILE *file, off_t start, off_t len)
{
struct read_file *f;
struct zip_source *zs;
if (za == NULL)
return NULL;
if (file == NULL || start < 0 || len < -1) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
f->f = file;
f->off = start;
f->len = (len ? len : -1);
if ((zs=zip_source_function(za, read_file, f)) == NULL) {
free(f);
return NULL;
}
return zs;
}
static ssize_t
read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
{
struct read_file *z;
char *buf;
int i, n;
z = (struct read_file *)state;
buf = (char *)data;
switch (cmd) {
case ZIP_SOURCE_OPEN:
if (fseeko(z->f, z->off, SEEK_SET) < 0) {
z->e[0] = ZIP_ER_SEEK;
z->e[1] = errno;
return -1;
}
z->remain = z->len;
return 0;
case ZIP_SOURCE_READ:
if (z->remain != -1)
n = len > z->remain ? z->remain : len;
else
n = len;
if ((i=fread(buf, 1, n, z->f)) < 0) {
z->e[0] = ZIP_ER_READ;
z->e[1] = errno;
return -1;
}
if (z->remain != -1)
z->remain -= i;
return i;
case ZIP_SOURCE_CLOSE:
return 0;
case ZIP_SOURCE_STAT:
{
struct zip_stat *st;
struct stat fst;
if (len < sizeof(*st))
return -1;
st = (struct zip_stat *)data;
if (fstat(fileno(z->f), &fst) != 0) {
z->e[0] = ZIP_ER_READ; /* best match */
z->e[1] = errno;
return -1;
}
st->mtime = fst.st_mtime;
st->crc = 0;
if (z->len != -1)
st->size = z->len;
else if ((fst.st_mode&S_IFMT) == S_IFREG)
st->size = fst.st_size;
else
st->size = -1;
st->comp_size = -1;
st->comp_method = ZIP_CM_STORE;
return sizeof(*st);
}
case ZIP_SOURCE_ERROR:
if (len < sizeof(int)*2)
return -1;
memcpy(data, z->e, sizeof(int)*2);
return sizeof(int)*2;
case ZIP_SOURCE_FREE:
fclose(z->f);
free(z);
return 0;
default:
;
}
return -1;
}

View file

@ -0,0 +1,54 @@
/*
$NiH: zip_source_free.c,v 1.2 2004/12/22 16:32:00 dillo Exp $
zip_source_free.c -- free zip data source
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
void
zip_source_free(struct zip_source *source)
{
if (source == NULL)
return;
(void)source->f(source->ud, NULL, 0, ZIP_SOURCE_FREE);
free(source);
}

View file

@ -0,0 +1,62 @@
/*
$NiH: zip_source_function.c,v 1.4 2006/02/21 09:41:00 dillo Exp $
zip_source_function.c -- create zip data source from callback function
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
struct zip_source *
zip_source_function(struct zip *za, zip_source_callback zcb, void *ud)
{
struct zip_source *zs;
if (za == NULL)
return NULL;
if ((zs=(struct zip_source *)malloc(sizeof(*zs))) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
zs->f = zcb;
zs->ud = ud;
return zs;
}

View file

@ -0,0 +1,189 @@
/*
$NiH: zip_source_zip.c,v 1.7 2006/02/21 09:41:00 dillo Exp $
zip_source_zip.c -- create data source from zip file
Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include <string.h>
#include "zip.h"
#include "zipint.h"
struct read_zip {
struct zip_file *zf;
struct zip_stat st;
off_t off, len;
};
static ssize_t read_zip(void *st, void *data, size_t len,
enum zip_source_cmd cmd);
struct zip_source *
zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags,
off_t start, off_t len)
{
struct zip_error error;
struct zip_source *zs;
struct read_zip *p;
if (za == NULL)
return NULL;
if (srcza == NULL || start < 0 || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return NULL;
}
if ((flags & ZIP_FL_UNCHANGED) == 0
&& ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) {
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
return NULL;
}
if (len == 0)
len = -1;
if (start == 0 && len == -1)
flags |= ZIP_FL_COMPRESSED;
else
flags &= ~ZIP_FL_COMPRESSED;
if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) {
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
return NULL;
}
_zip_error_copy(&error, &srcza->error);
if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0
|| (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) {
free(p);
_zip_error_copy(&za->error, &srcza->error);
_zip_error_copy(&srcza->error, &error);
return NULL;
}
p->off = start;
p->len = len;
if ((flags & ZIP_FL_COMPRESSED) == 0) {
p->st.size = p->st.comp_size = len;
p->st.comp_method = ZIP_CM_STORE;
p->st.crc = 0;
}
if ((zs=zip_source_function(za, read_zip, p)) == NULL) {
free(p);
return NULL;
}
return zs;
}
static ssize_t
read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd)
{
struct read_zip *z;
char b[8192], *buf;
int i, n;
z = (struct read_zip *)state;
buf = (char *)data;
switch (cmd) {
case ZIP_SOURCE_OPEN:
for (n=0; n<z->off; n+= i) {
i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n);
if ((i=zip_fread(z->zf, b, i)) < 0) {
zip_fclose(z->zf);
z->zf = NULL;
return -1;
}
}
return 0;
case ZIP_SOURCE_READ:
if (z->len != -1)
n = len > z->len ? z->len : len;
else
n = len;
if ((i=zip_fread(z->zf, buf, n)) < 0)
return -1;
if (z->len != -1)
z->len -= i;
return i;
case ZIP_SOURCE_CLOSE:
return 0;
case ZIP_SOURCE_STAT:
if (len < sizeof(z->st))
return -1;
len = sizeof(z->st);
memcpy(data, &z->st, len);
return len;
case ZIP_SOURCE_ERROR:
{
int *e;
if (len < sizeof(int)*2)
return -1;
e = (int *)data;
zip_file_error_get(z->zf, e, e+1);
}
return sizeof(int)*2;
case ZIP_SOURCE_FREE:
zip_fclose(z->zf);
free(z);
return 0;
default:
;
}
return -1;
}

52
ext/zip/lib/zip_stat.c Normal file
View file

@ -0,0 +1,52 @@
/*
$NiH: zip_stat.c,v 1.3 2004/04/16 09:40:30 dillo Exp $
zip_stat.c -- get information about file by name
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st)
{
int idx;
if ((idx=zip_name_locate(za, fname, flags)) < 0)
return -1;
return zip_stat_index(za, idx, flags, st);
}

View file

@ -0,0 +1,93 @@
/*
$NiH: zip_stat_index.c,v 1.10 2006/04/24 14:04:19 dillo Exp $
zip_stat_index.c -- get information about file by index
Copyright (C) 1999, 2003, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
int
zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
{
const char *name;
if (index < 0 || index >= za->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
if ((name=zip_get_name(za, index, flags)) == NULL)
return -1;
if ((flags & ZIP_FL_UNCHANGED) == 0
&& ZIP_ENTRY_DATA_CHANGED(za->entry+index)) {
if (za->entry[index].source->f(za->entry[index].source->ud,
st, sizeof(*st), ZIP_SOURCE_STAT) < 0) {
_zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
return -1;
}
}
else {
if (za->cdir == NULL || index >= za->cdir->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
st->index = index;
st->crc = za->cdir->entry[index].crc;
st->size = za->cdir->entry[index].uncomp_size;
st->mtime = za->cdir->entry[index].last_mod;
st->comp_size = za->cdir->entry[index].comp_size;
st->comp_method = za->cdir->entry[index].comp_method;
if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) {
if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) {
/* XXX */
st->encryption_method = ZIP_EM_UNKNOWN;
}
else
st->encryption_method = ZIP_EM_TRAD_PKWARE;
}
else
st->encryption_method = ZIP_EM_NONE;
/* st->bitflags = za->cdir->entry[index].bitflags; */
}
st->name = name;
return 0;
}

View file

@ -0,0 +1,47 @@
/*
$NiH: zip_strerror.c,v 1.1 2003/10/05 16:05:22 dillo Exp $
zip_sterror.c -- get string representation of zip error
Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "zip.h"
#include "zipint.h"
const char *
zip_strerror(struct zip *za)
{
return _zip_error_strerror(&za->error);
}

View file

@ -0,0 +1,84 @@
/*
$NiH: zip_unchange.c,v 1.19 2006/04/23 13:21:18 wiz Exp $
zip_unchange.c -- undo changes to file in zip archive
Copyright (C) 1999, 2004, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
int
zip_unchange(struct zip *za, int idx)
{
return _zip_unchange(za, idx, 0);
}
int
_zip_unchange(struct zip *za, int idx, int allow_duplicates)
{
int i;
if (idx < 0 || idx >= za->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
if (za->entry[idx].ch_filename) {
if (!allow_duplicates) {
i = _zip_name_locate(za,
_zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL),
0, NULL);
if (i != -1 && i != idx) {
_zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
return -1;
}
}
free(za->entry[idx].ch_filename);
za->entry[idx].ch_filename = NULL;
}
free(za->entry[idx].ch_comment);
za->entry[idx].ch_comment = NULL;
za->entry[idx].ch_comment_len = -1;
_zip_unchange_data(za->entry+idx);
return 0;
}

View file

@ -0,0 +1,56 @@
/*
$NiH: zip_unchange_all.c,v 1.10 2006/04/23 13:14:46 wiz Exp $
zip_unchange.c -- undo changes to all files in zip archive
Copyright (C) 1999, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
int
zip_unchange_all(struct zip *za)
{
int ret, i;
ret = 0;
for (i=0; i<za->nentry; i++)
ret |= _zip_unchange(za, i, 1);
ret |= zip_unchange_archive(za);
return ret;
}

View file

@ -0,0 +1,52 @@
/*
$NiH: zip_unchange_archive.c,v 1.1 2006/04/23 13:14:46 wiz Exp $
zip_unchange_archive.c -- undo global changes to ZIP archive
Copyright (C) 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zip.h"
#include "zipint.h"
int
zip_unchange_archive(struct zip *za)
{
free(za->ch_comment);
za->ch_comment = NULL;
za->ch_comment_len = -1;
return 0;
}

View file

@ -0,0 +1,53 @@
/*
$NiH: zip_unchange_data.c,v 1.15 2004/12/22 16:32:00 dillo Exp $
zip_unchange_data.c -- undo helper function
Copyright (C) 1999, 2004 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdlib.h>
#include "zipint.h"
void
_zip_unchange_data(struct zip_entry *ze)
{
if (ze->source) {
(void)ze->source->f(ze->source->ud, NULL, 0, ZIP_SOURCE_FREE);
free(ze->source);
ze->source = NULL;
}
ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED;
}

29
ext/zip/lib/zip_win32.h Normal file
View file

@ -0,0 +1,29 @@
#ifdef _MSC_VER
#define _POSIX_
#include <windows.h>
#include <io.h>
#include <fcntl.h>
#ifndef ssize_t
# define ssize_t SSIZE_T
#endif
#ifndef mode_t
# define mode_t int
#endif
#ifndef strcasecmp
# define strcasecmp stricmp
#endif
#ifndef snprintf
# define snprintf _snprintf
#endif
#ifndef mkstemp
# define mkstemp(t) _creat(_mktemp(t), _S_IREAD|_S_IWRITE)
#endif
/*
#ifndef fseeko
# define fseeko fseek
#endif
*/
#endif

225
ext/zip/lib/zipint.h Normal file
View file

@ -0,0 +1,225 @@
#ifndef _HAD_ZIPINT_H
#define _HAD_ZIPINT_H
/*
$NiH: zipint.h,v 1.48 2006/04/24 14:04:19 dillo Exp $
zipint.h -- internal declarations.
Copyright (C) 1999, 2003, 2004, 2005, 2006 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <nih@giga.or.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <zlib.h>
#include "zip.h"
#ifndef HAVE_FSEEKO
#define fseeko(s, o, w) (fseek((s), (long int)(o), (w)))
#endif
#define CENTRAL_MAGIC "PK\1\2"
#define LOCAL_MAGIC "PK\3\4"
#define EOCD_MAGIC "PK\5\6"
#define DATADES_MAGIC "PK\7\8"
#define CDENTRYSIZE 46u
#define LENTRYSIZE 30
#define MAXCOMLEN 65536
#define EOCDLEN 22
#define CDBUFSIZE (MAXCOMLEN+EOCDLEN)
#define BUFSIZE 8192
/* state of change of a file in zip archive */
enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED,
ZIP_ST_ADDED, ZIP_ST_RENAMED };
/* constants for struct zip_file's member flags */
#define ZIP_ZF_EOF 1 /* EOF reached */
#define ZIP_ZF_DECOMP 2 /* decompress data */
#define ZIP_ZF_CRC 4 /* compute and compare CRC */
/* directory entry: general purpose bit flags */
#define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */
#define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */
#define ZIP_GPBF_USE_DATA_DESCRIPTOR 0x0008 /* uses crc and size from data header */
/* error information */
struct zip_error {
int zip_err; /* libzip error code (ZIP_ER_*) */
int sys_err; /* copy of errno (E*) or zlib error code */
char *str; /* string representation or NULL */
};
/* zip archive, part of API */
struct zip {
char *zn; /* file name */
FILE *zp; /* file */
struct zip_error error; /* error information */
struct zip_cdir *cdir; /* central directory */
char *ch_comment; /* changed archive comment */
int ch_comment_len; /* length of changed zip archive
* comment, -1 if unchanged */
int nentry; /* number of entries */
int nentry_alloc; /* number of entries allocated */
struct zip_entry *entry; /* entries */
int nfile; /* number of opened files within archive */
int nfile_alloc; /* number of files allocated */
struct zip_file **file; /* opened files within archive */
};
/* file in zip archive, part of API */
struct zip_file {
struct zip *za; /* zip archive containing this file */
struct zip_error error; /* error information */
int flags; /* -1: eof, >0: error */
int method; /* compression method */
long fpos; /* position within zip file (fread/fwrite) */
unsigned long bytes_left; /* number of bytes left to read */
unsigned long cbytes_left; /* number of bytes of compressed data left */
unsigned long crc; /* CRC so far */
unsigned long crc_orig; /* CRC recorded in archive */
char *buffer;
z_stream *zstr;
};
/* zip archive directory entry (central or local) */
struct zip_dirent {
unsigned short version_madeby; /* (c) version of creator */
unsigned short version_needed; /* (cl) version needed to extract */
unsigned short bitflags; /* (cl) general purpose bit flag */
unsigned short comp_method; /* (cl) compression method used */
time_t last_mod; /* (cl) time of last modification */
unsigned int crc; /* (cl) CRC-32 of uncompressed data */
unsigned int comp_size; /* (cl) size of commpressed data */
unsigned int uncomp_size; /* (cl) size of uncommpressed data */
char *filename; /* (cl) file name (NUL-terminated) */
unsigned short filename_len; /* (cl) length of filename (w/o NUL) */
char *extrafield; /* (cl) extra field */
unsigned short extrafield_len; /* (cl) length of extra field */
char *comment; /* (c) file comment */
unsigned short comment_len; /* (c) length of file comment */
unsigned short disk_number; /* (c) disk number start */
unsigned short int_attrib; /* (c) internal file attributes */
unsigned int ext_attrib; /* (c) external file attributes */
unsigned int offset; /* (c) offset of local header */
};
/* zip archive central directory */
struct zip_cdir {
struct zip_dirent *entry; /* directory entries */
int nentry; /* number of entries */
unsigned int size; /* size of central direcotry */
unsigned int offset; /* offset of central directory in file */
char *comment; /* zip archive comment */
unsigned short comment_len; /* length of zip archive comment */
};
struct zip_source {
zip_source_callback f;
void *ud;
};
/* entry in zip archive directory */
struct zip_entry {
enum zip_state state;
struct zip_source *source;
char *ch_filename;
char *ch_comment;
int ch_comment_len;
};
extern const char * const _zip_err_str[];
extern const int _zip_nerr_str;
extern const int _zip_err_type[];
#define ZIP_ENTRY_DATA_CHANGED(x) \
((x)->state == ZIP_ST_REPLACED \
|| (x)->state == ZIP_ST_ADDED)
void _zip_cdir_free(struct zip_cdir *);
struct zip_cdir *_zip_cdir_new(int, struct zip_error *);
int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *);
void _zip_dirent_finalize(struct zip_dirent *);
void _zip_dirent_init(struct zip_dirent *);
int _zip_dirent_read(struct zip_dirent *, FILE *,
unsigned char **, unsigned int, int, struct zip_error *);
int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *);
void _zip_entry_free(struct zip_entry *);
void _zip_entry_init(struct zip *, int);
struct zip_entry *_zip_entry_new(struct zip *);
void _zip_error_copy(struct zip_error *, struct zip_error *);
void _zip_error_fini(struct zip_error *);
void _zip_error_get(struct zip_error *, int *, int *);
void _zip_error_init(struct zip_error *);
void _zip_error_set(struct zip_error *, int, int);
const char *_zip_error_strerror(struct zip_error *);
int _zip_file_fillbuf(void *, size_t, struct zip_file *);
unsigned int _zip_file_get_offset(struct zip *, int);
void _zip_free(struct zip *);
const char *_zip_get_name(struct zip *, int, int, struct zip_error *);
int _zip_local_header_read(struct zip *, int);
void *_zip_memdup(const void *, size_t, struct zip_error *);
int _zip_name_locate(struct zip *, const char *, int, struct zip_error *);
struct zip *_zip_new(struct zip_error *);
unsigned short _zip_read2(unsigned char **);
unsigned int _zip_read4(unsigned char **);
int _zip_replace(struct zip *, int, const char *, struct zip_source *);
int _zip_set_name(struct zip *, int, const char *);
int _zip_unchange(struct zip *, int, int);
void _zip_unchange_data(struct zip_entry *);
#endif /* zipint.h */

362
ext/zip/package.xml Normal file
View file

@ -0,0 +1,362 @@
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.4.7" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
<name>zip</name>
<channel>pecl.php.net</channel>
<summary>A zip management extension</summary>
<description>Zip is an extension to create, modify and read zip files.</description>
<lead>
<name>Pierre-Alain Joye</name>
<user>pajoye</user>
<email>pajoye@php.net</email>
<active>yes</active>
</lead>
<date>2006-07-14</date>
<version>
<release>1.6.0</release>
<api>1.6.0</api>
</version>
<stability>
<release>beta</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- Rename Class Zip to ZipArchive, required to be bundled
in php 5.2.0 (Zip being a ZipCode in US), making the role of
this class more obvious *Gah*
</notes>
<contents>
<dir name="/">
<file name="config.m4" role="src"/>
<file name="config.w32" role="src"/>
<file name="CREDITS" role="doc"/>
<file name="php_zip.c" role="src"/>
<file name="zip_stream.c" role="src"/>
<file name="php_zip.h" role="src"/>
<dir name="lib">
<file name="zip.h" role="src"/>
<file name="zipint.h" role="src"/>
<file name="zip_add.c" role="src"/>
<file name="zip_close.c" role="src"/>
<file name="zip_delete.c" role="src"/>
<file name="zip_dirent.c" role="src"/>
<file name="zip_entry_free.c" role="src"/>
<file name="zip_entry_new.c" role="src"/>
<file name="zip_error.c" role="src"/>
<file name="zip_error_get.c" role="src"/>
<file name="zip_error_get_sys_type.c" role="src"/>
<file name="zip_error_strerror.c" role="src"/>
<file name="zip_error_to_str.c" role="src"/>
<file name="zip_err_str.c" role="src"/>
<file name="zip_fclose.c" role="src"/>
<file name="zip_file_error_get.c" role="src"/>
<file name="zip_file_get_offset.c" role="src"/>
<file name="zip_file_strerror.c" role="src"/>
<file name="zip_fopen.c" role="src"/>
<file name="zip_fopen_index.c" role="src"/>
<file name="zip_fread.c" role="src"/>
<file name="zip_free.c" role="src"/>
<file name="zip_get_archive_comment.c" role="src"/>
<file name="zip_get_file_comment.c" role="src"/>
<file name="zip_get_name.c" role="src"/>
<file name="zip_get_num_files.c" role="src"/>
<file name="zip_memdup.c" role="src"/>
<file name="zip_name_locate.c" role="src"/>
<file name="zip_new.c" role="src"/>
<file name="zip_open.c" role="src"/>
<file name="zip_rename.c" role="src"/>
<file name="zip_replace.c" role="src"/>
<file name="zip_set_archive_comment.c" role="src"/>
<file name="zip_set_file_comment.c" role="src"/>
<file name="zip_set_name.c" role="src"/>
<file name="zip_source_buffer.c" role="src"/>
<file name="zip_source_file.c" role="src"/>
<file name="zip_source_filep.c" role="src"/>
<file name="zip_source_free.c" role="src"/>
<file name="zip_source_function.c" role="src"/>
<file name="zip_source_zip.c" role="src"/>
<file name="zip_stat.c" role="src"/>
<file name="zip_stat_index.c" role="src"/>
<file name="zip_strerror.c" role="src"/>
<file name="zip_unchange.c" role="src"/>
<file name="zip_unchange_archive.c" role="src"/>
<file name="zip_unchange_all.c" role="src"/>
<file name="zip_unchange_data.c" role="src"/>
<file name="zip_win32.h" role="src"/>
</dir>
<!-- /lib -->
<dir name="examples">
<file name="odt.php" role="doc"/>
<file name="test_with_comment.zip" role="doc"/>
<file name="test.zip" role="doc"/>
<file name="test1.zip" role="doc"/>
<file name="oldapi.php" role="doc"/>
<file name="create.php" role="doc"/>
<file name="dir.php" role="doc"/>
<file name="extract.php" role="doc"/>
<file name="extractAll.php" role="doc"/>
<file name="fopen.php" role="doc"/>
<file name="too.php" role="doc"/>
<file name="comment.php" role="doc"/>
<file name="get_set_comments.php" role="doc"/>
</dir>
<!-- /examples -->
<dir name="tests">
<file name="utils.php" role="test"/>
<file name="001.phpt" role="test"/>
<file name="oo_ext_zip.phpt" role="test"/>
<file name="oo_open.phpt" role="test"/>
<file name="oo_close.phpt" role="test"/>
<file name="oo_addfile.phpt" role="test"/>
<file name="oo_delete.phpt" role="test"/>
<file name="oo_rename.phpt" role="test"/>
<file name="test_procedural.zip" role="test"/>
<file name="zip_close.phpt" role="test"/>
<file name="zip_entry_compressedsize.phpt" role="test"/>
<file name="zip_entry_compressionmethod.phpt" role="test"/>
<file name="zip_entry_filesize.phpt" role="test"/>
<file name="zip_entry_name.phpt" role="test"/>
<file name="zip_entry_open.phpt" role="test"/>
<file name="zip_entry_read.phpt" role="test"/>
<file name="zip_open.phpt" role="test"/>
<file name="zip_read.phpt" role="test"/>
<file name="bug7214.phpt" role="test"/>
<file name="bug7658.phpt" role="test"/>
<file name="bug7658.odt" role="test"/>
<file name="bug8009.phpt" role="test"/>
<file name="bug8009.zip" role="test"/>
<file name="binarynull.zip" role="test"/>
</dir>
<!-- /tests -->
</dir>
<!-- / -->
</contents>
<dependencies>
<required>
<php>
<min>4.3.0</min>
</php>
<pearinstaller>
<min>1.4.0</min>
</pearinstaller>
</required>
</dependencies>
<providesextension>zip</providesextension>
<extsrcrelease/>
<changelog>
<release>
<date>2006-07-14</date>
<version>
<release>1.5.0</release>
<api>1.5.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- bring consistency to the method names:
- rename zip::delete() to deleteIndex()
- add zip::deleteName()
- rename zip::statPath to zip::statName()
- rename zip::rename to zip::renameIndex()
- add zip::renameName();
- add zip::locateName(), returns the index of an entry, allows case insensitive
or directory free lookup (ZIP::FL_NOCASE, ZIP::FL_NODIR)
- add zip::unchangeName(), ::unchangeIndex(), unchangeAll() and unchangeArchive()
revert changes to an entry, to all entries or the archive
- add zip::getNameIndex(), get the name of the entry at the given position
- Bug #7658, Modify zip archives causes corruption if the data descriptor is used
(bit 3 of the general flags)
- fix a bug when in the delete and rename methods when the index is lower than 1
- zip::addFile() must return true on success
- zip::open() returns now the error code on error and true on success
</notes>
</release>
<release>
<date>2006-06-28</date>
<version>
<release>1.4.1</release>
<api>1.4.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- Add missing files in the package release
</notes>
</release>
<release>
<date>2006-06-28</date>
<version>
<release>1.4.0</release>
<api>1.4.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- Add write mode to the archive comment (zip::comment property)
- Add zip::setCommentName and ::setCommentIndex, add or remove entrie comment
- Add zip::getCommentName and ::getCommentIndex, get an entrie comment
- Add zip::setArchiveComment
- Full sync with zip-0.7.1
- #8009, modify archives on windows cannot be closed
</notes>
<release>
<date>2006-04-26</date>
<version>
<release>1.3.1</release>
<api>1.3.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- #7500, Fix build with php 5.1.0, 5.1.1 and 5.1.2</notes>
</release>
</release>
<release>
<date>2006-04-26</date>
<version>
<release>1.3.0</release>
<api>1.3.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<notes>- Fix possible leak with __set/__get in classes extending the Zip
intern object (tony2001[at]php.net)
- Added getFromName(), return the contents of an entry using its name
- Added getFromIndex(), return the contents of an entry using its index</notes>
</release>
<release>
<date>2006-03-30</date>
<version>
<release>1.2.3</release>
<api>1.2.1</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- #7214, use binary safe string as return value, 0x00 was considered as
the end of the content, affected only the procedural API</notes>
</release>
<release>
<date>2006-03-22</date>
<time>21:15:00</time>
<version>
<release>1.2.2</release>
<api>1.2.1</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- fix a bug in internal zip_close, new archives were not written
- ::open returns now false on error
- update the "create.php" example, status and returned codes are now checked
- fix a leak when the ::open method is called twice or more with the same
object</notes>
</release>
<release>
<date>2006-03-19</date>
<time>00:23:32</time>
<version>
<release>1.2.1</release>
<api>1.2.1</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- fixed a possible build problem (mkstemp missing)
- fix a bug where extending the Zip class does allow
to write to a property, see php bugs #36743 (array)</notes>
</release>
<release>
<date>2006-03-12</date>
<time>00:23:32</time>
<version>
<release>1.2.0</release>
<api>1.2.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- enable stream by default,
* use uri like zip:///path/to/my.zip#entryname.dat
(the URI format may change in future version)
- add support for print_r/var_dump (Zip object)
- add tests for the OO (still need more)
- add more example, like using xmlreader and zip
stream to parse OpenDocument meta info
</notes>
</release>
<release>
<date>2006-03-05</date>
<time>00:14:59</time>
<version>
<release>1.1.2</release>
<api>1.1.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- do not create empty file when a zip entry is only
a directory (empty or not)
</notes>
</release>
<release>
<date>2006-03-02</date>
<time>00:14:59</time>
<version>
<release>1.1.1</release>
<api>1.1.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- Fix PHP 5.1 detection at compiletie
- fix possible build errors with gcc other than 4.0.x
- add better zlib detection
- "--with-zlib-dir=[DIR]" added
</notes>
</release>
<release>
<date>2006-03-01</date>
<time>00:14:59</time>
<version>
<release>1.1.0</release>
<api>1.1.0</api>
</version>
<stability>
<release>alpha</release>
<api>alpha</api>
</stability>
<license uri="http://www.php.net/license">PHP License</license>
<notes>- replace the old zip extensions
* 100% compatible with the old API
* added zip creation support (write mode)
* added OO interface
* Stream support, getStream method
returns a file handler
- bundled libzip and drop zzlib usage
(see http://www.nih.at/libzip/)
</notes>
</release>
</changelog>
</package>

1934
ext/zip/php_zip.c Normal file

File diff suppressed because it is too large Load diff

101
ext/zip/php_zip.h Normal file
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
*/

12
ext/zip/tests/001.phpt Normal file
View file

@ -0,0 +1,12 @@
--TEST--
Check for zip presence
--SKIPIF--
<?php if (!extension_loaded("zip")) print "skip"; ?>
--POST--
--GET--
--FILE--
<?php
echo "zip extension is available";
?>
--EXPECT--
zip extension is available

Binary file not shown.

View file

@ -0,0 +1,23 @@
--TEST--
bug #7214, zip_entry_read() binary safe
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/binarynull.zip");
if (!is_resource($zip)) die("Failure");
$entries = 0;
$entry = zip_read($zip);
$contents = zip_entry_read($entry, zip_entry_filesize($entry));
if (strlen($contents) == zip_entry_filesize($entry)) {
echo "Ok";
} else {
echo "failed";
}
?>
--EXPECT--
Ok

BIN
ext/zip/tests/bug7658.odt Normal file

Binary file not shown.

View file

@ -0,0 +1,60 @@
--TEST--
bug #7658, modify archive with general bit flag 3 set
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
include $dirname . 'utils.php';
$file = $dirname . '__tmp_bug7658.odt';
$zip = new ZipArchive();
copy($dirname . 'bug7658.odt', $file);
if(!$zip->open($file)) {
echo 'failed';
}
dump_entries_name($zip);
$zip->deleteName('content.xml');
$zip->addFile($dirname . "bug7658.xml","content.xml");
$zip->close();
echo "\n";
$zip->open($file);
dump_entries_name($zip);
@unlink($file);
?>
--EXPECT--
0 mimetype
1 Configurations2/statusbar/
2 Configurations2/accelerator/current.xml
3 Configurations2/floater/
4 Configurations2/popupmenu/
5 Configurations2/progressbar/
6 Configurations2/menubar/
7 Configurations2/toolbar/
8 Configurations2/images/Bitmaps/
9 content.xml
10 styles.xml
11 meta.xml
12 Thumbnails/thumbnail.png
13 settings.xml
14 META-INF/manifest.xml
0 mimetype
1 Configurations2/statusbar/
2 Configurations2/accelerator/current.xml
3 Configurations2/floater/
4 Configurations2/popupmenu/
5 Configurations2/progressbar/
6 Configurations2/menubar/
7 Configurations2/toolbar/
8 Configurations2/images/Bitmaps/
9 styles.xml
10 meta.xml
11 Thumbnails/thumbnail.png
12 settings.xml
13 META-INF/manifest.xml
14 content.xml

File diff suppressed because one or more lines are too long

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

BIN
ext/zip/tests/bug8009.zip Normal file

Binary file not shown.

View file

@ -0,0 +1,37 @@
--TEST--
ziparchive::addFile() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
include $dirname . 'utils.php';
$file = $dirname . '__tmp_oo_addfile.zip';
copy($dirname . 'test.zip', $file);
$zip = new ZipArchive;
if (!$zip->open($file)) {
exit('failed');
}
if (!$zip->addFile($dirname . 'utils.php', 'test.php')) {
echo "failed\n";
}
if ($zip->status == ZIPARCHIVE::ER_OK) {
dump_entries_name($zip);
$zip->close();
} else {
echo "failed\n";
}
@unlink($file);
?>
--EXPECTF--
0 bar
1 foobar/
2 foobar/baz
3 entry1.txt
4 test.php

View file

@ -0,0 +1,25 @@
--TEST--
zip::close() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
$zip = new ZipArchive;
if (!$zip->open($dirname . 'test.zip')) {
exit('failed');
}
if ($zip->status == ZIPARCHIVE::ER_OK) {
$zip->close();
echo "ok\n";
} else {
echo "failed\n";
}
?>
--EXPECTF--
ok

View file

@ -0,0 +1,76 @@
--TEST--
Delete entries
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
$file = $dirname . '__tmp_oo_delete.zip';
if (file_exists($file)) {
unlink($file);
}
$zip = new ZipArchive;
if (!$zip->open($file, ZIPARCHIVE::CREATE)) {
exit('failed');
}
$zip->addFromString('entry1.txt', 'entry #1');
$zip->addFromString('entry2.txt', 'entry #2');
$zip->addFromString('dir/entry2.txt', 'entry #2');
if ($zip->status == ZIPARCHIVE::ER_OK) {
$zip->close();
echo "ok\n";
} else {
var_dump($zip);
echo "failed\n";
}
if (!$zip->open($file, ZIPARCHIVE::CREATE)) {
exit('failed');
}
if ($zip->deleteIndex(0)) {
echo "ok\n";
}
if ($zip->deleteName('entry2.txt')) {
echo "ok\n";
} else {
echo "failed 3\n";
}
if ($zip->deleteName('dir/entry2.txt')) {
echo "ok\n";
} else {
echo "failed 3\n";
}
if (!$zip->deleteIndex(123)) {
echo "ok\n";
} else {
print_r($zip);
echo "failed\n";
}
$sb = $zip->statIndex(0);
var_dump($sb);
$sb = $zip->statIndex(1);
var_dump($sb);
$sb = $zip->statIndex(2);
var_dump($sb);
@unlink($file);
?>
--EXPECTF--
ok
ok
ok
ok
ok
bool(false)
bool(false)
bool(false)

View file

@ -0,0 +1,27 @@
--TEST--
Extending Zip class and array property
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
class myZip extends ZipArchive {
private $test = 0;
public $testp = 1;
private $testarray = array();
public function __construct() {
$this->testarray[] = 1;
var_dump($this->testarray);
}
}
$z = new myZip;
?>
--EXPECTF--
array(1) {
[0]=>
int(1)
}

View file

@ -0,0 +1,45 @@
--TEST--
Locate entries by name
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
include $dirname . 'utils.php';
$file = $dirname . '__tmp_oo_rename.zip';
@unlink($file);
$zip = new ZipArchive;
if (!$zip->open($file, ZIPARCHIVE::CREATE)) {
exit('failed');
}
$zip->addFromString('entry1.txt', 'entry #1');
$zip->addFromString('entry2.txt', 'entry #2');
$zip->addFromString('dir/entry2d.txt', 'entry #2');
if (!$zip->status == ZIPARCHIVE::ER_OK) {
echo "failed to write zip\n";
}
$zip->close();
if (!$zip->open($file)) {
exit('failed');
}
echo $zip->locateName('entry1.txt') . "\n";
echo $zip->locateName('eNtry2.txt') . "\n";
echo $zip->locateName('eNtry2.txt', ZIPARCHIVE::FL_NOCASE) . "\n";
echo $zip->locateName('enTRy2d.txt', ZIPARCHIVE::FL_NOCASE|ZIPARCHIVE::FL_NODIR) . "\n";
$zip->close();
?>
--EXPECTF--
0
-1
1
2

View file

@ -0,0 +1,46 @@
--TEST--
zip::open() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
$zip = new ZipArchive;
$r = $zip->open($dirname . 'nofile');
if ($r !== TRUE) {
echo "ER_OPEN: ok\n";
} else {
echo "ER_OPEN: FAILED\n";
}
$r = $zip->open($dirname . 'nofile', ZIPARCHIVE::CREATE);
if (!$r) {
echo "create: failed\n";
} else {
echo "create: ok\n";
}
@unlink($dirname . 'nofile');
$zip = new ZipArchive;
$zip->open('');
if (!$zip->open($dirname . 'test.zip')) {
exit("failed 1\n");
}
if ($zip->status == ZIPARCHIVE::ER_OK) {
echo "OK\n";
} else {
echo "failed\n";
}
?>
--EXPECTF--
ER_OPEN: ok
create: ok
Warning: ZipArchive::open(): Empty string as source in %s on line %d
OK

View file

@ -0,0 +1,58 @@
--TEST--
Rename entries
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$dirname = dirname(__FILE__) . '/';
include $dirname . 'utils.php';
$file = $dirname . '__tmp_oo_rename.zip';
@unlink($file);
$zip = new ZipArchive;
if (!$zip->open($file, ZIPARCHIVE::CREATE)) {
exit('failed');
}
$zip->addFromString('entry1.txt', 'entry #1');
$zip->addFromString('entry2.txt', 'entry #2');
$zip->addFromString('dir/entry2.txt', 'entry #2');
if (!$zip->status == ZIPARCHIVE::ER_OK) {
var_dump($zip);
echo "failed\n";
}
$zip->close();
if (!$zip->open($file)) {
exit('failed');
}
dump_entries_name($zip);
echo "\n";
if (!$zip->renameIndex(0, 'ren_entry1.txt')) {
echo "failed index 0\n";
}
if (!$zip->renameName('dir/entry2.txt', 'dir3/ren_entry2.txt')) {
echo "failed name dir/entry2.txt\n";
}
dump_entries_name($zip);
$zip->close();
@unlink($file);
?>
--EXPECTF--
0 entry1.txt
1 entry2.txt
2 dir/entry2.txt
0 ren_entry1.txt
1 entry2.txt
2 dir3/ren_entry2.txt

BIN
ext/zip/tests/test.zip Normal file

Binary file not shown.

Binary file not shown.

8
ext/zip/tests/utils.php Normal file
View file

@ -0,0 +1,8 @@
<?php
/* $Id$ */
function dump_entries_name($z) {
for($i=0; $i<$z->numFiles; $i++) {
$sb = $z->statIndex($i);
echo $i . ' ' . $sb['name'] . "\n";
}
}

View file

@ -0,0 +1,17 @@
--TEST--
zip_close() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
if (!is_resource($zip)) die("Failure");
zip_close($zip);
echo "OK";
?>
--EXPECT--
OK

View file

@ -0,0 +1,23 @@
--TEST--
zip_entry_compressedsize() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
if (!is_resource($zip)) die("Failure");
$entries = 0;
while ($entry = zip_read($zip)) {
echo zip_entry_compressedsize($entry)."\n";
}
zip_close($zip);
?>
--EXPECT--
5
4
0
24

View file

@ -0,0 +1,24 @@
--TEST--
zip_entry_compressionmethod() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
if (!is_resource($zip)) die("Failure");
$entries = 0;
while ($entry = zip_read($zip)) {
echo zip_entry_compressionmethod($entry)."\n";
}
zip_close($zip);
?>
--EXPECT--
stored
stored
stored
deflated

View file

@ -0,0 +1,23 @@
--TEST--
zip_entry_filesize() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
if (!is_resource($zip)) die("Failure");
$entries = 0;
while ($entry = zip_read($zip)) {
echo zip_entry_filesize($entry)."\n";
}
zip_close($zip);
?>
--EXPECT--
5
4
0
27

View file

@ -0,0 +1,23 @@
--TEST--
zip_entry_name() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
if (!is_resource($zip)) die("Failure");
$entries = 0;
while ($entry = zip_read($zip)) {
echo zip_entry_name($entry)."\n";
}
zip_close($zip);
?>
--EXPECT--
foo
bar
foobar/
foobar/baz

View file

@ -0,0 +1,17 @@
--TEST--
zip_entry_open() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
$entry = zip_read($zip);
echo zip_entry_open($zip, $entry, "r") ? "OK" : "Failure";
zip_close($zip);
?>
--EXPECT--
OK

View file

@ -0,0 +1,18 @@
--TEST--
zip_entry_read() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
$entry = zip_read($zip);
if (!zip_entry_open($zip, $entry, "r")) die("Failure");
echo zip_entry_read($entry);
zip_close($zip);
?>
--EXPECT--
foo

View file

@ -0,0 +1,16 @@
--TEST--
zip_open() function
--SKIPIF--
<?php
/* $Id$ */
if(!extension_loaded('zip')) die('skip');
?>
--FILE--
<?php
$zip = zip_open(dirname(__FILE__)."/test_procedural.zip");
echo is_resource($zip) ? "OK" : "Failure";
?>
--EXPECT--
OK

Some files were not shown because too many files have changed in this diff Show more