]> granicus.if.org Git - php/commitdiff
- update to 0.9 (torrentzip support, files open only when necessary), windows fixes
authorPierre Joye <pajoye@php.net>
Thu, 7 Aug 2008 23:23:20 +0000 (23:23 +0000)
committerPierre Joye <pajoye@php.net>
Thu, 7 Aug 2008 23:23:20 +0000 (23:23 +0000)
57 files changed:
ext/zip/config.w32
ext/zip/lib/zip.h
ext/zip/lib/zip_add.c
ext/zip/lib/zip_add_dir.c
ext/zip/lib/zip_close.c
ext/zip/lib/zip_delete.c
ext/zip/lib/zip_dirent.c
ext/zip/lib/zip_entry_free.c
ext/zip/lib/zip_entry_new.c
ext/zip/lib/zip_err_str.c
ext/zip/lib/zip_error.c
ext/zip/lib/zip_error_clear.c
ext/zip/lib/zip_error_get.c
ext/zip/lib/zip_error_get_sys_type.c
ext/zip/lib/zip_error_strerror.c
ext/zip/lib/zip_error_to_str.c
ext/zip/lib/zip_fclose.c
ext/zip/lib/zip_file_error_clear.c
ext/zip/lib/zip_file_error_get.c
ext/zip/lib/zip_file_get_offset.c
ext/zip/lib/zip_file_strerror.c
ext/zip/lib/zip_filerange_crc.c [new file with mode: 0644]
ext/zip/lib/zip_fopen.c
ext/zip/lib/zip_fopen_index.c
ext/zip/lib/zip_fread.c
ext/zip/lib/zip_free.c
ext/zip/lib/zip_get_archive_comment.c
ext/zip/lib/zip_get_archive_flag.c [new file with mode: 0644]
ext/zip/lib/zip_get_file_comment.c
ext/zip/lib/zip_get_name.c
ext/zip/lib/zip_get_num_files.c
ext/zip/lib/zip_memdup.c
ext/zip/lib/zip_name_locate.c
ext/zip/lib/zip_new.c
ext/zip/lib/zip_open.c
ext/zip/lib/zip_rename.c
ext/zip/lib/zip_replace.c
ext/zip/lib/zip_set_archive_comment.c
ext/zip/lib/zip_set_archive_flag.c [new file with mode: 0644]
ext/zip/lib/zip_set_file_comment.c
ext/zip/lib/zip_set_name.c
ext/zip/lib/zip_source_buffer.c
ext/zip/lib/zip_source_file.c
ext/zip/lib/zip_source_filep.c
ext/zip/lib/zip_source_free.c
ext/zip/lib/zip_source_function.c
ext/zip/lib/zip_source_zip.c
ext/zip/lib/zip_stat.c
ext/zip/lib/zip_stat_index.c
ext/zip/lib/zip_stat_init.c
ext/zip/lib/zip_strerror.c
ext/zip/lib/zip_unchange.c
ext/zip/lib/zip_unchange_all.c
ext/zip/lib/zip_unchange_archive.c
ext/zip/lib/zip_unchange_data.c
ext/zip/lib/zip_win32.h
ext/zip/lib/zipint.h

