]> granicus.if.org Git - php/commitdiff
- fix stat when used with freshly added entries
authorPierre Joye <pajoye@php.net>
Wed, 1 Nov 2006 00:53:32 +0000 (00:53 +0000)
committerPierre Joye <pajoye@php.net>
Wed, 1 Nov 2006 00:53:32 +0000 (00:53 +0000)
- add zip_clear_error, zip_file_clear_error and  zip_stat_init in libzip
- add addEmptyDir(name) method, creates an empty directory

12 files changed:
ext/zip/config.m4
ext/zip/config.w32
ext/zip/lib/zip.h
ext/zip/lib/zip_add_dir.c [new file with mode: 0644]
ext/zip/lib/zip_error.c
ext/zip/lib/zip_error_clear.c [new file with mode: 0644]
ext/zip/lib/zip_file_error_clear.c [new file with mode: 0644]
ext/zip/lib/zip_source_buffer.c
ext/zip/lib/zip_source_filep.c
ext/zip/lib/zip_stat_index.c
ext/zip/lib/zip_stat_init.c [new file with mode: 0644]
ext/zip/php_zip.c

index 5208cff2950f39176e17047831ec8637b57a7802..e7907be21e6be63faaba9d545bb91a8aba07decf 100644 (file)
@@ -59,7 +59,8 @@ if test "$PHP_ZIP" != "no"; then
                          lib/zip_entry_new.c lib/zip_err_str.c lib/zip_fopen_index.c \
                          lib/zip_new.c lib/zip_source_file.c lib/zip_stat_index.c lib/zip_get_archive_comment.c \
                          lib/zip_get_file_comment.c lib/zip_set_archive_comment.c lib/zip_set_file_comment.c \
-                         lib/zip_unchange_archive.c lib/zip_memdup.c"
+                         lib/zip_unchange_archive.c lib/zip_memdup.c lib/zip_stat_init.c lib/zip_add_dir.c \
+                         lib/zip_error_clear.c lib/zip_file_error_clear.c"
 
        AC_DEFINE(HAVE_ZIP,1,[ ])
        PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c $PHP_ZIP_SOURCES, $ext_shared)
index 1a99217b59550b464d463b2b844e5969b3031545..2880f6b216df5c529f96b16c256ab6fb739c6b31 100644 (file)
@@ -26,7 +26,8 @@ if (PHP_ZIP != "no") {
                      zip_new.c zip_source_file.c zip_stat_index.c \
                      zip_get_archive_comment.c zip_get_file_comment.c \
                      zip_set_archive_comment.c zip_set_file_comment.c \
-                     zip_unchange_archive.c zip_memdup.c", "zip");
+                     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_ZLIB', 1);
                AC_DEFINE('HAVE_ZIP', 1);
index 8cf690cad3fe63c4ca14a0cad7a6e800e87d955d..70c54f38ba3cc843ad32e64594362f73e336f483 100644 (file)
@@ -163,12 +163,15 @@ struct zip_source;
 \f
 
 int zip_add(struct zip *, const char *, struct zip_source *);
+int zip_add_dir(struct zip *, const char *);
 int zip_close(struct zip *);
 int zip_delete(struct zip *, int);
+void zip_error_clear(struct zip *);
 void zip_error_get(struct zip *, int *, int *);
 int zip_error_get_sys_type(int);
 int zip_error_to_str(char *, size_t, int, int);
 int zip_fclose(struct zip_file *);
+void zip_file_error_clear(struct zip_file *);
 void zip_file_error_get(struct zip_file *, int *, int *);
 const char *zip_file_strerror(struct zip_file *);
 struct zip_file *zip_fopen(struct zip *, const char *, int);
@@ -194,6 +197,7 @@ struct zip_source *zip_source_zip(struct zip *, struct zip *, int, int,
                                  off_t, off_t);
 int zip_stat(struct zip *, const char *, int, struct zip_stat *);
 int zip_stat_index(struct zip *, int, int, struct zip_stat *);
+void zip_stat_init(struct zip_stat *);
 const char *zip_strerror(struct zip *);
 int zip_unchange(struct zip *, int);
 int zip_unchange_all(struct zip *);
diff --git a/ext/zip/lib/zip_add_dir.c b/ext/zip/lib/zip_add_dir.c
new file mode 100644 (file)
index 0000000..6cc05ed
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+  $NiH: zip_add_dir.c,v 1.1 2006/10/03 12:23:13 dillo Exp $
+
+  zip_add_dir.c -- add directory
+  Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <nih@giga.or.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+\f
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "zip.h"
+#include "zipint.h"
+
+\f
+
+int
+zip_add_dir(struct zip *za, const char *name)
+{
+    int len, ret;
+    char *s;
+    struct zip_source *source;
+
+    if (name == NULL) {
+       _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+       return -1;
+    }
+
+    s = NULL;
+    len = strlen(name);
+
+    if (name[len-1] != '/') {
+       if ((s=(char *)malloc(len+2)) == NULL) {
+           _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+           return -1;
+       }
+       strcpy(s, name);
+       s[len] = '/';
+       s[len+1] = '\0';
+    }
+
+    if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) {
+       free(s);
+       return -1;
+    }
+       
+    ret = _zip_replace(za, -1, s ? s : name, source);
+
+    free(s);
+    if (ret < 0)
+       zip_source_free(source);
+
+    return ret;
+}
index 33a8f3374a71ed3ea71287438303ea467d040326..6d2cd00904fc5d45a95f482ee11097f72e181d3e 100644 (file)
@@ -2,7 +2,7 @@
   $NiH: zip_error.c,v 1.7 2005/06/09 19:57:09 dillo Exp $
 
   zip_error.c -- struct zip_error helper functions
