pajoye Sun Aug 13 20:16:48 2006 UTC
Modified files:
/php-src/ext/zip php_zip.c php_zip.h
/php-src/ext/zip/lib zip.h zip_open.c zip_replace.c
Log:
- add overwrite mode to ZipArchive::open, always starts a new archive
- fix build with php6
- remove safemode when built against php6
http://cvs.php.net/viewvc.cgi/php-src/ext/zip/php_zip.c?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/zip/php_zip.c
diff -u php-src/ext/zip/php_zip.c:1.2 php-src/ext/zip/php_zip.c:1.3
--- php-src/ext/zip/php_zip.c:1.2 Fri Jul 28 14:00:07 2006
+++ php-src/ext/zip/php_zip.c Sun Aug 13 20:16:48 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_zip.c,v 1.2 2006/07/28 14:00:07 iliaa Exp $ */
+/* $Id: php_zip.c,v 1.3 2006/08/13 20:16:48 pajoye Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -39,8 +39,14 @@
/* }}} */
/* {{{ SAFEMODE_CHECKFILE(filename) */
+#if (PHP_MAJOR_VERSION < 6)
#define SAFEMODE_CHECKFILE(filename) \
- (PG(safe_mode) && (!php_checkuid(filename, NULL,
CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(filename TSRMLS_CC)
+ if (PG(safe_mode) && (!php_checkuid(filename, NULL,
CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(filename TSRMLS_CC) { \
+ RETURN_FALSE; \
+ }
+#else
+#define SAFEMODE_CHECKFILE(filename);
+#endif
/* }}} */
/* {{{ PHP_ZIP_STAT_INDEX(za, index, flags, sb) */
@@ -111,7 +117,7 @@
len = spprintf(&file_dirname_fullpath, 0, "%s", dest);
}
- php_basename(file, file_len, NULL, 0, &file_basename,
&file_basename_len TSRMLS_CC);
+ php_basename(file, file_len, NULL, 0, &file_basename, (int
*)&file_basename_len TSRMLS_CC);
SAFEMODE_CHECKFILE(file_dirname_fullpath);
@@ -152,8 +158,11 @@
efree(file_basename);
return 0;
}
-
+#if (PHP_MAJOR_VERSION < 6)
stream = php_stream_open_wrapper(fullpath, "w+b",
REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL);
+#else
+ stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS, NULL);
+#endif
n = 0;
if (stream) {
while ((n=zip_fread(zf, b, sizeof(b))) > 0)
php_stream_write(stream, b, n);
@@ -613,9 +622,8 @@
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &filename,
&filename_len, &mode) == FAILURE) {
return;
}
- if (SAFEMODE_CHECKFILE(filename)) {
- RETURN_FALSE;
- }
+
+ SAFEMODE_CHECKFILE(filename);
rsrc_int = (zip_rsrc *)emalloc(sizeof(zip_rsrc));
@@ -956,6 +964,7 @@
int entry_name_len = 0;
struct zip_source *zs;
long offset_start = 0, offset_len = 0;
+ int cur_idx;
if (!this) {
RETURN_FALSE;
@@ -979,15 +988,29 @@
entry_name_len = filename_len;
}
- if (SAFEMODE_CHECKFILE(filename)) {
- RETURN_FALSE;
- }
+ SAFEMODE_CHECKFILE(filename);
zs = zip_source_file(intern, filename, 0, 0);
if (!zs) {
RETURN_FALSE;
}
- if (zip_add(intern, entry_name, zs) < 0) {
+
+ cur_idx = zip_name_locate(intern, (const char *)entry_name, 0);
+ /* TODO: fix _zip_replace */
+ if (cur_idx<0) {
+ /* reset the error */
+ if (intern->error.str) {
+ _zip_error_fini(&intern->error);
+ }
+ _zip_error_init(&intern->error);
+
+ } else {
+ if (zip_delete(intern, cur_idx) == -1) {
+ RETURN_FALSE;
+ }
+ }
+
+ if (zip_add(intern, entry_name, zs) == -1) {
RETURN_FALSE;
} else {
RETURN_TRUE;
@@ -1006,6 +1029,7 @@
ze_zip_object *ze_obj;
struct zip_source *zs;
int pos = 0;
+ int cur_idx;
if (!this) {
RETURN_FALSE;
@@ -1037,8 +1061,25 @@
RETURN_FALSE;
}
+ cur_idx = zip_name_locate(intern, (const char *)name, 0);
+ /* TODO: fix _zip_replace */
+ if (cur_idx<0) {
+ /* reset the error */
+ if (intern->error.str) {
+ _zip_error_fini(&intern->error);
+ }
+ _zip_error_init(&intern->error);
+
+ } else {
+ if (zip_delete(intern, cur_idx) == -1) {
+ RETURN_FALSE;
+ }
+ }
+
if (zip_add(intern, name, zs) == -1) {
RETURN_FALSE;
+ } else {
+ RETURN_TRUE;
}
}
/* }}} */
@@ -1845,6 +1886,8 @@
REGISTER_ZIP_CLASS_CONST_LONG("CREATE", ZIP_CREATE);
REGISTER_ZIP_CLASS_CONST_LONG("EXCL", ZIP_EXCL);
REGISTER_ZIP_CLASS_CONST_LONG("CHECKCONS", ZIP_CHECKCONS);
+ REGISTER_ZIP_CLASS_CONST_LONG("OVERWRITE", ZIP_OVERWRITE);
+
REGISTER_ZIP_CLASS_CONST_LONG("FL_NOCASE", ZIP_FL_NOCASE);
REGISTER_ZIP_CLASS_CONST_LONG("FL_NODIR", ZIP_FL_NODIR);
REGISTER_ZIP_CLASS_CONST_LONG("FL_COMPRESSED", ZIP_FL_COMPRESSED);
@@ -1916,7 +1959,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "Zip", "enabled");
- php_info_print_table_row(2, "Extension Version","$Id: php_zip.c,v 1.2
2006/07/28 14:00:07 iliaa Exp $");
+ php_info_print_table_row(2, "Extension Version","$Id: php_zip.c,v 1.3
2006/08/13 20:16:48 pajoye Exp $");
php_info_print_table_row(2, "Zip version", "1.4.0");
php_info_print_table_row(2, "Libzip version", "0.7.1");
http://cvs.php.net/viewvc.cgi/php-src/ext/zip/php_zip.h?r1=1.10&r2=1.11&diff_format=u
Index: php-src/ext/zip/php_zip.h
diff -u php-src/ext/zip/php_zip.h:1.10 php-src/ext/zip/php_zip.h:1.11
--- php-src/ext/zip/php_zip.h:1.10 Mon Jul 24 16:58:58 2006
+++ php-src/ext/zip/php_zip.h Sun Aug 13 20:16:48 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_zip.h,v 1.10 2006/07/24 16:58:58 pajoye Exp $ */
+/* $Id: php_zip.h,v 1.11 2006/08/13 20:16:48 pajoye Exp $ */
#ifndef PHP_ZIP_H
#define PHP_ZIP_H
@@ -37,7 +37,7 @@
#include "lib/zip.h"
#ifndef ZEND_ENGINE_2_1
-# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0)
+# if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) || PHP_MAJOR_VERSION ==
6
# define ZEND_ENGINE_2_1
# endif
#endif
http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip.h?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/zip/lib/zip.h
diff -u php-src/ext/zip/lib/zip.h:1.1 php-src/ext/zip/lib/zip.h:1.2
--- php-src/ext/zip/lib/zip.h:1.1 Mon Jul 24 16:58:58 2006
+++ php-src/ext/zip/lib/zip.h Sun Aug 13 20:16:48 2006
@@ -53,6 +53,7 @@
#define ZIP_CREATE 1
#define ZIP_EXCL 2
#define ZIP_CHECKCONS 4
+#define ZIP_OVERWRITE 8
/* flags for zip_name_locate, zip_fopen, zip_stat, ... */
http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_open.c?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/zip/lib/zip_open.c
diff -u php-src/ext/zip/lib/zip_open.c:1.1 php-src/ext/zip/lib/zip_open.c:1.2
--- php-src/ext/zip/lib/zip_open.c:1.1 Mon Jul 24 16:58:58 2006
+++ php-src/ext/zip/lib/zip_open.c Sun Aug 13 20:16:48 2006
@@ -74,9 +74,9 @@
set_error(zep, NULL, ZIP_ER_INVAL);
return NULL;
}
-
- if (stat(fn, &st) != 0) {
- if (flags & ZIP_CREATE) {
+
+ 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;
@@ -99,14 +99,15 @@
set_error(zep, NULL, ZIP_ER_EXISTS);
return NULL;
}
+
+
/* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL,
just like open() */
-
- if ((fp=fopen(fn, "rb")) == NULL) {
- set_error(zep, NULL, ZIP_ER_OPEN);
- return NULL;
- }
-
+ if ((fp=fopen(fn, "rb")) == NULL) {
+ set_error(zep, NULL, ZIP_ER_OPEN);
+ return NULL;
+ }
+
clearerr(fp);
fseek(fp, 0, SEEK_END);
len = ftell(fp);
http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_replace.c?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/zip/lib/zip_replace.c
diff -u php-src/ext/zip/lib/zip_replace.c:1.1
php-src/ext/zip/lib/zip_replace.c:1.2
--- php-src/ext/zip/lib/zip_replace.c:1.1 Mon Jul 24 16:58:58 2006
+++ php-src/ext/zip/lib/zip_replace.c Sun Aug 13 20:16:48 2006
@@ -66,11 +66,14 @@
return -1;
idx = za->nentry - 1;
}
-
+
+
_zip_unchange_data(za->entry+idx);
if (name && _zip_set_name(za, idx, name) != 0)
return -1;
+
+
za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry)
? ZIP_ST_ADDED : ZIP_ST_REPLACED);
za->entry[idx].source = source;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php