index c207cd301b5ab0d6a4cad7daa4c22a7999824219..38ec71c7130f66852dade46c6849c8e4bac46d1f 100644 (file)
@@ -17,7 +17,8 @@ if (PHP_ZIP != "no") {
                      zip_error_get_sys_type.c zip_file_get_offset.c \
                      zip_get_name.c zip_replace.c zip_source_function.c \
                      zip_unchange.c zip_dirent.c zip_error_strerror.c \
-                     zip_file_strerror.c zip_get_num_files.c \
+                     zip_filerange_crc.c zip_file_strerror.c zip_get_num_files.c \
+                     zip_get_archive_flag.c zip_set_archive_flag.c \
                      zip_set_name.c zip_source_zip.c zip_unchange_data.c \
                      zip_entry_free.c zip_error_to_str.c zip_fopen.c \
                      zip_name_locate.c zip_source_buffer.c zip_stat.c \
@@ -27,7 +28,6 @@ if (PHP_ZIP != "no") {
                      zip_set_archive_comment.c zip_set_file_comment.c \
                      zip_unchange_archive.c zip_memdup.c zip_stat_init.c \
                      zip_add_dir.c zip_file_error_clear.c zip_error_clear.c", "zip");
-
                AC_DEFINE('HAVE_ZIP', 1);
        } else {
                WARNING("zip not enabled; libraries and headers not found");
index 953acfcfd9a1f3a49bf2f3a8660d93ee73a4f52b..ecdb0f2d8e4e48c79ed98ccbe2ff5b4f536fb85d 100644 (file)
@@ -2,13 +2,11 @@
 #define _HAD_ZIP_H
 
 /*
-  $NiH: zip.h,v 1.57 2007/04/24 14:04:19 dillo Exp $
-
   zip.h -- exported declarations.
   Copyright (C) 1999-2008 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
 
 \f
 #include "main/php.h"
-/* #defines that rename all zip_ functions and structs */
-#include "zip_alias.h"
+
 #ifdef PHP_WIN32
 #      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 PHPZIPAPI __attribute__ ((visibility("default")))
+#      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
@@ -72,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 */
 
@@ -123,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 */
 
@@ -172,46 +182,51 @@ struct zip_source;
 
 \f
 
-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_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(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 *);
+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 */
index 70d1162f7fd23bc186696e1fddd6f0d22eca2522..85d5997911b9420557dbb28cda3362ce99e7a1b7 100644 (file)
@@ -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
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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);
 }
index 0ddf6e8923f990a1d8986374751fa97055513044..9b23425194298bac1da4369f46d517829091a4e3 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_add_dir.c,v 1.1 2007/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
 #include <stdlib.h>
 #include <string.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_add_dir(struct zip *za, const char *name)
 {
     int len, ret;
index 00d2ae3e4c4306a82bc4f1530dfbe9d31a80de6b..7c2f875012aef31a87250a9f2b3e286ecff8095d 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_close.c,v 1.60 2007/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-2008 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
   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
+
+\f
+
 #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 *);
+
+\f
 
-PHPZIPAPI int
+struct filelist {
+    int idx;
+    const char *name;
+};
+
+\f
+
+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,12 +195,12 @@ 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;
     }
 
@@ -220,49 +286,43 @@ zip_close(struct zip *za)
        return -1;
     }
 
-   if (za->zp) {
+    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) {
-               _zip_error_set(&za->error, ZIP_ER_RENAME, errno);
-               remove(temp);
-               free(temp);
-               return -1;
+    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);
+    free(temp);
+
     return 0;
 }
 
 \f
 
 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,
 \f
 
 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;
            }
 
@@ -472,6 +542,44 @@ copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error)
 
 \f
 
+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;
+}
+
+\f
+
 static int
 _zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src)
 {
@@ -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++) {
@@ -528,14 +637,12 @@ _zip_create_temp_output(struct zip *za, FILE **outp)
     int tfd;
     FILE *tfp;
 
-    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);
+    sprintf(temp, "%s.XXXXXX", za->zn);
 
     if ((tfd=mkstemp(temp)) == -1) {
        _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno);
@@ -550,10 +657,16 @@ _zip_create_temp_output(struct zip *za, FILE **outp)
        free(temp);
        return NULL;
     }
-#ifdef PHP_WIN32
-       _setmode(_fileno(tfp), _O_BINARY );
-#endif
 
     *outp = tfp;
     return temp;
 }