-  Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <nih@giga.or.at>
 
 \f
 
+void
+_zip_error_clear(struct zip_error *err)
+{
+    err->zip_err = ZIP_ER_OK;
+    err->sys_err = 0;
+}
+
+\f
+
 void
 _zip_error_copy(struct zip_error *dst, struct zip_error *src)
 {
@@ -78,7 +87,7 @@ _zip_error_get(struct zip_error *err, int *zep, int *sep)
 void
 _zip_error_init(struct zip_error *err)
 {
-    err->zip_err = 0;
+    err->zip_err = ZIP_ER_OK;
     err->sys_err = 0;
     err->str = NULL;
 }
diff --git a/ext/zip/lib/zip_error_clear.c b/ext/zip/lib/zip_error_clear.c
new file mode 100644 (file)
index 0000000..7d37ecf
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+  $NiH: zip_error_clear.c,v 1.1 2006/10/04 15:21:09 dillo Exp $
+
+  zip_error_clear.c -- clear zip error
+  Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <nih@giga.or.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+\f
+
+#include "zip.h"
+#include "zipint.h"
+
+\f
+
+void
+zip_error_clear(struct zip *za)
+{
+    _zip_error_clear(&za->error);
+}
diff --git a/ext/zip/lib/zip_file_error_clear.c b/ext/zip/lib/zip_file_error_clear.c
new file mode 100644 (file)
index 0000000..c7645c3
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+  $NiH: zip_file_error_clear.c,v 1.4 2006/10/04 18:37:54 wiz Exp $
+
+  zip_file_error_clear.c -- clear zip file error
+  Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <nih@giga.or.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+\f
+
+#include "zip.h"
+#include "zipint.h"
+
+\f
+
+void
+zip_file_error_clear(struct zip_file *zf)
+{
+    _zip_error_clear(&zf->error);
+}
index ada9ae85fbcc421cd6f686007bba51a537286cdc..9263d47638b3e7358a1b24b3689d6aba270e1f06 100644 (file)
@@ -2,7 +2,7 @@
   $NiH: zip_source_buffer.c,v 1.8 2006/04/23 14:50:49 wiz Exp $
 
   zip_source_buffer.c -- create zip data source from buffer
-  Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <nih@giga.or.at>
@@ -125,11 +125,9 @@ read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd)
 
            st = (struct zip_stat *)data;
 
+           zip_stat_init(st);
            st->mtime = z->mtime;
-           st->crc = 0;
            st->size = z->end - z->data;
-           st->comp_size = -1;
-           st->comp_method = ZIP_CM_STORE;
            
            return sizeof(*st);
        }
index 9c7383cf29c0e050fbe521b25add90ca507f8e45..da08ba42bba49165250f47dd421b54913127ad57 100644 (file)
@@ -2,7 +2,7 @@
   $NiH: zip_source_filep.c,v 1.6 2005/06/09 19:57:10 dillo Exp $
 
   zip_source_filep.c -- create data source from FILE *
