diff options
author | Sean Finney <seanius@debian.org> | 2009-04-10 14:09:48 +0200 |
---|---|---|
committer | Sean Finney <seanius@debian.org> | 2009-04-10 14:09:48 +0200 |
commit | cd0b49c72aee33b3e44a9c589fcd93b9e1c7a64f (patch) | |
tree | 1315c623bb7d9dfa8d366fa9cd2c6834ceeb5da5 /ext/zip/lib | |
parent | 9ea47aab740772adf0c69d8c94b208a464e599ea (diff) | |
download | php-cd0b49c72aee33b3e44a9c589fcd93b9e1c7a64f.tar.gz |
Imported Upstream version 5.2.9.dfsg.1upstream/5.2.9.dfsg.1
Diffstat (limited to 'ext/zip/lib')
60 files changed, 1080 insertions, 916 deletions
diff --git a/ext/zip/lib/mkstemp.c b/ext/zip/lib/mkstemp.c deleted file mode 100644 index 3ac587eaf..000000000 --- a/ext/zip/lib/mkstemp.c +++ /dev/null @@ -1,136 +0,0 @@ -/* $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*/ -} diff --git a/ext/zip/lib/unistd.h b/ext/zip/lib/unistd.h deleted file mode 100644 index 2ef435c01..000000000 --- a/ext/zip/lib/unistd.h +++ /dev/null @@ -1,3 +0,0 @@ -#ifndef _MSC_VER -#include <unistd.h> -#endif diff --git a/ext/zip/lib/zip.h b/ext/zip/lib/zip.h index 04ffb1471..e63ee7c7a 100644 --- a/ext/zip/lib/zip.h +++ b/ext/zip/lib/zip.h @@ -2,13 +2,11 @@ #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-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -38,24 +36,26 @@ #include "main/php.h" -/* #defines that rename all zip_ functions and structs */ -#include "zip_alias.h" + #ifdef PHP_WIN32 -#include "zip_win32.h" +# include "zip_win32.h" # ifdef PHP_ZIP_EXPORTS -# define PHPZIPAPI __declspec(dllexport) +# define ZIP_EXTERN(rt) __declspec(dllexport)rt _stdcall # else -# define PHPZIPAPI +# define ZIP_EXTERN(rt) rt # endif +#elif defined(__GNUC__) && __GNUC__ >= 4 +# define ZIP_EXTERN(rt) __attribute__ ((visibility("default"))) rt #else -#define PHPZIPAPI +# define ZIP_EXTERN(rt) rt #endif + BEGIN_EXTERN_C() + #include <sys/types.h> #include <stdio.h> #include <time.h> - /* flags for zip_open */ #define ZIP_CREATE 1 @@ -70,6 +70,11 @@ BEGIN_EXTERN_C() #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 */ +#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */ + +/* archive global flags flags */ + +#define ZIP_AFL_TORRENT 1 /* torrent zipped */ /* libzip error codes */ @@ -121,6 +126,13 @@ BEGIN_EXTERN_C() #define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ /* 11 - Reserved by PKWARE */ #define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */ +/* 13 - Reserved by PKWARE */ +#define ZIP_CM_LZMA 14 /* LZMA (EFS) */ +/* 15-17 - Reserved by PKWARE */ +#define ZIP_CM_TERSE 18 /* compressed using IBM TERSE (new) */ +#define ZIP_CM_LZ77 19 /* IBM LZ77 z Architecture (PFS) */ +#define ZIP_CM_WAVPACK 97 /* WavPack compressed data */ +#define ZIP_CM_PPMD 98 /* PPMd version I, Rev 1 */ /* encryption methods */ @@ -170,46 +182,51 @@ struct zip_source; -PHPZIPAPI int zip_add(struct zip *, const char *, struct zip_source *); -PHPZIPAPI int zip_add_dir(struct zip *, const char *); -PHPZIPAPI int zip_close(struct zip *); -PHPZIPAPI int zip_delete(struct zip *, int); -PHPZIPAPI void zip_error_clear(struct zip *); -PHPZIPAPI void zip_error_get(struct zip *, int *, int *); -PHPZIPAPI int zip_error_get_sys_type(int); -PHPZIPAPI int zip_error_to_str(char *, size_t, int, int); -PHPZIPAPI int zip_fclose(struct zip_file *); -PHPZIPAPI void zip_file_error_clear(struct zip_file *); -PHPZIPAPI void zip_file_error_get(struct zip_file *, int *, int *); -PHPZIPAPI const char *zip_file_strerror(struct zip_file *); -PHPZIPAPI struct zip_file *zip_fopen(struct zip *, const char *, int); -PHPZIPAPI struct zip_file *zip_fopen_index(struct zip *, int, int); -PHPZIPAPI ssize_t zip_fread(struct zip_file *, void *, size_t); -PHPZIPAPI const char *zip_get_archive_comment(struct zip *, int *, int); -PHPZIPAPI const char *zip_get_file_comment(struct zip *, int, int *, int); -PHPZIPAPI const char *zip_get_name(struct zip *, int, int); -PHPZIPAPI int zip_get_num_files(struct zip *); -PHPZIPAPI int zip_name_locate(struct zip *, const char *, int); -PHPZIPAPI struct zip *zip_open(const char *, int, int *); -PHPZIPAPI int zip_rename(struct zip *, int, const char *); -PHPZIPAPI int zip_replace(struct zip *, int, struct zip_source *); -PHPZIPAPI int zip_set_archive_comment(struct zip *, const char *, int); -PHPZIPAPI int zip_set_file_comment(struct zip *, int, const char *, int); -PHPZIPAPI struct zip_source *zip_source_buffer(struct zip *, const void *, off_t, int); -PHPZIPAPI struct zip_source *zip_source_file(struct zip *, const char *, off_t, off_t); -PHPZIPAPI struct zip_source *zip_source_filep(struct zip *, FILE *, off_t, off_t); -PHPZIPAPI void zip_source_free(struct zip_source *); -PHPZIPAPI struct zip_source *zip_source_function(struct zip *, +ZIP_EXTERN(int) zip_add(struct zip *, const char *, struct zip_source *); +ZIP_EXTERN(int) zip_add_dir(struct zip *, const char *); +ZIP_EXTERN(int) zip_close(struct zip *); +ZIP_EXTERN(int) zip_delete(struct zip *, int); +ZIP_EXTERN(void) zip_error_clear(struct zip *); +ZIP_EXTERN(void) zip_error_get(struct zip *, int *, int *); +ZIP_EXTERN(int) zip_error_get_sys_type(int); +ZIP_EXTERN(int) zip_error_to_str(char *, size_t, int, int); +ZIP_EXTERN(int) zip_fclose(struct zip_file *); +ZIP_EXTERN(void) zip_file_error_clear(struct zip_file *); +ZIP_EXTERN(void) zip_file_error_get(struct zip_file *, int *, int *); +ZIP_EXTERN(const char *)zip_file_strerror(struct zip_file *); +ZIP_EXTERN(struct zip_file *)zip_fopen(struct zip *, const char *, int); +ZIP_EXTERN(struct zip_file *)zip_fopen_index(struct zip *, int, int); +ZIP_EXTERN(ssize_t) zip_fread(struct zip_file *, void *, size_t); +ZIP_EXTERN(const char *)zip_get_archive_comment(struct zip *, int *, int); +ZIP_EXTERN(int) zip_get_archive_flag(struct zip *, int, int); +ZIP_EXTERN(const char *)zip_get_file_comment(struct zip *, int, int *, int); +ZIP_EXTERN(const char *)zip_get_name(struct zip *, int, int); +ZIP_EXTERN(int) zip_get_num_files(struct zip *); +ZIP_EXTERN(int) zip_name_locate(struct zip *, const char *, int); +ZIP_EXTERN(struct zip *)zip_open(const char *, int, int *); +ZIP_EXTERN(int) zip_rename(struct zip *, int, const char *); +ZIP_EXTERN(int) zip_replace(struct zip *, int, struct zip_source *); +ZIP_EXTERN(int) zip_set_archive_comment(struct zip *, const char *, int); +ZIP_EXTERN(int) zip_set_archive_flag(struct zip *, int, int); +ZIP_EXTERN(int) zip_set_file_comment(struct zip *, int, const char *, int); +ZIP_EXTERN(struct zip_source *)zip_source_buffer(struct zip *, const void *, + off_t, int); +ZIP_EXTERN(struct zip_source *)zip_source_file(struct zip *, const char *, + off_t, off_t); +ZIP_EXTERN(struct zip_source *)zip_source_filep(struct zip *, FILE *, + off_t, off_t); +ZIP_EXTERN(void) zip_source_free(struct zip_source *); +ZIP_EXTERN(struct zip_source *)zip_source_function(struct zip *, zip_source_callback, void *); -PHPZIPAPI struct zip_source *zip_source_zip(struct zip *, struct zip *, int, int, - off_t, off_t); -PHPZIPAPI int zip_stat(struct zip *, const char *, int, struct zip_stat *); -PHPZIPAPI int zip_stat_index(struct zip *, int, int, struct zip_stat *); -PHPZIPAPI void zip_stat_init(struct zip_stat *); -PHPZIPAPI const char *zip_strerror(struct zip *); -PHPZIPAPI int zip_unchange(struct zip *, int); -PHPZIPAPI int zip_unchange_all(struct zip *); -PHPZIPAPI int zip_unchange_archive(struct zip *); +ZIP_EXTERN(struct zip_source *)zip_source_zip(struct zip *, struct zip *, + int, int, off_t, off_t); +ZIP_EXTERN(int) zip_stat(struct zip *, const char *, int, struct zip_stat *); +ZIP_EXTERN(int) zip_stat_index(struct zip *, int, int, struct zip_stat *); +ZIP_EXTERN(void) zip_stat_init(struct zip_stat *); +ZIP_EXTERN(const char *)zip_strerror(struct zip *); +ZIP_EXTERN(int) zip_unchange(struct zip *, int); +ZIP_EXTERN(int) zip_unchange_all(struct zip *); +ZIP_EXTERN(int) zip_unchange_archive(struct zip *); END_EXTERN_C(); #endif /* _HAD_ZIP_H */ diff --git a/ext/zip/lib/zip_add.c b/ext/zip/lib/zip_add.c index 70d1162f7..3afb1768f 100644 --- a/ext/zip/lib/zip_add.c +++ b/ext/zip/lib/zip_add.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,17 +33,17 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(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); } diff --git a/ext/zip/lib/zip_add_dir.c b/ext/zip/lib/zip_add_dir.c index d4da559ec..9b2342519 100644 --- a/ext/zip/lib/zip_add_dir.c +++ b/ext/zip/lib/zip_add_dir.c @@ -1,11 +1,9 @@ /* - $NiH: zip_add_dir.c,v 1.1 2006/10/03 12:23:13 dillo Exp $ - zip_add_dir.c -- add directory - Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -38,12 +36,11 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_add_dir(struct zip *za, const char *name) { int len, ret; diff --git a/ext/zip/lib/zip_alias.h b/ext/zip/lib/zip_alias.h deleted file mode 100644 index 27a7b45df..000000000 --- a/ext/zip/lib/zip_alias.h +++ /dev/null @@ -1,45 +0,0 @@ - -#define zip_source_cmd php_ziplib__zip_source_cmd -#define zip_source_callback php_ziplib__zip_source_callback -#define zip_stat php_ziplib__zip_stat -#define zip php_ziplib__zip -#define zip_file php_ziplib__zip_file -#define zip_source php_ziplib__zip_source -#define zip_add php_ziplib__zip_add -#define zip_add_dir php_ziplib__zip_add_dir -#define zip_close php_ziplib__zip_close -#define zip_delete php_ziplib__zip_delete -#define zip_error_clear php_ziplib__zip_error_clear -#define zip_error_get php_ziplib__zip_error_get -#define zip_error_get_sys_type php_ziplib__zip_error_get_sys_type -#define zip_error_to_str php_ziplib__zip_error_to_str -#define zip_fclose php_ziplib__zip_fclose -#define zip_file_error_clear php_ziplib__zip_fille_error_clear -#define zip_file_error_get php_ziplib__zip_file_error_get -#define zip_file_strerror php_ziplib__zip_file_strerror -#define zip_fopen php_ziplib__zip_fopen -#define zip_fopen_index php_ziplib__zip_fopen_index -#define zip_fread php_ziplib__zip_fread -#define zip_get_archive_comment php_ziplib__zip_get_archive_comment -#define zip_get_file_comment php_ziplib__zip_get_file_comment -#define zip_get_name php_ziplib__zip_get_name -#define zip_get_num_files php_ziplib__zip_get_num_files -#define zip_name_locate php_ziplib__zip_name_locate -#define zip_open php_ziplib__zip_open -#define zip_rename php_ziplib__zip_rename -#define zip_replace php_ziplib__zip_replace -#define zip_set_archive_comment php_ziplib__zip_set_archive_comment -#define zip_set_file_comment php_ziplib__zip_set_file_comment -#define zip_source_buffer php_ziplib__zip_source_buffer -#define zip_source_file php_ziplib__zip_source_file -#define zip_source_filep php_ziplib__zip_source_filep -#define zip_source_free php_ziplib__zip_source_free -#define zip_source_function php_ziplib__zip_source_function -#define zip_source_zip php_ziplib__zip_source_zip -#define zip_stat php_ziplib__zip_stat -#define zip_stat_index php_ziplib__zip_stat_index -#define zip_stat_init php_ziplib__zip_stat_init -#define zip_strerror php_ziplib__zip_strerror -#define zip_unchange php_ziplib__zip_unchange -#define zip_unchange_all php_ziplib__zip_unchange_all -#define zip_unchange_archive php_ziplib__zip_unchange_archive diff --git a/ext/zip/lib/zip_close.c b/ext/zip/lib/zip_close.c index 11ba8e223..289ca7afb 100644 --- a/ext/zip/lib/zip_close.c +++ b/ext/zip/lib/zip_close.c @@ -1,11 +1,9 @@ /* - $NiH: zip_close.c,v 1.60 2006/05/09 17:21:47 wiz Exp $ - zip_close.c -- close zip archive and update changes - Copyright (C) 1999, 2004, 2005 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -32,31 +30,42 @@ 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 int add_data(struct zip *, int, struct zip_dirent *, FILE *); +static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, + FILE *); static int add_data_comp(zip_source_callback, void *, struct zip_stat *, FILE *, struct zip_error *); -static int add_data_uncomp(zip_source_callback, void *, struct zip_stat *, - FILE *, struct zip_error *); +static int add_data_uncomp(struct zip *, zip_source_callback, void *, + struct zip_stat *, FILE *); static void ch_set_error(struct zip_error *, zip_source_callback, void *); static int copy_data(FILE *, off_t, FILE *, struct zip_error *); +static int write_cdir(struct zip *, struct zip_cdir *, FILE *); static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *); static int _zip_changed(struct zip *, int *); static char *_zip_create_temp_output(struct zip *, FILE **); +static int _zip_torrentzip_cmp(const void *, const void *); -PHPZIPAPI int + + +struct filelist { + int idx; + const char *name; +}; + + + +ZIP_EXTERN(int) zip_close(struct zip *za) { int survivors; @@ -66,7 +75,14 @@ zip_close(struct zip *za) mode_t mask; struct zip_cdir *cd; struct zip_dirent de; - int rename_error = 0; + struct filelist *filelist; + int reopen_on_error; + int new_torrentzip; + + reopen_on_error = 0; + + if (za == NULL) + return -1; if (!_zip_changed(za, &survivors)) { _zip_free(za); @@ -75,7 +91,7 @@ zip_close(struct zip *za) /* don't create zip files with no entries */ if (survivors == 0) { - if (za->zn) { + if (za->zn && za->zp) { if (remove(za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_REMOVE, errno); return -1; @@ -85,52 +101,92 @@ zip_close(struct zip *za) return 0; } - if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) + if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors)) + == NULL) + return -1; + + if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) { + free(filelist); return -1; + } for (i=0; i<survivors; i++) _zip_dirent_init(&cd->entry[i]); + /* archive comment is special for torrentzip */ + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) { + cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX", + TORRENT_SIG_LEN + TORRENT_CRC_LEN, + &za->error); + if (cd->comment == NULL) { + _zip_cdir_free(cd); + free(filelist); + return -1; + } + cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN; + } + else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) { if (_zip_cdir_set_comment(cd, za) == -1) { _zip_cdir_free(cd); + free(filelist); return -1; } + } if ((temp=_zip_create_temp_output(za, &out)) == NULL) { _zip_cdir_free(cd); return -1; } - error = 0; + + /* create list of files with index into original archive */ for (i=j=0; i<za->nentry; i++) { if (za->entry[i].state == ZIP_ST_DELETED) continue; + filelist[j].idx = i; + filelist[j].name = zip_get_name(za, i, 0); + j++; + } + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + qsort(filelist, survivors, sizeof(filelist[0]), + _zip_torrentzip_cmp); + + new_torrentzip = (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 1 + && zip_get_archive_flag(za, ZIP_AFL_TORRENT, + ZIP_FL_UNCHANGED) == 0); + error = 0; + for (j=0; j<survivors; j++) { + i = filelist[j].idx; + /* create new local directory entry */ - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { + if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { _zip_dirent_init(&de); + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(&de); + /* use it as central directory entry */ memcpy(cd->entry+j, &de, sizeof(cd->entry[j])); /* set/update file name */ if (za->entry[i].ch_filename == NULL) { - if (za->entry[i].state == ZIP_ST_REPLACED) { - de.filename = strdup(za->cdir->entry[i].filename); - de.filename_len = strlen(de.filename); - cd->entry[j].filename = za->cdir->entry[i].filename; - cd->entry[j].filename_len = de.filename_len; - } - else { + if (za->entry[i].state == ZIP_ST_ADDED) { de.filename = strdup("-"); de.filename_len = 1; cd->entry[j].filename = "-"; + } + else { + de.filename = strdup(za->cdir->entry[i].filename); + de.filename_len = strlen(de.filename); + cd->entry[j].filename = za->cdir->entry[i].filename; cd->entry[j].filename_len = de.filename_len; } } } else { /* copy existing directory entries */ - if (fseek(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0) { + if (fseeko(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); error = 1; break; @@ -139,11 +195,11 @@ zip_close(struct zip *za) error = 1; break; } - - if (de.bitflags & ZIP_GPBF_USE_DATA_DESCRIPTOR) { - de.crc = (za->cdir->entry+i)->crc; - de.comp_size = (za->cdir->entry+i)->comp_size; - de.uncomp_size = (za->cdir->entry+i)->uncomp_size; + if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { + de.crc = za->cdir->entry[i].crc; + de.comp_size = za->cdir->entry[i].comp_size; + de.uncomp_size = za->cdir->entry[i].uncomp_size; + de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; } memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j])); } @@ -159,20 +215,31 @@ zip_close(struct zip *za) cd->entry[j].filename_len = de.filename_len; } - if (za->entry[i].ch_comment_len != -1) { + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0 + && za->entry[i].ch_comment_len != -1) { /* as the rest of cd entries, its malloc/free is done by za */ cd->entry[j].comment = za->entry[i].ch_comment; cd->entry[j].comment_len = za->entry[i].ch_comment_len; } - cd->entry[j].offset = ftell(out); + cd->entry[j].offset = ftello(out); + + if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { + struct zip_source *zs; - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { - if (add_data(za, i, &de, out) < 0) { + zs = NULL; + if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { + if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) + == NULL) { error = 1; break; } + } + if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) { + error = 1; + break; + } cd->entry[j].last_mod = de.last_mod; cd->entry[j].comp_method = de.comp_method; cd->entry[j].comp_size = de.comp_size; @@ -185,19 +252,18 @@ zip_close(struct zip *za) break; } /* we just read the local dirent, file is at correct position */ - if (copy_data(za->zp, de.comp_size, out, &za->error) < 0) { + if (copy_data(za->zp, cd->entry[j].comp_size, out, + &za->error) < 0) { error = 1; break; } } - j++; - _zip_dirent_finalize(&de); } if (!error) { - if (_zip_cdir_write(cd, out, &za->error) < 0) + if (write_cdir(za, cd, out) < 0) error = 1; } @@ -223,46 +289,40 @@ zip_close(struct zip *za) if (za->zp) { fclose(za->zp); za->zp = NULL; + reopen_on_error = 1; } - -#ifdef PHP_WIN32 - if (!MoveFileEx(temp, za->zn, MOVEFILE_REPLACE_EXISTING)) { - rename_error = -1; - } -#else - if (rename(temp, za->zn) != 0) { - rename_error = -1; - } -#endif - - if (rename_error < 0) { + if (_zip_rename(temp, za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_RENAME, errno); remove(temp); free(temp); + if (reopen_on_error) { + /* ignore errors, since we're already in an error case */ + za->zp = fopen(za->zn, "rb"); + } return -1; } - mask = umask(0); umask(mask); chmod(za->zn, 0666&~mask); _zip_free(za); free(temp); + return 0; } static int -add_data(struct zip *za, int idx, struct zip_dirent *de, FILE *ft) +add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft) { off_t offstart, offend; zip_source_callback cb; void *ud; struct zip_stat st; - cb = za->entry[idx].source->f; - ud = za->entry[idx].source->ud; + cb = zs->f; + ud = zs->ud; if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) { ch_set_error(&za->error, cb, ud); @@ -274,7 +334,7 @@ add_data(struct zip *za, int idx, struct zip_dirent *de, FILE *ft) return -1; } - offstart = ftell(ft); + offstart = ftello(ft); if (_zip_dirent_write(de, ft, 1, &za->error) < 0) return -1; @@ -284,7 +344,7 @@ add_data(struct zip *za, int idx, struct zip_dirent *de, FILE *ft) return -1; } else { - if (add_data_uncomp(cb, ud, &st, ft, &za->error) < 0) + if (add_data_uncomp(za, cb, ud, &st, ft) < 0) return -1; } @@ -293,23 +353,27 @@ add_data(struct zip *za, int idx, struct zip_dirent *de, FILE *ft) return -1; } - offend = ftell(ft); + offend = ftello(ft); - if (fseek(ft, offstart, SEEK_SET) < 0) { + if (fseeko(ft, offstart, SEEK_SET) < 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return -1; } - de->comp_method = st.comp_method; + de->last_mod = st.mtime; + de->comp_method = st.comp_method; de->crc = st.crc; de->uncomp_size = st.size; de->comp_size = st.comp_size; + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(de); + if (_zip_dirent_write(de, ft, 1, &za->error) < 0) return -1; - if (fseek(ft, offend, SEEK_SET) < 0) { + if (fseeko(ft, offend, SEEK_SET) < 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return -1; } @@ -346,14 +410,15 @@ add_data_comp(zip_source_callback cb, void *ud, struct zip_stat *st,FILE *ft, static int -add_data_uncomp(zip_source_callback cb, void *ud, struct zip_stat *st, - FILE *ft, struct zip_error *error) +add_data_uncomp(struct zip *za, zip_source_callback cb, void *ud, + struct zip_stat *st, FILE *ft) { char b1[BUFSIZE], b2[BUFSIZE]; int end, flush, ret; ssize_t n; size_t n2; z_stream zstr; + int mem_level; st->comp_method = ZIP_CM_DEFLATE; st->comp_size = st->size = 0; @@ -365,8 +430,13 @@ add_data_uncomp(zip_source_callback cb, void *ud, struct zip_stat *st, zstr.avail_in = 0; zstr.avail_out = 0; - /* -15: undocumented feature of zlib to _not_ write a zlib header */ - deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -15, 9, + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + mem_level = TORRENT_MEM_LEVEL; + else + mem_level = MAX_MEM_LEVEL; + + /* -MAX_WBITS: undocumented feature of zlib to _not_ write a zlib header */ + deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, mem_level, Z_DEFAULT_STRATEGY); zstr.next_out = (Bytef *)b2; @@ -378,7 +448,7 @@ add_data_uncomp(zip_source_callback cb, void *ud, struct zip_stat *st, while (!end) { if (zstr.avail_in == 0 && !flush) { if ((n=cb(ud, b1, sizeof(b1), ZIP_SOURCE_READ)) < 0) { - ch_set_error(error, cb, ud); + ch_set_error(&za->error, cb, ud); deflateEnd(&zstr); return -1; } @@ -394,7 +464,7 @@ add_data_uncomp(zip_source_callback cb, void *ud, struct zip_stat *st, ret = deflate(&zstr, flush); if (ret != Z_OK && ret != Z_STREAM_END) { - _zip_error_set(error, ZIP_ER_ZLIB, ret); + _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); return -1; } @@ -402,7 +472,7 @@ add_data_uncomp(zip_source_callback cb, void *ud, struct zip_stat *st, n2 = sizeof(b2) - zstr.avail_out; if (fwrite(b2, 1, n2, ft) != n2) { - _zip_error_set(error, ZIP_ER_WRITE, errno); + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); return -1; } @@ -473,6 +543,44 @@ copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error) static int +write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) +{ + off_t offset; + uLong crc; + char buf[TORRENT_CRC_LEN+1]; + + if (_zip_cdir_write(cd, out, &za->error) < 0) + return -1; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0) + return 0; + + + /* fix up torrentzip comment */ + + offset = ftello(out); + + if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0) + return -1; + + snprintf(buf, sizeof(buf), "%08lX", (long)crc); + + if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fwrite(buf, TORRENT_CRC_LEN, 1, out) != 1) { + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +static int _zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src) { if (src->ch_comment_len != -1) { @@ -503,7 +611,8 @@ _zip_changed(struct zip *za, int *survivorsp) changed = survivors = 0; - if (za->ch_comment_len != -1) + if (za->ch_comment_len != -1 + || za->ch_flags != za->flags) changed = 1; for (i=0; i<za->nentry; i++) { @@ -527,14 +636,14 @@ _zip_create_temp_output(struct zip *za, FILE **outp) char *temp; int tfd; FILE *tfp; - int len = strlen(za->zn) + 8; + int len = strlen(za->zn) + 8; - if ((temp=(char *)malloc(len)) == NULL) { + if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } - snprintf(temp, len, "%s.XXXXXX", za->zn); + snprintf(temp, len, "%s.XXXXXX", za->zn); if ((tfd=mkstemp(temp)) == -1) { _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); @@ -556,3 +665,12 @@ _zip_create_temp_output(struct zip *za, FILE **outp) *outp = tfp; return temp; } + + + +static int +_zip_torrentzip_cmp(const void *a, const void *b) +{ + return strcasecmp(((const struct filelist *)a)->name, + ((const struct filelist *)b)->name); +} diff --git a/ext/zip/lib/zip_delete.c b/ext/zip/lib/zip_delete.c index eb5055b68..4591ff7f8 100644 --- a/ext/zip/lib/zip_delete.c +++ b/ext/zip/lib/zip_delete.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_delete(struct zip *za, int idx) { if (idx < 0 || idx >= za->nentry) { diff --git a/ext/zip/lib/zip_dirent.c b/ext/zip/lib/zip_dirent.c index f796f8d66..425f7ff92 100644 --- a/ext/zip/lib/zip_dirent.c +++ b/ext/zip/lib/zip_dirent.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -33,18 +31,15 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "main/php_reentrancy.h" + + #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); @@ -56,7 +51,7 @@ static void _zip_write4(unsigned int, FILE *); -PHPZIPAPI void +void _zip_cdir_free(struct zip_cdir *cd) { int i; @@ -73,7 +68,7 @@ _zip_cdir_free(struct zip_cdir *cd) -PHPZIPAPI struct zip_cdir * +struct zip_cdir * _zip_cdir_new(int nentry, struct zip_error *error) { struct zip_cdir *cd; @@ -102,19 +97,19 @@ _zip_cdir_new(int nentry, struct zip_error *error) -PHPZIPAPI int +int _zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) { int i; - cd->offset = ftell(fp); + cd->offset = ftello(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; + cd->size = ftello(fp) - cd->offset; /* clearerr(fp); */ fwrite(EOCD_MAGIC, 1, 4, fp); @@ -136,7 +131,7 @@ _zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) -PHPZIPAPI void +void _zip_dirent_finalize(struct zip_dirent *zde) { free(zde->filename); @@ -149,7 +144,7 @@ _zip_dirent_finalize(struct zip_dirent *zde) -PHPZIPAPI void +void _zip_dirent_init(struct zip_dirent *de) { de->version_madeby = 0; @@ -188,7 +183,7 @@ _zip_dirent_init(struct zip_dirent *de) returned. */ -PHPZIPAPI int +int _zip_dirent_read(struct zip_dirent *zde, FILE *fp, unsigned char **bufp, unsigned int left, int localp, struct zip_error *error) @@ -323,6 +318,63 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, +/* _zip_dirent_torrent_normalize(de); + Set values suitable for torrentzip. +*/ + +void +_zip_dirent_torrent_normalize(struct zip_dirent *de) +{ + static struct tm torrenttime; + static time_t last_mod = 0; + + if (last_mod == 0) { +#ifdef HAVE_STRUCT_TM_TM_ZONE + time_t now; + struct tm *l; +#endif + + torrenttime.tm_sec = 0; + torrenttime.tm_min = 32; + torrenttime.tm_hour = 23; + torrenttime.tm_mday = 24; + torrenttime.tm_mon = 11; + torrenttime.tm_year = 96; + torrenttime.tm_wday = 0; + torrenttime.tm_yday = 0; + torrenttime.tm_isdst = 0; + +#ifdef HAVE_STRUCT_TM_TM_ZONE + time(&now); + l = localtime(&now); + torrenttime.tm_gmtoff = l->tm_gmtoff; + torrenttime.tm_zone = l->tm_zone; +#endif + + last_mod = mktime(&torrenttime); + } + + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 2; /* maximum compression */ + de->comp_method = ZIP_CM_DEFLATE; + de->last_mod = last_mod; + + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + de->offset = 0; + + free(de->extrafield); + de->extrafield = NULL; + de->extrafield_len = 0; + free(de->comment); + de->comment = NULL; + de->comment_len = 0; +} + + + /* _zip_dirent_write(zde, fp, localp, error): Writes zip directory entry zde to file fp. @@ -333,7 +385,7 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, returned. */ -PHPZIPAPI int +int _zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, struct zip_error *error) { @@ -390,11 +442,13 @@ _zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, static time_t _zip_d2u_time(int dtime, int ddate) { - struct tm *tm, tmbuf; + struct tm *tm; time_t now; now = time(NULL); - tm = php_localtime_r(&now, &tmbuf); + tm = localtime(&now); + /* let mktime decide if DST is in effect */ + tm->tm_isdst = -1; tm->tm_year = ((ddate>>9)&127) + 1980 - 1900; tm->tm_mon = ((ddate>>5)&15) - 1; @@ -409,7 +463,7 @@ _zip_d2u_time(int dtime, int ddate) -PHPZIPAPI unsigned short +unsigned short _zip_read2(unsigned char **a) { unsigned short ret; @@ -422,7 +476,7 @@ _zip_read2(unsigned char **a) -PHPZIPAPI unsigned int +unsigned int _zip_read4(unsigned char **a) { unsigned int ret; @@ -519,9 +573,9 @@ _zip_write4(unsigned int i, FILE *fp) static void _zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate) { - struct tm *tm, tmbuf; + struct tm *tm; - tm = php_localtime_r(&time, &tmbuf); + 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) diff --git a/ext/zip/lib/zip_entry_free.c b/ext/zip/lib/zip_entry_free.c index 1bab313ed..c50c9434b 100644 --- a/ext/zip/lib/zip_entry_free.c +++ b/ext/zip/lib/zip_entry_free.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +void _zip_entry_free(struct zip_entry *ze) { free(ze->ch_filename); diff --git a/ext/zip/lib/zip_entry_new.c b/ext/zip/lib/zip_entry_new.c index 67e13fd84..7059b1b06 100644 --- a/ext/zip/lib/zip_entry_new.c +++ b/ext/zip/lib/zip_entry_new.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI struct zip_entry * +struct zip_entry * _zip_entry_new(struct zip *za) { struct zip_entry *ze; diff --git a/ext/zip/lib/zip_err_str.c b/ext/zip/lib/zip_err_str.c index c74538d64..3fcdf1738 100644 --- a/ext/zip/lib/zip_err_str.c +++ b/ext/zip/lib/zip_err_str.c @@ -1,12 +1,8 @@ /* 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" diff --git a/ext/zip/lib/zip_error.c b/ext/zip/lib/zip_error.c index 4816b73ae..aab707945 100644 --- a/ext/zip/lib/zip_error.c +++ b/ext/zip/lib/zip_error.c @@ -1,11 +1,9 @@ /* - $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-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +void _zip_error_clear(struct zip_error *err) { err->zip_err = ZIP_ER_OK; @@ -51,7 +48,7 @@ _zip_error_clear(struct zip_error *err) -PHPZIPAPI void +void _zip_error_copy(struct zip_error *dst, struct zip_error *src) { dst->zip_err = src->zip_err; @@ -60,7 +57,7 @@ _zip_error_copy(struct zip_error *dst, struct zip_error *src) -PHPZIPAPI void +void _zip_error_fini(struct zip_error *err) { free(err->str); @@ -69,7 +66,7 @@ _zip_error_fini(struct zip_error *err) -PHPZIPAPI void +void _zip_error_get(struct zip_error *err, int *zep, int *sep) { if (zep) @@ -84,7 +81,7 @@ _zip_error_get(struct zip_error *err, int *zep, int *sep) -PHPZIPAPI void +void _zip_error_init(struct zip_error *err) { err->zip_err = ZIP_ER_OK; @@ -94,7 +91,7 @@ _zip_error_init(struct zip_error *err) -PHPZIPAPI void +void _zip_error_set(struct zip_error *err, int ze, int se) { if (err) { diff --git a/ext/zip/lib/zip_error_clear.c b/ext/zip/lib/zip_error_clear.c index 8a76f4440..34e7dea48 100644 --- a/ext/zip/lib/zip_error_clear.c +++ b/ext/zip/lib/zip_error_clear.c @@ -1,11 +1,9 @@ /* - $NiH: zip_error_clear.c,v 1.1 2006/10/04 15:21:09 dillo Exp $ - zip_error_clear.c -- clear zip error - Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +ZIP_EXTERN(void) zip_error_clear(struct zip *za) { _zip_error_clear(&za->error); diff --git a/ext/zip/lib/zip_error_get.c b/ext/zip/lib/zip_error_get.c index 888b54569..c15705e32 100644 --- a/ext/zip/lib/zip_error_get.c +++ b/ext/zip/lib/zip_error_get.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +ZIP_EXTERN(void) zip_error_get(struct zip *za, int *zep, int *sep) { _zip_error_get(&za->error, zep, sep); diff --git a/ext/zip/lib/zip_error_get_sys_type.c b/ext/zip/lib/zip_error_get_sys_type.c index bfe642383..47aa93e69 100644 --- a/ext/zip/lib/zip_error_get_sys_type.c +++ b/ext/zip/lib/zip_error_get_sys_type.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_error_get_sys_type(int ze) { if (ze < 0 || ze >= _zip_nerr_str) diff --git a/ext/zip/lib/zip_error_strerror.c b/ext/zip/lib/zip_error_strerror.c index 06e98c76d..3d0951cfb 100644 --- a/ext/zip/lib/zip_error_strerror.c +++ b/ext/zip/lib/zip_error_strerror.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,12 +38,11 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI const char * +const char * _zip_error_strerror(struct zip_error *err) { const char *zs, *ss; @@ -54,7 +51,7 @@ _zip_error_strerror(struct zip_error *err) _zip_error_fini(err); if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) { - snprintf(buf, sizeof(buf), "Unknown error %d", err->zip_err); + sprintf(buf, "Unknown error %d", err->zip_err); zs = NULL; ss = buf; } @@ -78,16 +75,16 @@ _zip_error_strerror(struct zip_error *err) if (ss == NULL) return zs; else { - int l = strlen(ss) + (zs ? strlen(zs)+2 : 0) + 1; - if ((s=(char *)malloc(l)) == NULL) + if ((s=(char *)malloc(strlen(ss) + + (zs ? strlen(zs)+2 : 0) + 1)) == NULL) return _zip_err_str[ZIP_ER_MEMORY]; - snprintf(s, l, "%s%s%s", + sprintf(s, "%s%s%s", (zs ? zs : ""), (zs ? ": " : ""), ss); err->str = s; - return ss; + return s; } } diff --git a/ext/zip/lib/zip_error_to_str.c b/ext/zip/lib/zip_error_to_str.c index 665803472..4dea4d667 100644 --- a/ext/zip/lib/zip_error_to_str.c +++ b/ext/zip/lib/zip_error_to_str.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,12 +38,11 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_error_to_str(char *buf, size_t len, int ze, int se) { const char *zs, *ss; diff --git a/ext/zip/lib/zip_fclose.c b/ext/zip/lib/zip_fclose.c index 91f30b7bb..8f062d9d0 100644 --- a/ext/zip/lib/zip_fclose.c +++ b/ext/zip/lib/zip_fclose.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_fclose(struct zip_file *zf) { int i, ret; @@ -51,7 +48,6 @@ zip_fclose(struct zip_file *zf) inflateEnd(zf->zstr); free(zf->buffer); free(zf->zstr); - if (zf->za) { for (i=0; i<zf->za->nfile; i++) { if (zf->za->file[i] == zf) { diff --git a/ext/zip/lib/zip_file_error_clear.c b/ext/zip/lib/zip_file_error_clear.c index dca33b35f..6c9c2a02b 100644 --- a/ext/zip/lib/zip_file_error_clear.c +++ b/ext/zip/lib/zip_file_error_clear.c @@ -1,11 +1,9 @@ /* - $NiH: zip_file_error_clear.c,v 1.4 2006/10/04 18:37:54 wiz Exp $ - zip_file_error_clear.c -- clear zip file error - Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +ZIP_EXTERN(void) zip_file_error_clear(struct zip_file *zf) { _zip_error_clear(&zf->error); diff --git a/ext/zip/lib/zip_file_error_get.c b/ext/zip/lib/zip_file_error_get.c index 05516703c..a53fa7e00 100644 --- a/ext/zip/lib/zip_file_error_get.c +++ b/ext/zip/lib/zip_file_error_get.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +ZIP_EXTERN(void) zip_file_error_get(struct zip_file *zf, int *zep, int *sep) { _zip_error_get(&zf->error, zep, sep); diff --git a/ext/zip/lib/zip_file_get_offset.c b/ext/zip/lib/zip_file_get_offset.c index 493004023..68f92f1fe 100644 --- a/ext/zip/lib/zip_file_get_offset.c +++ b/ext/zip/lib/zip_file_get_offset.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,13 +37,9 @@ #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" @@ -56,7 +50,7 @@ On error, fills in za->error and returns 0. */ -PHPZIPAPI unsigned int +unsigned int _zip_file_get_offset(struct zip *za, int idx) { struct zip_dirent de; @@ -64,7 +58,7 @@ _zip_file_get_offset(struct zip *za, int idx) offset = za->cdir->entry[idx].offset; - if (fseek(za->zp, offset, SEEK_SET) != 0) { + if (fseeko(za->zp, offset, SEEK_SET) != 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return 0; } diff --git a/ext/zip/lib/zip_file_strerror.c b/ext/zip/lib/zip_file_strerror.c index 2cc79c133..c2864f2ba 100644 --- a/ext/zip/lib/zip_file_strerror.c +++ b/ext/zip/lib/zip_file_strerror.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI const char * +ZIP_EXTERN(const char *) zip_file_strerror(struct zip_file *zf) { return _zip_error_strerror(&zf->error); diff --git a/ext/zip/lib/zip_filerange_crc.c b/ext/zip/lib/zip_filerange_crc.c new file mode 100644 index 000000000..4d1ad5669 --- /dev/null +++ b/ext/zip/lib/zip_filerange_crc.c @@ -0,0 +1,71 @@ +/* + zip_filerange_crc.c -- compute CRC32 for a range of a file + Copyright (C) 2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.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 <errno.h> + +#include "zipint.h" + + + + +int +_zip_filerange_crc(FILE *fp, off_t start, off_t len, uLong *crcp, + struct zip_error *errp) +{ + Bytef buf[BUFSIZE]; + size_t n; + + *crcp = crc32(0L, Z_NULL, 0); + + if (fseeko(fp, start, SEEK_SET) != 0) { + _zip_error_set(errp, ZIP_ER_SEEK, errno); + return -1; + } + + while (len > 0) { + n = len > BUFSIZE ? BUFSIZE : len; + if ((n=fread(buf, 1, n, fp)) <= 0) { + _zip_error_set(errp, ZIP_ER_READ, errno); + return -1; + } + + *crcp = crc32(*crcp, buf, n); + + len-= n; + } + + return 0; +} diff --git a/ext/zip/lib/zip_fopen.c b/ext/zip/lib/zip_fopen.c index c05ad45bd..b4b76049f 100644 --- a/ext/zip/lib/zip_fopen.c +++ b/ext/zip/lib/zip_fopen.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI struct zip_file * +ZIP_EXTERN(struct zip_file *) zip_fopen(struct zip *za, const char *fname, int flags) { int idx; diff --git a/ext/zip/lib/zip_fopen_index.c b/ext/zip/lib/zip_fopen_index.c index 105cefe73..1e7e41989 100644 --- a/ext/zip/lib/zip_fopen_index.c +++ b/ext/zip/lib/zip_fopen_index.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,14 +37,13 @@ #include <stdio.h> #include <stdlib.h> -#include "zip.h" #include "zipint.h" static struct zip_file *_zip_file_new(struct zip *za); -PHPZIPAPI struct zip_file * +ZIP_EXTERN(struct zip_file *) zip_fopen_index(struct zip *za, int fileno, int flags) { int len, ret; @@ -141,7 +138,7 @@ zip_fopen_index(struct zip *za, int fileno, int flags) -PHPZIPAPI int +int _zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf) { int i, j; @@ -152,7 +149,7 @@ _zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf) if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0) return 0; - if (fseek(zf->za->zp, zf->fpos, SEEK_SET) < 0) { + if (fseeko(zf->za->zp, zf->fpos, SEEK_SET) < 0) { _zip_error_set(&zf->error, ZIP_ER_SEEK, errno); return -1; } diff --git a/ext/zip/lib/zip_fread.c b/ext/zip/lib/zip_fread.c index 064d2b97f..1a2b0e381 100644 --- a/ext/zip/lib/zip_fread.c +++ b/ext/zip/lib/zip_fread.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI ssize_t +ZIP_EXTERN(ssize_t) zip_fread(struct zip_file *zf, void *outbuf, size_t toread) { int ret; diff --git a/ext/zip/lib/zip_free.c b/ext/zip/lib/zip_free.c index 534c58eb0..76c3a9673 100644 --- a/ext/zip/lib/zip_free.c +++ b/ext/zip/lib/zip_free.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,7 +34,7 @@ #include <stdlib.h> -#include "zip.h" + #include "zipint.h" @@ -45,7 +43,7 @@ frees the space allocated to a zipfile struct, and closes the corresponding file. */ -PHPZIPAPI void +void _zip_free(struct zip *za) { int i; @@ -59,9 +57,6 @@ _zip_free(struct zip *za) if (za->zp) fclose(za->zp); - if (za->ch_comment) - free(za->ch_comment); - _zip_cdir_free(za->cdir); if (za->entry) { diff --git a/ext/zip/lib/zip_get_archive_comment.c b/ext/zip/lib/zip_get_archive_comment.c index c23597c09..ed1324fd5 100644 --- a/ext/zip/lib/zip_get_archive_comment.c +++ b/ext/zip/lib/zip_get_archive_comment.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 2006-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI const char * +ZIP_EXTERN(const char *) zip_get_archive_comment(struct zip *za, int *lenp, int flags) { if ((flags & ZIP_FL_UNCHANGED) @@ -50,6 +47,11 @@ zip_get_archive_comment(struct zip *za, int *lenp, int flags) *lenp = za->cdir->comment_len; return za->cdir->comment; } + else { + if (lenp != NULL) + *lenp = -1; + return NULL; + } } if (lenp != NULL) diff --git a/ext/zip/lib/zip_get_archive_flag.c b/ext/zip/lib/zip_get_archive_flag.c new file mode 100644 index 000000000..2d46aa39f --- /dev/null +++ b/ext/zip/lib/zip_get_archive_flag.c @@ -0,0 +1,48 @@ +/* + zip_get_archive_flag.c -- get archive global flag + Copyright (C) 2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.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 "zipint.h" + + + +ZIP_EXTERN(int) +zip_get_archive_flag(struct zip *za, int flag, int flags) +{ + int fl; + + fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; + + return (fl & flag) ? 1 : 0; +} diff --git a/ext/zip/lib/zip_get_file_comment.c b/ext/zip/lib/zip_get_file_comment.c index 476ac7da0..57dd9028b 100644 --- a/ext/zip/lib/zip_get_file_comment.c +++ b/ext/zip/lib/zip_get_file_comment.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 2006-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI const char * +ZIP_EXTERN(const char *) zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags) { if (idx < 0 || idx >= za->nentry) { diff --git a/ext/zip/lib/zip_get_name.c b/ext/zip/lib/zip_get_name.c index c2cae2518..b58d97205 100644 --- a/ext/zip/lib/zip_get_name.c +++ b/ext/zip/lib/zip_get_name.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI const char * +ZIP_EXTERN(const char *) zip_get_name(struct zip *za, int idx, int flags) { return _zip_get_name(za, idx, flags, &za->error); @@ -48,7 +45,7 @@ zip_get_name(struct zip *za, int idx, int flags) -PHPZIPAPI const char * +const char * _zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error) { if (idx < 0 || idx >= za->nentry) { diff --git a/ext/zip/lib/zip_get_num_files.c b/ext/zip/lib/zip_get_num_files.c index 05a54fcb6..a442f293e 100644 --- a/ext/zip/lib/zip_get_num_files.c +++ b/ext/zip/lib/zip_get_num_files.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_get_num_files(struct zip *za) { if (za == NULL) diff --git a/ext/zip/lib/zip_memdup.c b/ext/zip/lib/zip_memdup.c index ebb7426dd..641125ed2 100644 --- a/ext/zip/lib/zip_memdup.c +++ b/ext/zip/lib/zip_memdup.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,12 +34,11 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI void * +void * _zip_memdup(const void *mem, size_t len, struct zip_error *error) { void *ret; diff --git a/ext/zip/lib/zip_name_locate.c b/ext/zip/lib/zip_name_locate.c index 108db4f60..e8b35ff93 100644 --- a/ext/zip/lib/zip_name_locate.c +++ b/ext/zip/lib/zip_name_locate.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -19,7 +17,7 @@ 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 @@ -37,12 +35,11 @@ #include <string.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_name_locate(struct zip *za, const char *fname, int flags) { return _zip_name_locate(za, fname, flags, &za->error); @@ -50,7 +47,7 @@ zip_name_locate(struct zip *za, const char *fname, int flags) -PHPZIPAPI int +int _zip_name_locate(struct zip *za, const char *fname, int flags, struct zip_error *error) { @@ -62,11 +59,8 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, _zip_error_set(error, ZIP_ER_INVAL, 0); return -1; } -#ifdef PHP_WIN32 - cmp = (flags & ZIP_FL_NOCASE) ? stricmp : strcmp; -#else - cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; -#endif + + cmp = (flags & ZIP_FL_NOCASE) ? strcmpi : strcmp; n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; for (i=0; i<n; i++) { @@ -78,7 +72,7 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, /* newly added (partially filled) entry */ if (fn == NULL) continue; - + if (flags & ZIP_FL_NODIR) { p = strrchr(fn, '/'); if (p) @@ -89,6 +83,7 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, return i; } - _zip_error_set(error, ZIP_ER_NOENT, 0); +/* Look for an entry should not raise an error */ +/* _zip_error_set(error, ZIP_ER_NOENT, 0);*/ return -1; } diff --git a/ext/zip/lib/zip_new.c b/ext/zip/lib/zip_new.c index 378513b6c..3e8ccee64 100644 --- a/ext/zip/lib/zip_new.c +++ b/ext/zip/lib/zip_new.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,7 +34,7 @@ #include <stdlib.h> -#include "zip.h" + #include "zipint.h" @@ -45,7 +43,7 @@ creates a new zipfile struct, and sets the contents to zero; returns the new struct. */ -PHPZIPAPI struct zip * +struct zip * _zip_new(struct zip_error *error) { struct zip *za; @@ -66,6 +64,7 @@ _zip_new(struct zip_error *error) za->entry = NULL; za->nfile = za->nfile_alloc = 0; za->file = NULL; + za->flags = za->ch_flags = 0; return za; } diff --git a/ext/zip/lib/zip_open.c b/ext/zip/lib/zip_open.c index 711dcb1ca..0880eef2c 100644 --- a/ext/zip/lib/zip_open.c +++ b/ext/zip/lib/zip_open.c @@ -1,11 +1,9 @@ /* - $NiH: zip_open.c,v 1.38 2006/05/04 00:01:26 dillo Exp $ - zip_open.c -- open zip archive - Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,18 +35,19 @@ #include <sys/stat.h> #include <errno.h> +#include <limits.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 struct zip *_zip_allocate_new(const char *, int *); static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); +static void _zip_check_torrentzip(struct zip *); +static struct zip_cdir *_zip_find_central_dir(FILE *, int, int *, off_t); +static int _zip_file_exists(const char *, int, int *); static int _zip_headercomp(struct zip_dirent *, int, struct zip_dirent *, int); static unsigned char *_zip_memmem(const unsigned char *, int, @@ -58,154 +57,58 @@ static struct zip_cdir *_zip_readcdir(FILE *, unsigned char *, unsigned char *, -PHPZIPAPI struct zip * +ZIP_EXTERN(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); + struct zip_cdir *cdir; + int i; + off_t len; + + switch (_zip_file_exists(fn, flags, zep)) { + case -1: + if (!(flags & ZIP_OVERWRITE)) { return NULL; + } + + case 0: + return _zip_allocate_new(fn, zep); + default: + break; } - if (flags & ZIP_OVERWRITE || stat(fn, &st) != 0) { - if ((flags & ZIP_CREATE) || (flags & ZIP_OVERWRITE)) { - 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); + if ((fp=fopen(fn, "rb")) == NULL) { + set_error(zep, NULL, ZIP_ER_OPEN); 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; - } - -#ifdef PHP_WIN32 - _setmode(_fileno(fp), _O_BINARY ); -#endif + fseeko(fp, 0, SEEK_END); + len = ftello(fp); - 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; + /* treat empty files as empty archives */ + if (len == 0) { + if ((za=_zip_allocate_new(fn, zep)) == NULL) + fclose(fp); + else + za->zp = fp; + return za; } - clearerr(fp); - buflen = fread(buf, 1, CDBUFSIZE, fp); - - if (ferror(fp)) { - set_error(zep, NULL, ZIP_ER_READ); - free(buf); + cdir = _zip_find_central_dir(fp, flags, zep, len); + if (cdir == NULL) { 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); + if ((za=_zip_allocate_new(fn, zep)) == NULL) { _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; - } + za->zp = fp; if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry)) * cdir->nentry)) == NULL) { @@ -216,6 +119,9 @@ zip_open(const char *fn, int flags, int *zep) for (i=0; i<cdir->nentry; i++) _zip_entry_new(za); + _zip_check_torrentzip(za); + za->ch_flags = za->flags; + return za; } @@ -295,13 +201,14 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, return NULL; } - if (cd->comment_len) + 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)) { @@ -313,8 +220,10 @@ _zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, /* 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)) { + fseeko(fp, cd->offset, SEEK_SET); + /* possible consistency check: cd->offset = + len-(cd->size+cd->comment_len+EOCDLEN) ? */ + if (ferror(fp) || ((unsigned long)ftello(fp) != cd->offset)) { /* seek error or offset of cdir wrong */ if (ferror(fp)) _zip_error_set(error, ZIP_ER_SEEK, errno); @@ -376,7 +285,7 @@ _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) return -1; } - if (fseek(fp, cd->entry[i].offset, SEEK_SET) != 0) { + if (fseeko(fp, cd->entry[i].offset, SEEK_SET) != 0) { _zip_error_set(error, ZIP_ER_SEEK, 0); return -1; } @@ -385,7 +294,7 @@ _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) return -1; if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); + _zip_error_set(error, ZIP_ER_INCONS, 0); _zip_dirent_finalize(&temp); return -1; } @@ -397,6 +306,41 @@ _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) +/* _zip_check_torrentzip: + check wether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ + +static void +_zip_check_torrentzip(struct zip *za) +{ + uLong crc_got, crc_should; + char buf[8+1]; + char *end; + + if (za->zp == NULL || za->cdir == NULL) + return; + + if (za->cdir->comment_len != TORRENT_SIG_LEN+8 + || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0) + return; + + memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8); + buf[8] = '\0'; + errno = 0; + crc_should = strtoul(buf, &end, 16); + if ((crc_should == UINT_MAX && errno != 0) || (end && *end)) + return; + + if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size, + &crc_got, NULL) < 0) + return; + + if (crc_got == crc_should) + za->flags |= ZIP_AFL_TORRENT; +} + + + + /* _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 @@ -414,14 +358,32 @@ _zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, #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; + /* check that CRC and sizes are zero if data descriptor is used */ + if ((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local1p + && (h1->crc != 0 + || h1->comp_size != 0 + || h1->uncomp_size != 0)) + return -1; + if ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local2p + && (h2->crc != 0 + || h2->comp_size != 0 + || h2->uncomp_size != 0)) + return -1; + + /* check that CRC and sizes are equal if no data descriptor is used */ + if (((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local1p == 0) + && ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local2p == 0)) { + if ((h1->crc != h2->crc) + || (h1->comp_size != h2->comp_size) + || (h1->uncomp_size != h2->uncomp_size)) + return -1; + } + if ((local1p == local2p) && ((h1->extrafield_len != h2->extrafield_len) || (h1->extrafield_len && h2->extrafield @@ -448,6 +410,137 @@ _zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, +static struct zip * +_zip_allocate_new(const char *fn, int *zep) +{ + struct zip *za; + struct zip_error error; + + 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; +} + + + +static int +_zip_file_exists(const char *fn, int flags, int *zep) +{ + struct stat st; + + if (fn == NULL) { + set_error(zep, NULL, ZIP_ER_INVAL); + return -1; + } + + if (stat(fn, &st) != 0) { + if (flags & ZIP_CREATE || flags & ZIP_OVERWRITE) + return 0; + else { + set_error(zep, NULL, ZIP_ER_OPEN); + return -1; + } + } + else if ((flags & ZIP_EXCL)) { + set_error(zep, NULL, ZIP_ER_EXISTS); + return -1; + } + /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL, + just like open() */ + + return 1; +} + + + +static struct zip_cdir * +_zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) +{ + struct zip_cdir *cdir, *cdirnew; + unsigned char *buf, *match; + int a, best, buflen, i; + struct zip_error zerr; + + i = fseeko(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); + return NULL; + } + + /* 64k is too much for stack */ + if ((buf=(unsigned char *)malloc(CDBUFSIZE)) == NULL) { + set_error(zep, NULL, ZIP_ER_MEMORY); + return NULL; + } + + clearerr(fp); + buflen = fread(buf, 1, CDBUFSIZE, fp); + + if (ferror(fp)) { + set_error(zep, NULL, ZIP_ER_READ); + free(buf); + return NULL; + } + + best = -1; + cdir = NULL; + match = buf; + _zip_error_set(&zerr, ZIP_ER_NOZIP, 0); + + 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, + &zerr)) == NULL) + continue; + + if (cdir) { + if (best <= 0) + best = _zip_checkcons(fp, cdir, &zerr); + a = _zip_checkcons(fp, cdirnew, &zerr); + 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, &zerr); + else + best = 0; + } + cdirnew = NULL; + } + + free(buf); + + if (best < 0) { + set_error(zep, &zerr, 0); + _zip_cdir_free(cdir); + return NULL; + } + + return cdir; +} + + + static unsigned char * _zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, int littlelen) diff --git a/ext/zip/lib/zip_rename.c b/ext/zip/lib/zip_rename.c index 8141dc46a..e40ab2767 100644 --- a/ext/zip/lib/zip_rename.c +++ b/ext/zip/lib/zip_rename.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,15 +33,30 @@ -#include "zip.h" +#include <string.h> + #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_rename(struct zip *za, int idx, const char *name) { - if (idx >= za->nentry || idx < 0) { + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || idx < 0 || name[0] == '\0') { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((old_name=zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name[strlen(name)-1] == '/'); + old_is_dir = (old_name[strlen(old_name)-1] == '/'); + + if (new_is_dir != old_is_dir) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } diff --git a/ext/zip/lib/zip_replace.c b/ext/zip/lib/zip_replace.c index 12db005f2..ae69a86f6 100644 --- a/ext/zip/lib/zip_replace.c +++ b/ext/zip/lib/zip_replace.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_replace(struct zip *za, int idx, struct zip_source *source) { if (idx < 0 || idx >= za->nentry || source == NULL) { @@ -57,23 +54,22 @@ zip_replace(struct zip *za, int idx, struct zip_source *source) -PHPZIPAPI int +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; - } + 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; - - + return -1; + za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry) ? ZIP_ST_ADDED : ZIP_ST_REPLACED); za->entry[idx].source = source; diff --git a/ext/zip/lib/zip_set_archive_comment.c b/ext/zip/lib/zip_set_archive_comment.c index 7649a80de..c4bd070dd 100644 --- a/ext/zip/lib/zip_set_archive_comment.c +++ b/ext/zip/lib/zip_set_archive_comment.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 2006-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_set_archive_comment(struct zip *za, const char *comment, int len) { char *tmpcom; @@ -60,7 +57,7 @@ zip_set_archive_comment(struct zip *za, const char *comment, int len) else tmpcom = NULL; - if (za->ch_comment) free(za->ch_comment); + free(za->ch_comment); za->ch_comment = tmpcom; za->ch_comment_len = len; diff --git a/ext/zip/lib/zip_set_archive_flag.c b/ext/zip/lib/zip_set_archive_flag.c new file mode 100644 index 000000000..a6fdd8d2d --- /dev/null +++ b/ext/zip/lib/zip_set_archive_flag.c @@ -0,0 +1,49 @@ +/* + zip_get_archive_flag.c -- set archive global flag + Copyright (C) 2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at <libzip@nih.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 "zipint.h" + + + +ZIP_EXTERN(int) +zip_set_archive_flag(struct zip *za, int flag, int value) +{ + if (value) + za->ch_flags |= flag; + else + za->ch_flags &= ~flag; + + return 0; +} diff --git a/ext/zip/lib/zip_set_file_comment.c b/ext/zip/lib/zip_set_file_comment.c index 5454aa21d..3d5dd6b5e 100644 --- a/ext/zip/lib/zip_set_file_comment.c +++ b/ext/zip/lib/zip_set_file_comment.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 2006-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_set_file_comment(struct zip *za, int idx, const char *comment, int len) { char *tmpcom; diff --git a/ext/zip/lib/zip_set_name.c b/ext/zip/lib/zip_set_name.c index 8a401faac..5c7da3d7c 100644 --- a/ext/zip/lib/zip_set_name.c +++ b/ext/zip/lib/zip_set_name.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,12 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" + #include "zipint.h" -PHPZIPAPI int +int _zip_set_name(struct zip *za, int idx, const char *name) { char *s; diff --git a/ext/zip/lib/zip_source_buffer.c b/ext/zip/lib/zip_source_buffer.c index 95875b74c..867d3dfa3 100644 --- a/ext/zip/lib/zip_source_buffer.c +++ b/ext/zip/lib/zip_source_buffer.c @@ -1,11 +1,9 @@ /* - $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-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -38,7 +36,6 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" struct read_data { @@ -52,7 +49,7 @@ static ssize_t read_data(void *state, void *data, size_t len, -PHPZIPAPI struct zip_source * +ZIP_EXTERN(struct zip_source *) zip_source_buffer(struct zip *za, const void *data, off_t len, int freep) { struct read_data *f; @@ -84,6 +81,8 @@ zip_source_buffer(struct zip *za, const void *data, off_t len, int freep) return zs; } + + static ssize_t read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd) { @@ -103,8 +102,6 @@ read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd) n = z->end - z->buf; if (n > len) n = len; - if (n < 0) - n = 0; if (n) { memcpy(buf, z->buf, n); diff --git a/ext/zip/lib/zip_source_file.c b/ext/zip/lib/zip_source_file.c index 486e1900d..ab6466dcb 100644 --- a/ext/zip/lib/zip_source_file.c +++ b/ext/zip/lib/zip_source_file.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -38,17 +36,13 @@ #include <errno.h> #include <stdio.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI struct zip_source * +ZIP_EXTERN(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; @@ -57,19 +51,5 @@ zip_source_file(struct zip *za, const char *fname, off_t start, off_t len) return NULL; } - if ((fp=fopen(fname, "rb")) == NULL) { - _zip_error_set(&za->error, ZIP_ER_OPEN, errno); - return NULL; - } - -#ifdef PHP_WIN32 - _setmode(_fileno(fp), _O_BINARY ); -#endif - - if ((zs=zip_source_filep(za, fp, start, len)) == NULL) { - fclose(fp); - return NULL; - } - - return zs; + return _zip_source_file_or_p(za, fname, NULL, start, len); } diff --git a/ext/zip/lib/zip_source_filep.c b/ext/zip/lib/zip_source_filep.c index 8a3304265..2a06a9f02 100644 --- a/ext/zip/lib/zip_source_filep.c +++ b/ext/zip/lib/zip_source_filep.c @@ -1,11 +1,9 @@ /* - $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-2008 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -41,10 +39,10 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" struct read_file { + char *fname; /* name of file to copy from */ FILE *f; /* file to copy from */ off_t off; /* start offset of */ off_t len; /* lengt of data to copy */ @@ -57,12 +55,9 @@ static ssize_t read_file(void *state, void *data, size_t len, -PHPZIPAPI struct zip_source * +ZIP_EXTERN(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; @@ -71,11 +66,36 @@ zip_source_filep(struct zip *za, FILE *file, off_t start, off_t len) return NULL; } + return _zip_source_file_or_p(za, NULL, file, start, len); +} + + + +struct zip_source * +_zip_source_file_or_p(struct zip *za, const char *fname, FILE *file, + off_t start, off_t len) +{ + struct read_file *f; + struct zip_source *zs; + + if (file == NULL && fname == NULL) { + _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->fname = NULL; + if (fname) { + if ((f->fname=strdup(fname)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + free(f); + return NULL; + } + } f->f = file; f->off = start; f->len = (len ? len : -1); @@ -102,6 +122,14 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) switch (cmd) { case ZIP_SOURCE_OPEN: + if (z->fname) { + if ((z->f=fopen(z->fname, "rb")) == NULL) { + z->e[0] = ZIP_ER_OPEN; + z->e[1] = errno; + return -1; + } + } + if (fseeko(z->f, z->off, SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; @@ -128,17 +156,27 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) return i; case ZIP_SOURCE_CLOSE: + if (z->fname) { + fclose(z->f); + z->f = NULL; + } return 0; case ZIP_SOURCE_STAT: { struct zip_stat *st; struct stat fst; + int err; if (len < sizeof(*st)) return -1; - if (fstat(fileno(z->f), &fst) != 0) { + if (z->f) + err = fstat(fileno(z->f), &fst); + else + err = stat(z->fname, &fst); + + if (err != 0) { z->e[0] = ZIP_ER_READ; /* best match */ z->e[1] = errno; return -1; @@ -164,6 +202,8 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) return sizeof(int)*2; case ZIP_SOURCE_FREE: + free(z->fname); + if (z->f) fclose(z->f); free(z); return 0; diff --git a/ext/zip/lib/zip_source_free.c b/ext/zip/lib/zip_source_free.c index 707309c91..293e7f7e1 100644 --- a/ext/zip/lib/zip_source_free.c +++ b/ext/zip/lib/zip_source_free.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI void +ZIP_EXTERN(void) zip_source_free(struct zip_source *source) { if (source == NULL) diff --git a/ext/zip/lib/zip_source_function.c b/ext/zip/lib/zip_source_function.c index 4ab110924..fe3e82aa5 100644 --- a/ext/zip/lib/zip_source_function.c +++ b/ext/zip/lib/zip_source_function.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,12 +35,11 @@ #include <stdlib.h> -#include "zip.h" #include "zipint.h" -PHPZIPAPI struct zip_source * +ZIP_EXTERN(struct zip_source *) zip_source_function(struct zip *za, zip_source_callback zcb, void *ud) { struct zip_source *zs; diff --git a/ext/zip/lib/zip_source_zip.c b/ext/zip/lib/zip_source_zip.c index 75e656402..58119dd39 100644 --- a/ext/zip/lib/zip_source_zip.c +++ b/ext/zip/lib/zip_source_zip.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -38,7 +36,6 @@ #include <stdlib.h> #include <string.h> -#include "zip.h" #include "zipint.h" struct read_zip { @@ -52,7 +49,7 @@ static ssize_t read_zip(void *st, void *data, size_t len, -PHPZIPAPI struct zip_source * +ZIP_EXTERN(struct zip_source *) zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, off_t start, off_t len) { @@ -60,6 +57,8 @@ zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, struct zip_source *zs; struct read_zip *p; + /* XXX: ZIP_FL_RECOMPRESS */ + if (za == NULL) return NULL; @@ -77,7 +76,7 @@ zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, if (len == 0) len = -1; - if (start == 0 && len == -1) + if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0) flags |= ZIP_FL_COMPRESSED; else flags &= ~ZIP_FL_COMPRESSED; diff --git a/ext/zip/lib/zip_stat.c b/ext/zip/lib/zip_stat.c index 7c6cbf00d..c8a25e1d8 100644 --- a/ext/zip/lib/zip_stat.c +++ b/ext/zip/lib/zip_stat.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st) { int idx; diff --git a/ext/zip/lib/zip_stat_index.c b/ext/zip/lib/zip_stat_index.c index cf55565ef..26425206c 100644 --- a/ext/zip/lib/zip_stat_index.c +++ b/ext/zip/lib/zip_stat_index.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,11 @@ -#include "zip.h" #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st) { const char *name; @@ -67,7 +64,7 @@ zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st) _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - + st->crc = za->cdir->entry[index].crc; st->size = za->cdir->entry[index].uncomp_size; st->mtime = za->cdir->entry[index].last_mod; diff --git a/ext/zip/lib/zip_stat_init.c b/ext/zip/lib/zip_stat_init.c index e9c056dfc..cb451dc3b 100644 --- a/ext/zip/lib/zip_stat_init.c +++ b/ext/zip/lib/zip_stat_init.c @@ -1,11 +1,9 @@ /* - $NiH: zip_stat_init.c,v 1.1 2006/10/31 12:03:04 dillo Exp $ - zip_stat_init.c -- initialize struct zip_stat. - Copyright (C) 2006 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,7 +37,7 @@ -PHPZIPAPI void +ZIP_EXTERN(void) zip_stat_init(struct zip_stat *st) { st->name = NULL; diff --git a/ext/zip/lib/zip_strerror.c b/ext/zip/lib/zip_strerror.c index f3e5aa9fe..ad23bafed 100644 --- a/ext/zip/lib/zip_strerror.c +++ b/ext/zip/lib/zip_strerror.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -35,12 +33,10 @@ -#include "zip.h" #include "zipint.h" - -PHPZIPAPI const char * +ZIP_EXTERN(const char *) zip_strerror(struct zip *za) { return _zip_error_strerror(&za->error); diff --git a/ext/zip/lib/zip_unchange.c b/ext/zip/lib/zip_unchange.c index 80070e7a3..7366c9cc7 100644 --- a/ext/zip/lib/zip_unchange.c +++ b/ext/zip/lib/zip_unchange.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,12 +34,12 @@ #include <stdlib.h> -#include "zip.h" + #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_unchange(struct zip *za, int idx) { return _zip_unchange(za, idx, 0); @@ -49,7 +47,7 @@ zip_unchange(struct zip *za, int idx) -PHPZIPAPI int +int _zip_unchange(struct zip *za, int idx, int allow_duplicates) { int i; diff --git a/ext/zip/lib/zip_unchange_all.c b/ext/zip/lib/zip_unchange_all.c index 2d4459c82..01282f89d 100644 --- a/ext/zip/lib/zip_unchange_all.c +++ b/ext/zip/lib/zip_unchange_all.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 1999-2007 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,12 +34,12 @@ #include <stdlib.h> -#include "zip.h" + #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_unchange_all(struct zip *za) { int ret, i; @@ -49,7 +47,7 @@ zip_unchange_all(struct zip *za) ret = 0; for (i=0; i<za->nentry; i++) ret |= _zip_unchange(za, i, 1); - + ret |= zip_unchange_archive(za); return ret; diff --git a/ext/zip/lib/zip_unchange_archive.c b/ext/zip/lib/zip_unchange_archive.c index 6c2bc6dcb..fe30a5ad2 100644 --- a/ext/zip/lib/zip_unchange_archive.c +++ b/ext/zip/lib/zip_unchange_archive.c @@ -1,11 +1,9 @@ /* - $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 + Copyright (C) 2006-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,17 +34,19 @@ #include <stdlib.h> -#include "zip.h" + #include "zipint.h" -PHPZIPAPI int +ZIP_EXTERN(int) zip_unchange_archive(struct zip *za) { free(za->ch_comment); za->ch_comment = NULL; za->ch_comment_len = -1; + za->ch_flags = za->flags; + return 0; } diff --git a/ext/zip/lib/zip_unchange_data.c b/ext/zip/lib/zip_unchange_data.c index dfa2ea545..6fe89f4fb 100644 --- a/ext/zip/lib/zip_unchange_data.c +++ b/ext/zip/lib/zip_unchange_data.c @@ -1,11 +1,11 @@ /* - $NiH: zip_unchange_data.c,v 1.15 2004/12/22 16:32:00 dillo Exp $ + $NiH: zip_unchange_data.c,v 1.14 2004/11/30 23:02:47 wiz 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,7 +39,7 @@ #include "zipint.h" -PHPZIPAPI void +void _zip_unchange_data(struct zip_entry *ze) { if (ze->source) { diff --git a/ext/zip/lib/zip_win32.h b/ext/zip/lib/zip_win32.h index ea3860d60..ff28d2878 100644 --- a/ext/zip/lib/zip_win32.h +++ b/ext/zip/lib/zip_win32.h @@ -2,16 +2,25 @@ #include <windows.h> #include <io.h> #include <fcntl.h> +#include <string.h> +#include <zconf.h> + +#ifndef strcasecmp +# define strcmpi _strcmpi +#endif #ifndef ssize_t # define ssize_t SSIZE_T #endif + #ifndef mode_t # define mode_t int #endif + #ifndef snprintf # define snprintf _snprintf #endif + #ifndef mkstemp # define mkstemp(t) _creat(_mktemp(t), _S_IREAD|_S_IWRITE) #endif diff --git a/ext/zip/lib/zipint.h b/ext/zip/lib/zipint.h index 33632aca4..e7e35e4dd 100644 --- a/ext/zip/lib/zipint.h +++ b/ext/zip/lib/zipint.h @@ -2,13 +2,11 @@ #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 + Copyright (C) 1999-2009 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> + The authors can be contacted at <libzip@nih.at> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -22,7 +20,7 @@ 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 @@ -39,20 +37,41 @@ #include <zlib.h> #include "zip.h" -/* #defines that rename all zip_ functions and structs */ -#include "zipint_alias.h" -BEGIN_EXTERN_C() +#ifdef PHP_WIN32 +#include <windows.h> +#include <wchar.h> +#define _zip_rename(s, t) \ + (!MoveFileExA((s), (t), \ + MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) +#else +#define _zip_rename rename +#endif + +#ifndef strcasecmp +# define strcmpi strcasecmp +#endif + #ifndef HAVE_FSEEKO #define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) #endif +#ifndef HAVE_FTELLO +#define ftello(s) ((long)ftell((s))) +#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 TORRENT_SIG "TORRENTZIPPED-" +#define TORRENT_SIG_LEN 14 +#define TORRENT_CRC_LEN 8 +#define TORRENT_MEM_LEVEL 8 #define CDENTRYSIZE 46u #define LENTRYSIZE 30 +#undef MAXCOMLEN /* defined as 19 on BSD for max command name */ #define MAXCOMLEN 65536 #define EOCDLEN 22 #define CDBUFSIZE (MAXCOMLEN+EOCDLEN) @@ -74,8 +93,8 @@ enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED, /* directory entry: general purpose bit flags */ #define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */ +#define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */ #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 */ @@ -92,6 +111,9 @@ struct zip { FILE *zp; /* file */ struct zip_error error; /* error information */ + unsigned int flags; /* archive global flags */ + unsigned int ch_flags; /* changed archive global flags */ + struct zip_cdir *cdir; /* central directory */ char *ch_comment; /* changed archive comment */ int ch_comment_len; /* length of changed zip archive @@ -112,13 +134,13 @@ struct zip_file { int flags; /* -1: eof, >0: error */ int method; /* compression method */ - long fpos; /* position within zip file (fread/fwrite) */ + off_t 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; }; @@ -189,43 +211,49 @@ extern const int _zip_err_type[]; -PHPZIPAPI void _zip_cdir_free(struct zip_cdir *); -PHPZIPAPI struct zip_cdir *_zip_cdir_new(int, struct zip_error *); -PHPZIPAPI int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); +int _zip_cdir_compute_crc(struct zip *, uLong *); +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 *); -PHPZIPAPI void _zip_dirent_finalize(struct zip_dirent *); -PHPZIPAPI void _zip_dirent_init(struct zip_dirent *); -PHPZIPAPI int _zip_dirent_read(struct zip_dirent *, FILE *, +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 *); -PHPZIPAPI int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); - -PHPZIPAPI void _zip_entry_free(struct zip_entry *); -PHPZIPAPI void _zip_entry_init(struct zip *, int); -PHPZIPAPI struct zip_entry *_zip_entry_new(struct zip *); - -PHPZIPAPI void _zip_error_clear(struct zip_error *); -PHPZIPAPI void _zip_error_copy(struct zip_error *, struct zip_error *); -PHPZIPAPI void _zip_error_fini(struct zip_error *); -PHPZIPAPI void _zip_error_get(struct zip_error *, int *, int *); -PHPZIPAPI void _zip_error_init(struct zip_error *); -PHPZIPAPI void _zip_error_set(struct zip_error *, int, int); -PHPZIPAPI const char *_zip_error_strerror(struct zip_error *); - -PHPZIPAPI int _zip_file_fillbuf(void *, size_t, struct zip_file *); -PHPZIPAPI unsigned int _zip_file_get_offset(struct zip *, int); - -PHPZIPAPI void _zip_free(struct zip *); -PHPZIPAPI const char *_zip_get_name(struct zip *, int, int, struct zip_error *); -PHPZIPAPI int _zip_local_header_read(struct zip *, int); -PHPZIPAPI void *_zip_memdup(const void *, size_t, struct zip_error *); -PHPZIPAPI int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); -PHPZIPAPI struct zip *_zip_new(struct zip_error *); -PHPZIPAPI unsigned short _zip_read2(unsigned char **); -PHPZIPAPI unsigned int _zip_read4(unsigned char **); -PHPZIPAPI int _zip_replace(struct zip *, int, const char *, struct zip_source *); -PHPZIPAPI int _zip_set_name(struct zip *, int, const char *); -PHPZIPAPI int _zip_unchange(struct zip *, int, int); -PHPZIPAPI void _zip_unchange_data(struct zip_entry *); - -END_EXTERN_C(); +void _zip_dirent_torrent_normalize(struct zip_dirent *); +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_clear(struct zip_error *); +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); + +int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *); + +struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *, + off_t, off_t); + +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 */ diff --git a/ext/zip/lib/zipint_alias.h b/ext/zip/lib/zipint_alias.h deleted file mode 100644 index e8541b36e..000000000 --- a/ext/zip/lib/zipint_alias.h +++ /dev/null @@ -1,49 +0,0 @@ - -/* state of change of a file in zip archive */ -#define zip_state php_ziplib__zip_state -#define zip_error php_ziplib__zip_error -#define zip_dirent php_ziplib__zip_dirent -#define zip_cdir php_ziplib__zip_cdir -#define zip_source php_ziplib__zip_source -#define zip_entry php_ziplib__zip_entry - -#define _zip_err_str php_ziplib___zip_err_str -#define _zip_nerr_str php_ziplib___zip_nerr_str -#define _zip_err_type php_ziplib___zip_err_type - -#define _zip_cdir_free php_ziplib___zip_cdir_free -#define _zip_cdir_new php_ziplib___zip_cdir_new -#define _zip_cdir_write php_ziplib___zip_cdir_write - -#define _zip_dirent_finalize php_ziplib___zip_dirent_finalize -#define _zip_dirent_init php_ziplib___zip_dirent_init -#define _zip_dirent_read php_ziplib___zip_dirent_read -#define _zip_dirent_write php_ziplib___zip_dirent_write - -#define _zip_entry_free php_ziplib___zip_entry_free -#define _zip_entry_init php_ziplib___zip_entry_init -#define _zip_entry_new php_ziplib___zip_entry_new - -#define _zip_error_clear php_ziplib___zip_error_clear -#define _zip_error_copy php_ziplib___zip_error_copy -#define _zip_error_fini php_ziplib___zip_error_fini -#define _zip_error_get php_ziplib___zip_error_get -#define _zip_error_init php_ziplib___zip_error_init -#define _zip_error_set php_ziplib___zip_error_set -#define _zip_error_strerror php_ziplib___zip_error_strerror - -#define _zip_file_fillbuf php_ziplib___zip_file_fillbuf -#define _zip_file_get_offset php_ziplib___zip_file_get_offset - -#define _zip_free php_ziplib___zip_free -#define _zip_get_name php_ziplib___zip_get_name -#define _zip_local_header_read php_ziplib___zip_local_header_read -#define _zip_memdup php_ziplib___zip_memdup -#define _zip_name_locate php_ziplib___zip_name_locate -#define _zip_new php_ziplib___zip_new -#define _zip_read2 php_ziplib___zip_read2 -#define _zip_read4 php_ziplib___zip_read4 -#define _zip_replace php_ziplib___zip_replace -#define _zip_set_name php_ziplib___zip_set_name -#define _zip_unchange php_ziplib___zip_unchange -#define _zip_unchange_data php_ziplib___zip_unchange_data |