+
+\f
+
+static int
+_zip_torrentzip_cmp(const void *a, const void *b)
+{
+    return strcasecmp(((const struct filelist *)a)->name,
+                     ((const struct filelist *)b)->name);
+}
index eb5055b687d5e34b2c634c22b39d5bb71ebf8dbb..4591ff7f86a0fea58328db361c46fba840f7b64a 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_delete(struct zip *za, int idx)
 {
     if (idx < 0 || idx >= za->nentry) {
index bc8e4100e7b6cc6b3110209a7dcbe7cb07312886..1b2db34dec0c039a267e0cfcebbd301fcfc73cb2 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_dirent.c,v 1.9 2007/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-2008 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
   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+\f
+
 #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"
-#include "main/php_reentrancy.h"
 
 static time_t _zip_d2u_time(int, int);
 static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *);
@@ -56,7 +51,7 @@ static void _zip_write4(unsigned int, FILE *);
 
 \f
 
-PHPZIPAPI void
+void
 _zip_cdir_free(struct zip_cdir *cd)
 {
     int i;
@@ -73,7 +68,7 @@ _zip_cdir_free(struct zip_cdir *cd)
 
 \f
 
-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)
 
 \f
 
-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)
 
 \f
 
-PHPZIPAPI void
+void
 _zip_dirent_finalize(struct zip_dirent *zde)
 {
     free(zde->filename);
@@ -149,7 +144,7 @@ _zip_dirent_finalize(struct zip_dirent *zde)
 
 \f
 
-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,
 
 \f
 
+/* _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;
+}
+
+\f
+
 /* _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)
 
 \f
 
-PHPZIPAPI unsigned short
+unsigned short
 _zip_read2(unsigned char **a)
 {
     unsigned short ret;
@@ -422,7 +476,7 @@ _zip_read2(unsigned char **a)
 
 \f
 
-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)
index 16a230db56a858dd3f41dcad7c587c9f1829d27d..c50c9434bdd93a138f02bf6bf917bc68fdda64ae 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_entry_free.c,v 1.2 2007/04/09 19:05:47 wiz Exp $
-
   zip_entry_free.c -- free struct zip_entry
-  Copyright (C) 1999, 2003, 2004, 2007 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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void
+void
 _zip_entry_free(struct zip_entry *ze)
 {
     free(ze->ch_filename);
index 1b2a20e3ade0e7b908ec3fa490e914c46388b588..7059b1b060749d93cacfb7f499b1b072a25eee54 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_entry_new.c,v 1.2 2007/04/09 19:05:47 wiz Exp $
-
   zip_entry_new.c -- create and init struct zip_entry
-  Copyright (C) 1999, 2003, 2004, 2007 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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI struct zip_entry *
+struct zip_entry *
 _zip_entry_new(struct zip *za)
 {
     struct zip_entry *ze;
index 0c613eeb4d72e87bd7d8bf8d7101f9197c0f6ceb..3fcdf1738a8636ab01859dc9f4f00ea53a6d3a67 100644 (file)
@@ -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 2007/04/24 14:04:19 dillo Exp
  */
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
index 4816b73aea08825589acb99d9a345e36326497dd..aab70794566c0d2e248e88dada5c08827e70bcc4 100644 (file)
@@ -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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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)
 
 \f
 
-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)
 
 \f
 
-PHPZIPAPI void
+void
 _zip_error_fini(struct zip_error *err)
 {
     free(err->str);
@@ -69,7 +66,7 @@ _zip_error_fini(struct zip_error *err)
 
 \f
 
-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)
 
 \f
 
-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)
 
 \f
 