-  Copyright (C) 1999, 2003, 2004, 2005 Dieter Baron and Thomas Klausner
+  Copyright (C) 1999-2006 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <nih@giga.or.at>
@@ -138,24 +138,20 @@ read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd)
            if (len < sizeof(*st))
                return -1;
 
-           st = (struct zip_stat *)data;
-
            if (fstat(fileno(z->f), &fst) != 0) {
                z->e[0] = ZIP_ER_READ; /* best match */
                z->e[1] = errno;
                return -1;
            }
 
+           st = (struct zip_stat *)data;
+
+           zip_stat_init(st);
            st->mtime = fst.st_mtime;
-           st->crc = 0;
            if (z->len != -1)
                st->size = z->len;
            else if ((fst.st_mode&S_IFMT) == S_IFREG)
                st->size = fst.st_size;
-           else
-               st->size = -1;
-           st->comp_size = -1;
-           st->comp_method = ZIP_CM_STORE;
 
            return sizeof(*st);
        }
index 837d639077ea8b891c3afab8a2eabf00b08c079b..c823315da250894f16c58252d639200780266d0c 100644 (file)
@@ -68,7 +68,6 @@ zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
            return -1;
        }
        
-       st->index = index;
        st->crc = za->cdir->entry[index].crc;
        st->size = za->cdir->entry[index].uncomp_size;
        st->mtime = za->cdir->entry[index].last_mod;
@@ -87,6 +86,7 @@ zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st)
        /* st->bitflags = za->cdir->entry[index].bitflags; */
     }
 
+    st->index = index;
     st->name = name;
     
     return 0;
diff --git a/ext/zip/lib/zip_stat_init.c b/ext/zip/lib/zip_stat_init.c
new file mode 100644 (file)
index 0000000..7ab0f4d
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+  $NiH: zip_stat_init.c,v 1.1 2006/10/31 12:03:04 dillo Exp $
+
+  zip_stat_init.c -- initialize struct zip_stat.
+  Copyright (C) 2006 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <nih@giga.or.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+\f
+
+#include "zipint.h"
+
+\f
+
+void
+zip_stat_init(struct zip_stat *st)
+{
+    st->name = NULL;
+    st->index = -1;
+    st->crc = 0;
+    st->mtime = (time_t)-1;
+    st->size = -1;
+    st->comp_size = -1;
+    st->comp_method = ZIP_CM_STORE;
+    st->encryption_method = ZIP_EM_NONE;
+}
index 1c582ed3a0d5b48aa5acbe306264804fcdaacee0..27bcc8c0d2d3d05a53676eeebf12da202c746a70 100644 (file)
@@ -935,6 +935,35 @@ ZIPARCHIVE_METHOD(close)
 }
 /* }}} */
 
+/* {{{ proto bool createEmptyDir(string dirname) U
+Returns the index of the entry named filename in the archive */
+ZIPARCHIVE_METHOD(addEmptyDir)
+{
+       struct zip *intern;
+       zval *this = getThis();
+       char *dirname;
+       int   dirname_len;
+
+       if (!this) {
+               RETURN_FALSE;
+       }
+
+       ZIP_FROM_OBJECT(intern, this);
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&",
+                       &dirname, &dirname_len, UG(ascii_conv)) == FAILURE) {
+               return;
+       }
+       if (dirname_len<1) {
+               RETURN_FALSE;
+       }
+
+       if (zip_add_dir(intern, (const char *)dirname) < 0) {
+               RETURN_FALSE;
+       }
+}
+/* }}} */
+
 /* {{{ proto bool addFile(string filepath[, string entryname[, int start [, int length]]]) U
 Add a file in a Zip archive using its path and the name to use. */
 ZIPARCHIVE_METHOD(addFile)
@@ -1904,6 +1933,7 @@ ZIPARCHIVE_METHOD(getStream)
 static zend_function_entry zip_class_functions[] = {
        ZIPARCHIVE_ME(open,                             NULL, ZEND_ACC_PUBLIC)
        ZIPARCHIVE_ME(close,                            NULL, ZEND_ACC_PUBLIC)
+       ZIPARCHIVE_ME(addEmptyDir,                      NULL, ZEND_ACC_PUBLIC)
        ZIPARCHIVE_ME(addFromString,            NULL, ZEND_ACC_PUBLIC)
        ZIPARCHIVE_ME(addFile,                  NULL, ZEND_ACC_PUBLIC)
        ZIPARCHIVE_ME(renameIndex,              NULL, ZEND_ACC_PUBLIC)