-PHPZIPAPI void
+void
 _zip_error_set(struct zip_error *err, int ze, int se)
 {
     if (err) {
index 32eb9f17c839b3f11210e872f864efcf0261c528..34e7dea48ebbaaa0719c8d7e6a07ad19f9bf09e3 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_error_clear.c,v 1.1 2007/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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void
+ZIP_EXTERN(void)
 zip_error_clear(struct zip *za)
 {
     _zip_error_clear(&za->error);
index 888b5456935234ce923161594bb94b153f6350fe..c15705e32fccdd75ec6e7fa1a4894c87f0505f6c 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void
+ZIP_EXTERN(void)
 zip_error_get(struct zip *za, int *zep, int *sep)
 {
     _zip_error_get(&za->error, zep, sep);
index bfe6423836639e763ec85d7e2d14423cdca5a012..47aa93e69b927c44f416c2a6d8fb918914c4fe8c 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_error_get_sys_type(int ze)
 {
     if (ze < 0 || ze >= _zip_nerr_str)
index 85f394536850c4ae7e170aa5f89d712ce2ad5f6e..3d0951cfb1f6b8697ac0e4db626787e62e2dfcfe 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_error_strerror.c,v 1.4 2007/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
 #include <stdlib.h>
 #include <string.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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;
     }
 }
index 665803472e3a9cf729655329defd7156d6851ebd..4dea4d667a5ee28976564edd130fa9894e3339c7 100644 (file)
@@ -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
 #include <stdlib.h>
 #include <string.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_error_to_str(char *buf, size_t len, int ze, int se)
 {
     const char *zs, *ss;
index 91f30b7bb9bf8363dba2c5da9f3427f2f1e90286..6bf697301ae827709321948bb296c91f0aa4b427 100644 (file)
@@ -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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_fclose(struct zip_file *zf)
 {
     int i, ret;
@@ -51,15 +48,14 @@ 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) {
-                               zf->za->file[i] = zf->za->file[zf->za->nfile-1];
-                               zf->za->nfile--;
-                               break;
-                       }
-               }
+    for (i=0; i<zf->za->nfile; i++) {
+       if (zf->za->file[i] == zf) {
+           zf->za->file[i] = zf->za->file[zf->za->nfile-1];
+           zf->za->nfile--;
+           break;
+       }
+    }
        }
 
     ret = 0;
index e6bbefe48a5d9c5c1cfb766304825be487dda577..6c9c2a02b3f0f54528efe829624c654cf0f7b7fd 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_file_error_clear.c,v 1.4 2007/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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void
+ZIP_EXTERN(void)
 zip_file_error_clear(struct zip_file *zf)
 {
     _zip_error_clear(&zf->error);
index 05516703c689b4da57d13f0763dbde6de67aef6f..a53fa7e0033243c236fea130160980d8e28739ad 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void
+ZIP_EXTERN(void)
 zip_file_error_get(struct zip_file *zf, int *zep, int *sep)
 {
     _zip_error_get(&zf->error, zep, sep);
index d2e44f8ddc36d9191b6ec45da5e6963e7bac2a72..68f92f1fe61b70489361a088f275b866e280b6a9 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_file_get_offset.c,v 1.4 2007/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
 #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"
 
 \f
@@ -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;
     }
index 2cc79c13338369aa1cfec37e55e160875ac30f4e..c2864f2ba1aafeb42bb2816e2e3ae17ae016dfeb 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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 (file)
index 0000000..4d1ad56
--- /dev/null
@@ -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.
+*/
+
+\f
+
+#include <stdio.h>
+#include <errno.h>
+
+#include "zipint.h"
+
+
+\f
+
+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;
+}
index c05ad45bd67921ba1db9ecff6957c8d948e82d5b..b4b76049f4430e625d456537d349ba14b9880d18 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI struct zip_file *
+ZIP_EXTERN(struct zip_file *)
 zip_fopen(struct zip *za, const char *fname, int flags)
 {
     int idx;
index 105cefe738bb3950ba881e36f5382c311be6d8a9..1e7e4198970aa073fe662f711d24329abad4f8d6 100644 (file)
@@ -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
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 static struct zip_file *_zip_file_new(struct zip *za);
 
 \f
 
-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)
 
 \f
 
-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;
     }
index fd27f330ac3a7727f15fac37b07278e4c0f4b366..1c0c8ac631c55579d314d25483602bb2c0c70b40 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_fread.c,v 1.21 2007/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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI ssize_t
+ZIP_EXTERN(ssize_t)
 zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
 {
     int ret;
-       size_t out_before, len;
+    size_t out_before, len;
     int i;
 
     if (!zf)
index 534c58eb07a3836ba17ed50a575e0b68689ede69..76c3a9673ff539433d4515d40cbecebfd4521dc7 100644 (file)
@@ -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 @@
 \f
 
 #include <stdlib.h>
-#include "zip.h"
+
 #include "zipint.h"
 
 \f
@@ -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) {
index ea30d8395ed80d99b38b5a1dcabe42d96322ad9d..fe97e6e8c18a1fd8dc6945ee3b58e91c4ed33be9 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_get_archive_comment.c,v 1.4 2007/04/23 16:11:33 wiz Exp $
-
   zip_get_archive_comment.c -- get archive comment
-  Copyright (C) 2007 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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI const char *
+ZIP_EXTERN(const char *)
 zip_get_archive_comment(struct zip *za, int *lenp, int flags)
 {
     if ((flags & ZIP_FL_UNCHANGED)
        || (za->ch_comment_len == -1)) {
-               if (za->cdir) {
-                       if (lenp != NULL)
-                               *lenp = za->cdir->comment_len;
-                       return za->cdir->comment;
-               }
+       if (za->cdir) {
+           if (lenp != NULL)
+               *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 (file)
index 0000000..2d46aa3
--- /dev/null
@@ -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.
+*/
+
+\f
+
+#include "zipint.h"
+
+\f
+
+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;
+}
index 35ed9b99f4bf9f5d2090ab6352ccca7305d4cfc3..57dd9028bc1387b7a5f8fa616382aa79b183454a 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_get_file_comment.c,v 1.2 2007/04/23 13:06:28 wiz Exp $
-
   zip_get_file_comment.c -- get file comment
-  Copyright (C) 2007 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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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) {
index c2cae2518eeaba737191bfa6b614c9772a9f1efe..b58d972058897e4f9c218f2d8043f33ce61d8a58 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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)
 
 \f
 
-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) {
index 05a54fcb6c4eaab2eb744ba3ea67f0005cf27a80..a442f293ec350a18a512c75d62c4815bd92f6799 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_get_num_files(struct zip *za)
 {
     if (za == NULL)
index c4c4566109889a66b745655d2d93173c8c93f68b..641125ed2d1b21488e825e22743d25d2c8101294 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_memdup.c,v 1.2 2007/04/24 10:34:39 dillo Exp $
-
   zip_memdup.c -- internal zip function, "strdup" with len
-  Copyright (C) 1999, 2003, 2004, 2005, 2007 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
 #include <stdlib.h>
 #include <string.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void *
+void *
 _zip_memdup(const void *mem, size_t len, struct zip_error *error)
 {
     void *ret;
index 108db4f60913608cb35289346cb0a0ed2c405239..e8b35ff936ecd04a85eb7da86e8e27613d468c12 100644 (file)
@@ -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
 
 #include <string.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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)
 
 \f
 
-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;
 }
index d8cb3aba3159721fb39c3daf75a42639fc6baf85..3e8ccee644bc2e091a3d0c89a204abf95c7f4723 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_new.c,v 1.12 2007/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 @@
 \f
 
 #include <stdlib.h>
-#include "zip.h"
+
 #include "zipint.h"
 
 \f
@@ -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;
 }
index deb38009985715ab1d3804c1f2b07c14ad3dbb2a..cb3e66d2ca27feb9117d8fc53dfd492ec759a32b 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_open.c,v 1.38 2007/05/04 00:01:26 dillo Exp $
-
   zip_open.c -- open zip archive
   Copyright (C) 1999-2008 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
 
 #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,55 @@ static struct zip_cdir *_zip_readcdir(FILE *, unsigned char *, unsigned char *,
 
 \f
 
-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:
        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 +116,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 +198,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 +217,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 +282,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 +291,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;
        }
@@ -395,6 +301,41 @@ _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error)
     return max - min;
 }
 
+\f
+
+/* _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;
+}
+
+
 \f
 
 /* _zip_headercomp:
@@ -414,14 +355,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 +407,137 @@ _zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2,
 
 \f
 
+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;
+}
+
+\f
+
+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)
+           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;
+}
+
+\f
+
+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;
+}
+
+\f
+
 static unsigned char *
 _zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, 
        int littlelen)
index 8141dc46a6f332e9d64fb1475c403490ce27feae..e57e50c3908700e25f4a31c60751b2c6445e873c 100644 (file)
@@ -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-2008 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
 
 \f
 
-#include "zip.h"
+#include <string.h>
+
 #include "zipint.h"
 
 \f
 
-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;
     }
index 20260d19893fdd5fd54e27fe3856bebe300d863e..ae69a86f632f1441b83f44e5c435e68090c0a74b 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_replace.c,v 1.20 2007/04/09 14:52:02 wiz Exp $
-
   zip_replace.c -- replace file via callback function
-  Copyright (C) 1999, 2003, 2004, 2007 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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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)
 
 \f
 
-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;
index ecfe25d4b65c51365169d8624e3595712334cd37..c4bd070ddcde340078a93a2caaf4423506672750 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_set_archive_comment.c,v 1.3 2007/04/24 10:34:39 dillo Exp $
-
   zip_set_archive_comment.c -- set archive comment
-  Copyright (C) 2007 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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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 (file)
index 0000000..a6fdd8d
--- /dev/null
@@ -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.
+*/
+
+\f
+
+#include "zipint.h"
+
+\f
+
+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;
+}
index 5b78401ea6ca3bba92ab374e0f9e4c151b303ea5..3d5dd6b5e3e68b82380c7e7a12656e7003699d32 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_set_file_comment.c,v 1.4 2007/04/24 10:34:39 dillo Exp $
-
   zip_set_file_comment.c -- set comment for file in archive
-  Copyright (C) 2007 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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_set_file_comment(struct zip *za, int idx, const char *comment, int len)
 {
     char *tmpcom;
index 8a401faacae5b8ce6977d1661f46aafae9c13b3b..5c7da3d7c51ff10d37517bbf47f4d3e4c962ffc4 100644 (file)
@@ -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
 
 #include <stdlib.h>
 #include <string.h>
-#include "zip.h"
+
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+int
 _zip_set_name(struct zip *za, int idx, const char *name)
 {
     char *s;
index 014401c10e3de4621ff5e7ea2c313eb998d87d5f..867d3dfa3ed695d253d0293534b77d11fa2df20a 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_source_buffer.c,v 1.8 2007/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,
 
 \f
 
-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;
 }
 
+\f
+
 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);
index 486e1900d97103086a7c54e1504a5400cd5f4152..a42be670e98334c01e4d2c431c6fc697541b51bf 100644 (file)
@@ -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-2008 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
 #include <errno.h>
 #include <stdio.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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);
 }
index 8a33042655871394cf363cdde5d7ae442443dae9..10f9602e1e3a5219f337cb100be08a6429839f94 100644 (file)
@@ -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
 
   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
 #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,
 
 \f
 
-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);
+}
+
+\f
+
+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;
index 707309c913ba3c35f373cf7456cec99a32ff6eb8..293e7f7e114cdc77b2ae0e937a07273382835656 100644 (file)
@@ -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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI void
+ZIP_EXTERN(void)
 zip_source_free(struct zip_source *source)
 {
     if (source == NULL)
index 98e544bb23303ca46af2d1dd767a482050323012..fe3e82aa5ba29d80317c739bf944388f98480429 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_source_function.c,v 1.4 2007/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
 
 #include <stdlib.h>
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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;
index 0134dfefe7b2cb0581286de8319aded9a1909628..58119dd39f34cf717627c485296c896d6a729d87 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_source_zip.c,v 1.7 2007/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,
 
 \f
 
-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;
index 7c6cbf00d227f12e00a6fbbece173f5a94ac8244..c8a25e1d84ac377cc130d02ae0109d456c0418af 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-PHPZIPAPI int
+ZIP_EXTERN(int)
 zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st)
 {
     int idx;
index cf87347c23ef2af8fb1a6700a0fbc1037b991776..26425206ca3323b1d3b5a07d974e454c30a02b12 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_stat_index.c,v 1.10 2007/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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
 
-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;
index dfa7b2e256936e2cd73f0273ec67be9daf7e4b47..cb451dc3bcaad35d25cafa4729077cf6accb7b7d 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_stat_init.c,v 1.1 2007/10/31 12:03:04 dillo Exp $
-
   zip_stat_init.c -- initialize struct zip_stat.
-  Copyright (C) 2007 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 @@
 
 \f
 
-PHPZIPAPI void
+ZIP_EXTERN(void)
 zip_stat_init(struct zip_stat *st)
 {
     st->name = NULL;
index f3e5aa9fe8914090b63243011abe45f067a53980..ad23bafed6c629dca6427e39d9f00b76280321e0 100644 (file)
@@ -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
 
 \f
 
-#include "zip.h"
 #include "zipint.h"
 
 \f
-
-PHPZIPAPI const char *
+ZIP_EXTERN(const char *)
 zip_strerror(struct zip *za)
 {
     return _zip_error_strerror(&za->error);
index 3a51df7edd05233e2f0850ebb57b09f7b9f8c91e..7366c9cc7164e0bcf1e38424ca8a93f0f9241fb6 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_unchange.c,v 1.19 2007/04/23 13:21:18 wiz Exp $
-
   zip_unchange.c -- undo changes to file in zip archive
-  Copyright (C) 1999, 2004, 2007 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
 \f
 
 #include <stdlib.h>
-#include "zip.h"
+
 #include "zipint.h"
 
 \f
 
-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)
 
 \f
 
-PHPZIPAPI int
+int
 _zip_unchange(struct zip *za, int idx, int allow_duplicates)
 {
     int i;
index 56a59f3260373c7ba2c95462e9eada6768cc6a88..01282f89dbbafa05fe67aba83eb4c762ba014e98 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_unchange_all.c,v 1.10 2007/04/23 13:14:46 wiz Exp $
-
   zip_unchange.c -- undo changes to all files in zip archive
-  Copyright (C) 19992007 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
 \f
 
 #include <stdlib.h>
-#include "zip.h"
+
 #include "zipint.h"
 
 \f
 
-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;
index 4d9a2252831dcafcda23fbd82ed658fd281f5164..ca2b67854435a065ef1a334280e7bca060b9b72d 100644 (file)
@@ -1,11 +1,9 @@
 /*
-  $NiH: zip_unchange_archive.c,v 1.1 2007/04/23 13:14:46 wiz Exp $
-
   zip_unchange_archive.c -- undo global changes to ZIP archive
-  Copyright (C) 2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 2006-2008 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
 \f
 
 #include <stdlib.h>
-#include "zip.h"
+
 #include "zipint.h"
 
 \f
 
-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;
 }
index dfa2ea545fc168463514dff3d0183087a92ef94a..6fe89f4fb2b785958198834bee3da9320531e65e 100644 (file)
@@ -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) {
index ea3860d6022f312a0db90a5678376a5e6337dfa7..ff28d2878c4b6e8986400956c13250e1081faec2 100644 (file)
@@ -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
index 13a3da032e6b7ad8702f291e8edb408b4d1b50bf..25d6bec98f5f4ac9a1b37447f88eab2de33872ee 100644 (file)
@@ -2,13 +2,11 @@
 #define _HAD_ZIPINT_H
 
 /*
-  $NiH: zipint.h,v 1.48 2007/04/24 14:04:19 dillo Exp $
-
   zipint.h -- internal declarations.
-  Copyright (C) 1999, 2003, 2004, 2005, 2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2008 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
 #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
+
+\f
 
 #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
 #define MAXCOMLEN        65536
@@ -74,8 +92,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 +110,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 +133,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 +210,49 @@ extern const int _zip_err_type[];
 
 \f
 
-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 */