summaryrefslogtreecommitdiff
path: root/ext/zip/php_zip.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/zip/php_zip.c')
-rw-r--r--ext/zip/php_zip.c1329
1 files changed, 663 insertions, 666 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index c203148334..67204b08b4 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
- | PHP Version 5 |
+ | PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2015 The PHP Group |
+ | Copyright (c) 1997-2017 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -16,7 +16,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id$ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -51,24 +50,6 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_close);
#endif
#endif
-#if PHP_VERSION_ID < 50400
-#define ARG_PATH "s"
-#define KEY_ARG_DC
-#define KEY_ARG_CC
-#else
-#define ARG_PATH "p"
-#define KEY_ARG_DC , const zend_literal *key
-#define KEY_ARG_CC , key
-#endif
-
-#if PHP_VERSION_ID < 50500
-#define TYPE_ARG_DC
-#define TYPE_ARG_CC
-#else
-#define TYPE_ARG_DC , int type
-#define TYPE_ARG_CC , type
-#endif
-
/* {{{ Resource le */
static int le_zip_dir;
#define le_zip_dir_name "Zip Directory"
@@ -86,7 +67,7 @@ static int le_zip_entry;
/* {{{ PHP_ZIP_STAT_PATH(za, path, path_len, flags, sb) */
#define PHP_ZIP_STAT_PATH(za, path, path_len, flags, sb) \
if (path_len < 1) { \
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as entry name"); \
+ php_error_docref(NULL, E_NOTICE, "Empty string as entry name"); \
RETURN_FALSE; \
} \
if (zip_stat(za, path, flags, &sb) != 0) { \
@@ -98,23 +79,20 @@ static int le_zip_entry;
#define PHP_ZIP_SET_FILE_COMMENT(za, index, comment, comment_len) \
if (comment_len == 0) { \
/* Passing NULL remove the existing comment */ \
- if (zip_set_file_comment(intern, index, NULL, 0) < 0) { \
+ if (zip_set_file_comment(za, index, NULL, 0) < 0) { \
RETURN_FALSE; \
} \
- } else if (zip_set_file_comment(intern, index, comment, comment_len) < 0) { \
+ } else if (zip_set_file_comment(za, index, comment, comment_len) < 0) { \
RETURN_FALSE; \
} \
RETURN_TRUE;
/* }}} */
-#if (PHP_MAJOR_VERSION < 6)
# define add_ascii_assoc_string add_assoc_string
# define add_ascii_assoc_long add_assoc_long
-#endif
-
/* Flatten a path by making a relative path (to .)*/
-static char * php_zip_make_relative_path(char *path, int path_len) /* {{{ */
+static char * php_zip_make_relative_path(char *path, size_t path_len) /* {{{ */
{
char *path_begin = path;
size_t i;
@@ -150,18 +128,11 @@ static char * php_zip_make_relative_path(char *path, int path_len) /* {{{ */
}
/* }}} */
-#ifdef PHP_ZIP_USE_OO
-
-#if PHP_VERSION_ID < 50600
-# define CWD_STATE_ALLOC(l) malloc(l)
-# define CWD_STATE_FREE(s) free(s)
-#else
# define CWD_STATE_ALLOC(l) emalloc(l)
# define CWD_STATE_FREE(s) efree(s)
-#endif
/* {{{ php_zip_extract_file */
-static int php_zip_extract_file(struct zip * za, char *dest, char *file, int file_len TSRMLS_DC)
+static int php_zip_extract_file(struct zip * za, char *dest, char *file, int file_len)
{
php_stream_statbuf ssb;
struct zip_file *zf;
@@ -173,12 +144,11 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
char *file_dirname_fullpath;
char file_dirname[MAXPATHLEN];
size_t dir_len;
- char *file_basename;
- size_t file_basename_len;
int is_dir_only = 0;
char *path_cleaned;
size_t path_cleaned_len;
cwd_state new_state;
+ zend_string *file_basename;
new_state.cwd = CWD_STATE_ALLOC(1);
new_state.cwd[0] = '\0';
@@ -187,7 +157,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
/* Clean/normlize the path and then transform any path (absolute or relative)
to a path relative to cwd (../../mydir/foo.txt > mydir/foo.txt)
*/
- virtual_file_ex(&new_state, file, NULL, CWD_EXPAND TSRMLS_CC);
+ virtual_file_ex(&new_state, file, NULL, CWD_EXPAND);
path_cleaned = php_zip_make_relative_path(new_state.cwd, new_state.cwd_length);
if(!path_cleaned) {
return 0;
@@ -212,11 +182,11 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
len = spprintf(&file_dirname_fullpath, 0, "%s/%s", dest, file_dirname);
}
- php_basename(path_cleaned, path_cleaned_len, NULL, 0, &file_basename, (size_t *)&file_basename_len TSRMLS_CC);
+ file_basename = php_basename(path_cleaned, path_cleaned_len, NULL, 0);
if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname_fullpath)) {
efree(file_dirname_fullpath);
- efree(file_basename);
+ zend_string_release(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
}
@@ -224,23 +194,11 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
/* let see if the path already exists */
if (php_stream_stat_path_ex(file_dirname_fullpath, PHP_STREAM_URL_STAT_QUIET, &ssb, NULL) < 0) {
-
-#if defined(PHP_WIN32) && (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1)
- char *e;
- e = file_dirname_fullpath;
- while (*e) {
- if (*e == '/') {
- *e = DEFAULT_SLASH;
- }
- e++;
- }
-#endif
-
ret = php_stream_mkdir(file_dirname_fullpath, 0777, PHP_STREAM_MKDIR_RECURSIVE|REPORT_ERRORS, NULL);
if (!ret) {
efree(file_dirname_fullpath);
if (!is_dir_only) {
- efree(file_basename);
+ zend_string_release(file_basename);
CWD_STATE_FREE(new_state.cwd);
}
return 0;
@@ -254,16 +212,16 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
return 1;
}
- len = spprintf(&fullpath, 0, "%s/%s", file_dirname_fullpath, file_basename);
+ len = spprintf(&fullpath, 0, "%s/%s", file_dirname_fullpath, ZSTR_VAL(file_basename));
if (!len) {
efree(file_dirname_fullpath);
- efree(file_basename);
+ zend_string_release(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
} else if (len > MAXPATHLEN) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Full extraction path exceed MAXPATHLEN (%i)", MAXPATHLEN);
+ php_error_docref(NULL, E_WARNING, "Full extraction path exceed MAXPATHLEN (%i)", MAXPATHLEN);
efree(file_dirname_fullpath);
- efree(file_basename);
+ zend_string_release(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
}
@@ -275,26 +233,22 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
if (ZIP_OPENBASEDIR_CHECKPATH(fullpath)) {
efree(fullpath);
efree(file_dirname_fullpath);
- efree(file_basename);
+ zend_string_release(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
}
-#if PHP_API_VERSION < 20100412
- 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
-
- if (stream == NULL) {
+ zf = zip_fopen(za, file, 0);
+ if (zf == NULL) {
n = -1;
goto done;
}
- zf = zip_fopen(za, file, 0);
- if (zf == NULL) {
+ stream = php_stream_open_wrapper(fullpath, "w+b", REPORT_ERRORS, NULL);
+
+ if (stream == NULL) {
n = -1;
- php_stream_close(stream);
+ zip_fclose(zf);
goto done;
}
@@ -309,7 +263,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
done:
efree(fullpath);
- efree(file_basename);
+ zend_string_release(file_basename);
efree(file_dirname_fullpath);
CWD_STATE_FREE(new_state.cwd);
@@ -322,7 +276,7 @@ done:
/* }}} */
static int php_zip_add_file(struct zip *za, const char *filename, size_t filename_len,
- char *entry_name, size_t entry_name_len, long offset_start, long offset_len TSRMLS_DC) /* {{{ */
+ char *entry_name, size_t entry_name_len, long offset_start, long offset_len) /* {{{ */
{
struct zip_source *zs;
char resolved_path[MAXPATHLEN];
@@ -333,12 +287,12 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam
return -1;
}
- if (!expand_filepath(filename, resolved_path TSRMLS_CC)) {
+ if (!expand_filepath(filename, resolved_path)) {
return -1;
}
- php_stat(resolved_path, strlen(resolved_path), FS_EXISTS, &exists_flag TSRMLS_CC);
- if (!Z_BVAL(exists_flag)) {
+ php_stat(resolved_path, strlen(resolved_path), FS_EXISTS, &exists_flag);
+ if (Z_TYPE(exists_flag) == IS_FALSE) {
return -1;
}
@@ -356,62 +310,52 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam
}
/* }}} */
-static int php_zip_parse_options(zval *options, long *remove_all_path,
- char **remove_path, int *remove_path_len, char **add_path, int *add_path_len TSRMLS_DC) /* {{{ */
+static int php_zip_parse_options(zval *options, zend_long *remove_all_path, char **remove_path, size_t *remove_path_len, char **add_path, size_t *add_path_len) /* {{{ */
{
- zval **option;
- if (zend_hash_find(HASH_OF(options), "remove_all_path", sizeof("remove_all_path"), (void **)&option) == SUCCESS) {
- long opt;
- if (Z_TYPE_PP(option) != IS_LONG) {
- zval tmp = **option;
- zval_copy_ctor(&tmp);
- convert_to_long(&tmp);
- opt = Z_LVAL(tmp);
- } else {
- opt = Z_LVAL_PP(option);
- }
- *remove_all_path = opt;
+ zval *option;
+ if ((option = zend_hash_str_find(Z_ARRVAL_P(options), "remove_all_path", sizeof("remove_all_path") - 1)) != NULL) {
+ *remove_all_path = zval_get_long(option);
}
/* If I add more options, it would make sense to create a nice static struct and loop over it. */
- if (zend_hash_find(HASH_OF(options), "remove_path", sizeof("remove_path"), (void **)&option) == SUCCESS) {
- if (Z_TYPE_PP(option) != IS_STRING) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "remove_path option expected to be a string");
+ if ((option = zend_hash_str_find(Z_ARRVAL_P(options), "remove_path", sizeof("remove_path") - 1)) != NULL) {
+ if (Z_TYPE_P(option) != IS_STRING) {
+ php_error_docref(NULL, E_WARNING, "remove_path option expected to be a string");
return -1;
}
- if (Z_STRLEN_PP(option) < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string given as remove_path option");
+ if (Z_STRLEN_P(option) < 1) {
+ php_error_docref(NULL, E_NOTICE, "Empty string given as remove_path option");
return -1;
}
- if (Z_STRLEN_PP(option) >= MAXPATHLEN) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "remove_path string is too long (max: %i, %i given)",
- MAXPATHLEN - 1, Z_STRLEN_PP(option));
+ if (Z_STRLEN_P(option) >= MAXPATHLEN) {
+ php_error_docref(NULL, E_WARNING, "remove_path string is too long (max: %d, %zd given)",
+ MAXPATHLEN - 1, Z_STRLEN_P(option));
return -1;
}
- *remove_path_len = Z_STRLEN_PP(option);
- *remove_path = Z_STRVAL_PP(option);
+ *remove_path_len = Z_STRLEN_P(option);
+ *remove_path = Z_STRVAL_P(option);
}
- if (zend_hash_find(HASH_OF(options), "add_path", sizeof("add_path"), (void **)&option) == SUCCESS) {
- if (Z_TYPE_PP(option) != IS_STRING) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "add_path option expected to be a string");
+ if ((option = zend_hash_str_find(Z_ARRVAL_P(options), "add_path", sizeof("add_path") - 1)) != NULL) {
+ if (Z_TYPE_P(option) != IS_STRING) {
+ php_error_docref(NULL, E_WARNING, "add_path option expected to be a string");
return -1;
}
- if (Z_STRLEN_PP(option) < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string given as the add_path option");
+ if (Z_STRLEN_P(option) < 1) {
+ php_error_docref(NULL, E_NOTICE, "Empty string given as the add_path option");
return -1;
}
- if (Z_STRLEN_PP(option) >= MAXPATHLEN) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "add_path string too long (max: %i, %i given)",
- MAXPATHLEN - 1, Z_STRLEN_PP(option));
+ if (Z_STRLEN_P(option) >= MAXPATHLEN) {
+ php_error_docref(NULL, E_WARNING, "add_path string too long (max: %d, %zd given)",
+ MAXPATHLEN - 1, Z_STRLEN_P(option));
return -1;
}
- *add_path_len = Z_STRLEN_PP(option);
- *add_path = Z_STRVAL_PP(option);
+ *add_path_len = Z_STRLEN_P(option);
+ *add_path = Z_STRVAL_P(option);
}
return 1;
}
@@ -419,16 +363,16 @@ static int php_zip_parse_options(zval *options, long *remove_all_path,
/* {{{ REGISTER_ZIP_CLASS_CONST_LONG */
#define REGISTER_ZIP_CLASS_CONST_LONG(const_name, value) \
- zend_declare_class_constant_long(zip_class_entry, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC);
+ zend_declare_class_constant_long(zip_class_entry, const_name, sizeof(const_name)-1, (zend_long)value);
/* }}} */
/* {{{ ZIP_FROM_OBJECT */
#define ZIP_FROM_OBJECT(intern, object) \
{ \
- ze_zip_object *obj = (ze_zip_object*) zend_object_store_get_object(object TSRMLS_CC); \
+ ze_zip_object *obj = Z_ZIP_P(object); \
intern = obj->za; \
if (!intern) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or uninitialized Zip object"); \
+ php_error_docref(NULL, E_WARNING, "Invalid or uninitialized Zip object"); \
RETURN_FALSE; \
} \
}
@@ -438,41 +382,59 @@ static int php_zip_parse_options(zval *options, long *remove_all_path,
#define RETURN_SB(sb) \
{ \
array_init(return_value); \
- add_ascii_assoc_string(return_value, "name", (char *)(sb)->name, 1); \
- add_ascii_assoc_long(return_value, "index", (long) (sb)->index); \
- add_ascii_assoc_long(return_value, "crc", (long) (sb)->crc); \
- add_ascii_assoc_long(return_value, "size", (long) (sb)->size); \
- add_ascii_assoc_long(return_value, "mtime", (long) (sb)->mtime); \
- add_ascii_assoc_long(return_value, "comp_size", (long) (sb)->comp_size); \
- add_ascii_assoc_long(return_value, "comp_method", (long) (sb)->comp_method); \
+ add_ascii_assoc_string(return_value, "name", (char *)(sb)->name); \
+ add_ascii_assoc_long(return_value, "index", (zend_long) (sb)->index); \
+ add_ascii_assoc_long(return_value, "crc", (zend_long) (sb)->crc); \
+ add_ascii_assoc_long(return_value, "size", (zend_long) (sb)->size); \
+ add_ascii_assoc_long(return_value, "mtime", (zend_long) (sb)->mtime); \
+ add_ascii_assoc_long(return_value, "comp_size", (zend_long) (sb)->comp_size); \
+ add_ascii_assoc_long(return_value, "comp_method", (zend_long) (sb)->comp_method); \
}
/* }}} */
-static int php_zip_status(struct zip *za TSRMLS_DC) /* {{{ */
+static int php_zip_status(struct zip *za) /* {{{ */
{
+#if LIBZIP_VERSION_MAJOR < 1
int zep, syp;
zip_error_get(za, &zep, &syp);
+#else
+ int zep;
+ zip_error_t *err;
+
+ err = zip_get_error(za);
+ zep = zip_error_code_zip(err);
+ zip_error_fini(err);
+#endif
return zep;
}
/* }}} */
-static int php_zip_status_sys(struct zip *za TSRMLS_DC) /* {{{ */
+static int php_zip_status_sys(struct zip *za) /* {{{ */
{
+#if LIBZIP_VERSION_MAJOR < 1
int zep, syp;
zip_error_get(za, &zep, &syp);
+#else
+ int syp;
+ zip_error_t *err;
+
+ err = zip_get_error(za);
+ syp = zip_error_code_system(err);
+ zip_error_fini(err);
+#endif
return syp;
}
/* }}} */
-static int php_zip_get_num_files(struct zip *za TSRMLS_DC) /* {{{ */
+static int php_zip_get_num_files(struct zip *za) /* {{{ */
{
return zip_get_num_files(za);
}
/* }}} */
-static char * php_zipobj_get_filename(ze_zip_object *obj TSRMLS_DC) /* {{{ */
+static char * php_zipobj_get_filename(ze_zip_object *obj) /* {{{ */
{
if (!obj) {
@@ -486,7 +448,7 @@ static char * php_zipobj_get_filename(ze_zip_object *obj TSRMLS_DC) /* {{{ */
}
/* }}} */
-static char * php_zipobj_get_zip_comment(struct zip *za, int *len TSRMLS_DC) /* {{{ */
+static char * php_zipobj_get_zip_comment(struct zip *za, int *len) /* {{{ */
{
if (za) {
return (char *)zip_get_archive_comment(za, len, 0);
@@ -527,7 +489,7 @@ static char * php_zipobj_get_zip_comment(struct zip *za, int *len TSRMLS_DC) /*
#endif /* }}} */
-int php_zip_glob(char *pattern, int pattern_len, long flags, zval *return_value TSRMLS_DC) /* {{{ */
+int php_zip_glob(char *pattern, int pattern_len, zend_long flags, zval *return_value) /* {{{ */
{
#ifdef HAVE_GLOB
char cwd[MAXPATHLEN];
@@ -541,12 +503,12 @@ int php_zip_glob(char *pattern, int pattern_len, long flags, zval *return_value
int ret;
if (pattern_len >= MAXPATHLEN) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Pattern exceeds the maximum allowed length of %d characters", MAXPATHLEN);
+ php_error_docref(NULL, E_WARNING, "Pattern exceeds the maximum allowed length of %d characters", MAXPATHLEN);
return -1;
}
if ((GLOB_AVAILABLE_FLAGS & flags) != flags) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "At least one of the passed flags is invalid or not supported on this platform");
+ php_error_docref(NULL, E_WARNING, "At least one of the passed flags is invalid or not supported on this platform");
return -1;
}
@@ -611,7 +573,7 @@ int php_zip_glob(char *pattern, int pattern_len, long flags, zval *return_value
* able to filter directories out.
*/
if (flags & GLOB_ONLYDIR) {
- struct stat s;
+ zend_stat_t s;
if (0 != VCWD_STAT(globbuf.gl_pathv[n], &s)) {
continue;
@@ -621,19 +583,19 @@ int php_zip_glob(char *pattern, int pattern_len, long flags, zval *return_value
continue;
}
}
- add_next_index_string(return_value, globbuf.gl_pathv[n]+cwd_skip, 1);
+ add_next_index_string(return_value, globbuf.gl_pathv[n]+cwd_skip);
}
globfree(&globbuf);
return globbuf.gl_pathc;
#else
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Glob support is not available");
+ php_error_docref(NULL, E_ERROR, "Glob support is not available");
return 0;
#endif /* HAVE_GLOB */
}
/* }}} */
-int php_zip_pcre(char *regexp, int regexp_len, char *path, int path_len, zval *return_value TSRMLS_DC) /* {{{ */
+int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_value) /* {{{ */
{
#ifdef ZTS
char cwd[MAXPATHLEN];
@@ -642,7 +604,7 @@ int php_zip_pcre(char *regexp, int regexp_len, char *path, int path_len, zval *r
char *result;
#endif
int files_cnt;
- char **namelist;
+ zend_string **namelist;
#ifdef ZTS
if (!IS_ABSOLUTE_PATH(path, path_len)) {
@@ -669,13 +631,13 @@ int php_zip_pcre(char *regexp, int regexp_len, char *path, int path_len, zval *r
files_cnt = php_stream_scandir(path, &namelist, NULL, (void *) php_stream_dirent_alphasort);
if (files_cnt > 0) {
- pcre *re = NULL;
+ pcre *re = NULL;
pcre_extra *pcre_extra = NULL;
int preg_options = 0, i;
- re = pcre_get_compiled_regex(regexp, &pcre_extra, &preg_options TSRMLS_CC);
+ re = pcre_get_compiled_regex(regexp, &pcre_extra, &preg_options);
if (!re) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid expression");
+ php_error_docref(NULL, E_WARNING, "Invalid expression");
return -1;
}
@@ -683,48 +645,47 @@ int php_zip_pcre(char *regexp, int regexp_len, char *path, int path_len, zval *r
/* only the files, directories are ignored */
for (i = 0; i < files_cnt; i++) {
- struct stat s;
+ zend_stat_t s;
char fullpath[MAXPATHLEN];
int ovector[3];
int matches;
- int namelist_len = strlen(namelist[i]);
-
+ int namelist_len = ZSTR_LEN(namelist[i]);
- if ((namelist_len == 1 && namelist[i][0] == '.') ||
- (namelist_len == 2 && namelist[i][0] == '.' && namelist[i][1] == '.')) {
- efree(namelist[i]);
+ if ((namelist_len == 1 && ZSTR_VAL(namelist[i])[0] == '.') ||
+ (namelist_len == 2 && ZSTR_VAL(namelist[i])[0] == '.' && ZSTR_VAL(namelist[i])[1] == '.')) {
+ zend_string_release(namelist[i]);
continue;
}
if ((path_len + namelist_len + 1) >= MAXPATHLEN) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "add_path string too long (max: %i, %i given)",
+ php_error_docref(NULL, E_WARNING, "add_path string too long (max: %i, %i given)",
MAXPATHLEN - 1, (path_len + namelist_len + 1));
- efree(namelist[i]);
+ zend_string_release(namelist[i]);
break;
}
- snprintf(fullpath, MAXPATHLEN, "%s%c%s", path, DEFAULT_SLASH, namelist[i]);
+ snprintf(fullpath, MAXPATHLEN, "%s%c%s", path, DEFAULT_SLASH, ZSTR_VAL(namelist[i]));
if (0 != VCWD_STAT(fullpath, &s)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot read <%s>", fullpath);
- efree(namelist[i]);
+ php_error_docref(NULL, E_WARNING, "Cannot read <%s>", fullpath);
+ zend_string_release(namelist[i]);
continue;
}
if (S_IFDIR == (s.st_mode & S_IFMT)) {
- efree(namelist[i]);
+ zend_string_release(namelist[i]);
continue;
}
- matches = pcre_exec(re, NULL, namelist[i], strlen(namelist[i]), 0, 0, ovector, 3);
+ matches = pcre_exec(re, NULL, ZSTR_VAL(namelist[i]), ZSTR_LEN(namelist[i]), 0, 0, ovector, 3);
/* 0 means that the vector is too small to hold all the captured substring offsets */
if (matches < 0) {
- efree(namelist[i]);
+ zend_string_release(namelist[i]);
continue;
}
- add_next_index_string(return_value, fullpath, 1);
- efree(namelist[i]);
+ add_next_index_string(return_value, fullpath);
+ zend_string_release(namelist[i]);
}
efree(namelist);
}
@@ -732,8 +693,6 @@ int php_zip_pcre(char *regexp, int regexp_len, char *path, int path_len, zval *r
}
/* }}} */
-#endif
-
/* {{{ arginfo */
ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1)
ZEND_ARG_INFO(0, filename)
@@ -800,15 +759,14 @@ static const zend_function_entry zip_functions[] = {
/* }}} */
/* {{{ ZE2 OO definitions */
-#ifdef PHP_ZIP_USE_OO
static zend_class_entry *zip_class_entry;
static zend_object_handlers zip_object_handlers;
static HashTable zip_prop_handlers;
-typedef int (*zip_read_int_t)(struct zip *za TSRMLS_DC);
-typedef char *(*zip_read_const_char_t)(struct zip *za, int *len TSRMLS_DC);
-typedef char *(*zip_read_const_char_from_ze_t)(ze_zip_object *obj TSRMLS_DC);
+typedef int (*zip_read_int_t)(struct zip *za);
+typedef char *(*zip_read_const_char_t)(struct zip *za, int *len);
+typedef char *(*zip_read_const_char_from_ze_t)(ze_zip_object *obj);
typedef struct _zip_prop_handler {
zip_read_int_t read_int_func;
@@ -817,11 +775,9 @@ typedef struct _zip_prop_handler {
int type;
} zip_prop_handler;
-#endif
/* }}} */
-#ifdef PHP_ZIP_USE_OO
-static void php_zip_register_prop_handler(HashTable *prop_handler, char *name, zip_read_int_t read_int_func, zip_read_const_char_t read_char_func, zip_read_const_char_from_ze_t read_char_from_obj_func, int rettype TSRMLS_DC) /* {{{ */
+static void php_zip_register_prop_handler(HashTable *prop_handler, char *name, zip_read_int_t read_int_func, zip_read_const_char_t read_char_func, zip_read_const_char_from_ze_t read_char_from_obj_func, int rettype) /* {{{ */
{
zip_prop_handler hnd;
@@ -829,11 +785,11 @@ static void php_zip_register_prop_handler(HashTable *prop_handler, char *name, z
hnd.read_int_func = read_int_func;
hnd.read_const_char_from_obj_func = read_char_from_obj_func;
hnd.type = rettype;
- zend_hash_add(prop_handler, name, strlen(name)+1, &hnd, sizeof(zip_prop_handler), NULL);
+ zend_hash_str_add_mem(prop_handler, name, strlen(name), &hnd, sizeof(zip_prop_handler));
}
/* }}} */
-static int php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd, zval **retval, int newzval TSRMLS_DC) /* {{{ */
+static zval *php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd, zval *rv) /* {{{ */
{
const char *retchar = NULL;
int retint = 0;
@@ -841,245 +797,205 @@ static int php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd, zv
if (obj && obj->za != NULL) {
if (hnd->read_const_char_func) {
- retchar = hnd->read_const_char_func(obj->za, &len TSRMLS_CC);
+ retchar = hnd->read_const_char_func(obj->za, &len);
} else {
if (hnd->read_int_func) {
- retint = hnd->read_int_func(obj->za TSRMLS_CC);
+ retint = hnd->read_int_func(obj->za);
if (retint == -1) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Internal zip error returned");
- return FAILURE;
+ php_error_docref(NULL, E_WARNING, "Internal zip error returned");
+ return NULL;
}
} else {
if (hnd->read_const_char_from_obj_func) {
- retchar = hnd->read_const_char_from_obj_func(obj TSRMLS_CC);
+ retchar = hnd->read_const_char_from_obj_func(obj);
len = strlen(retchar);
}
}
}
}
- if (newzval) {
- ALLOC_ZVAL(*retval);
- }
-
switch (hnd->type) {
case IS_STRING:
if (retchar) {
- ZVAL_STRINGL(*retval, (char *) retchar, len, 1);
+ ZVAL_STRINGL(rv, (char *) retchar, len);
} else {
- ZVAL_EMPTY_STRING(*retval);
+ ZVAL_EMPTY_STRING(rv);
}
break;
- case IS_BOOL:
- ZVAL_BOOL(*retval, (long)retint);
+ /* case IS_TRUE */
+ case IS_FALSE:
+ ZVAL_BOOL(rv, (long)retint);
break;
case IS_LONG:
- ZVAL_LONG(*retval, (long)retint);
+ ZVAL_LONG(rv, (long)retint);
break;
default:
- ZVAL_NULL(*retval);
+ ZVAL_NULL(rv);
}
- return SUCCESS;
+ return rv;
}
/* }}} */
-static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member TYPE_ARG_DC KEY_ARG_DC TSRMLS_DC) /* {{{ */
+static zval *php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
{
ze_zip_object *obj;
zval tmp_member;
- zval **retval = NULL;
-
- zip_prop_handler *hnd;
+ zval *retval = NULL;
+ zip_prop_handler *hnd = NULL;
zend_object_handlers *std_hnd;
- int ret;
- if (member->type != IS_STRING) {
- tmp_member = *member;
- zval_copy_ctor(&tmp_member);
+ if (Z_TYPE_P(member) != IS_STRING) {
+ ZVAL_COPY(&tmp_member, member);
convert_to_string(&tmp_member);
member = &tmp_member;
-#if PHP_VERSION_ID >= 50400
- key = NULL;
-#endif
+ cache_slot = NULL;
}
- ret = FAILURE;
- obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC);
+ obj = Z_ZIP_P(object);
if (obj->prop_handler != NULL) {
-#if PHP_VERSION_ID >= 50400
- if (key) {
- ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd);
- } else
-#endif
- ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+ hnd = zend_hash_find_ptr(obj->prop_handler, Z_STR_P(member));
}
-
- if (ret == FAILURE) {
+ if (hnd == NULL) {
std_hnd = zend_get_std_object_handlers();
- retval = std_hnd->get_property_ptr_ptr(object, member TYPE_ARG_CC KEY_ARG_CC TSRMLS_CC);
+ retval = std_hnd->get_property_ptr_ptr(object, member, type, cache_slot);
}
if (member == &tmp_member) {
zval_dtor(member);
}
+
return retval;
}
/* }}} */
-static zval* php_zip_read_property(zval *object, zval *member, int type KEY_ARG_DC TSRMLS_DC) /* {{{ */
+static zval *php_zip_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
{
ze_zip_object *obj;
zval tmp_member;
- zval *retval;
- zip_prop_handler *hnd;
+ zval *retval = NULL;
+ zip_prop_handler *hnd = NULL;
zend_object_handlers *std_hnd;
- int ret;
- if (member->type != IS_STRING) {
- tmp_member = *member;
- zval_copy_ctor(&tmp_member);
+ if (Z_TYPE_P(member) != IS_STRING) {
+ ZVAL_COPY(&tmp_member, member);
convert_to_string(&tmp_member);
member = &tmp_member;
-#if PHP_VERSION_ID >= 50400
- key = NULL;
-#endif
+ cache_slot = NULL;
}
- ret = FAILURE;
- obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC);
+ obj = Z_ZIP_P(object);
if (obj->prop_handler != NULL) {
-#if PHP_VERSION_ID >= 50400
- if (key) {
- ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd);
- } else
-#endif
- ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+ hnd = zend_hash_find_ptr(obj->prop_handler, Z_STR_P(member));
}
- if (ret == SUCCESS) {
- ret = php_zip_property_reader(obj, hnd, &retval, 1 TSRMLS_CC);
- if (ret == SUCCESS) {
- /* ensure we're creating a temporary variable */
- Z_SET_REFCOUNT_P(retval, 0);
- } else {
- retval = EG(uninitialized_zval_ptr);
+ if (hnd != NULL) {
+ retval = php_zip_property_reader(obj, hnd, rv);
+ if (retval == NULL) {
+ retval = &EG(uninitialized_zval);
}
} else {
std_hnd = zend_get_std_object_handlers();
- retval = std_hnd->read_property(object, member, type KEY_ARG_CC TSRMLS_CC);
+ retval = std_hnd->read_property(object, member, type, cache_slot, rv);
}
if (member == &tmp_member) {
zval_dtor(member);
}
+
return retval;
}
/* }}} */
-static int php_zip_has_property(zval *object, zval *member, int type KEY_ARG_DC TSRMLS_DC) /* {{{ */
+static int php_zip_has_property(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
{
ze_zip_object *obj;
zval tmp_member;
- zip_prop_handler *hnd;
+ zip_prop_handler *hnd = NULL;
zend_object_handlers *std_hnd;
- int ret, retval = 0;
+ int retval = 0;
- if (member->type != IS_STRING) {
- tmp_member = *member;
- zval_copy_ctor(&tmp_member);
+ if (Z_TYPE_P(member) != IS_STRING) {
+ ZVAL_COPY(&tmp_member, member);
convert_to_string(&tmp_member);
member = &tmp_member;
-#if PHP_VERSION_ID >= 50400
- key = NULL;
-#endif
+ cache_slot = NULL;
}
- ret = FAILURE;
- obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC);
+ obj = Z_ZIP_P(object);
if (obj->prop_handler != NULL) {
-#if PHP_VERSION_ID >= 50400
- if (key) {
- ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd);
- } else
-#endif
- ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
+ hnd = zend_hash_find_ptr(obj->prop_handler, Z_STR_P(member));
}
- if (ret == SUCCESS) {
- zval *tmp;
- ALLOC_INIT_ZVAL(tmp);
+ if (hnd != NULL) {
+ zval tmp, *prop;
if (type == 2) {
retval = 1;
- } else if (php_zip_property_reader(obj, hnd, &tmp, 0 TSRMLS_CC) == SUCCESS) {
- Z_SET_REFCOUNT_P(tmp, 1);
- Z_UNSET_ISREF_P(tmp);
+ } else if ((prop = php_zip_property_reader(obj, hnd, &tmp)) != NULL) {
if (type == 1) {
-#if PHP_VERSION_ID >= 50699
- retval = zend_is_true(tmp TSRMLS_CC);
-#else
- retval = zend_is_true(tmp);
-#endif
+ retval = zend_is_true(&tmp);
} else if (type == 0) {
- retval = (Z_TYPE_P(tmp) != IS_NULL);
+ retval = (Z_TYPE(tmp) != IS_NULL);
}
}
zval_ptr_dtor(&tmp);
} else {
std_hnd = zend_get_std_object_handlers();
- retval = std_hnd->has_property(object, member, type KEY_ARG_CC TSRMLS_CC);
+ retval = std_hnd->has_property(object, member, type, cache_slot);
}
if (member == &tmp_member) {
zval_dtor(member);
}
+
return retval;
}
/* }}} */
-static HashTable *php_zip_get_properties(zval *object TSRMLS_DC)/* {{{ */
+static HashTable *php_zip_get_gc(zval *object, zval **gc_data, int *gc_data_count) /* {{{ */
+{
+ *gc_data = NULL;
+ *gc_data_count = 0;
+ return zend_std_get_properties(object);
+}
+/* }}} */
+
+static HashTable *php_zip_get_properties(zval *object)/* {{{ */
{
ze_zip_object *obj;
- zip_prop_handler *hnd;
HashTable *props;
- zval *val;
- int ret;
- char *key;
- uint key_len;
- HashPosition pos;
- ulong num_key;
+ zip_prop_handler *hnd;
+ zend_string *key;
- obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC);
- props = zend_std_get_properties(object TSRMLS_CC);
+ obj = Z_ZIP_P(object);
+ props = zend_std_get_properties(object);
if (obj->prop_handler == NULL) {
return NULL;
}
- zend_hash_internal_pointer_reset_ex(obj->prop_handler, &pos);
- while (zend_hash_get_current_data_ex(obj->prop_handler, (void**)&hnd, &pos) == SUCCESS) {
- zend_hash_get_current_key_ex(obj->prop_handler, &key, &key_len, &num_key, 0, &pos);
- MAKE_STD_ZVAL(val);
- ret = php_zip_property_reader(obj, hnd, &val, 0 TSRMLS_CC);
- if (ret != SUCCESS) {
- val = EG(uninitialized_zval_ptr);
+ ZEND_HASH_FOREACH_STR_KEY_PTR(obj->prop_handler, key, hnd) {
+ zval *ret, val;
+ ret = php_zip_property_reader(obj, hnd, &val);
+ if (ret == NULL) {
+ ret = &EG(uninitialized_zval);
}
- zend_hash_update(props, key, key_len, (void *)&val, sizeof(zval *), NULL);
- zend_hash_move_forward_ex(obj->prop_handler, &pos);
- }
+ zend_hash_update(props, key, ret);
+ } ZEND_HASH_FOREACH_END();
+
return props;
}
/* }}} */
-static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */
+static void php_zip_object_free_storage(zend_object *object) /* {{{ */
{
- ze_zip_object * intern = (ze_zip_object *) object;
+ ze_zip_object * intern = php_zip_fetch_object(object);
int i;
if (!intern) {
@@ -1087,7 +1003,7 @@ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */
}
if (intern->za) {
if (zip_close(intern->za) != 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot destroy the zip context");
+ php_error_docref(NULL, E_WARNING, "Cannot destroy the zip context: %s", zip_strerror(intern->za));
return;
}
intern->za = NULL;
@@ -1101,83 +1017,39 @@ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */
}
intern->za = NULL;
-
-#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1 && PHP_RELEASE_VERSION > 2) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5)
- zend_object_std_dtor(&intern->zo TSRMLS_CC);
-#else
- if (intern->zo.guards) {
- zend_hash_destroy(intern->zo.guards);
- FREE_HASHTABLE(intern->zo.guards);
- }
-
- if (intern->zo.properties) {
- zend_hash_destroy(intern->zo.properties);
- FREE_HASHTABLE(intern->zo.properties);
- }
-#endif
+ zend_object_std_dtor(&intern->zo);
if (intern->filename) {
efree(intern->filename);
}
- efree(intern);
}
/* }}} */
-static zend_object_value php_zip_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */
+static zend_object *php_zip_object_new(zend_class_entry *class_type) /* {{{ */
{
-#if PHP_VERSION_ID < 50400
- zval *tmp;
-#endif
ze_zip_object *intern;
- zend_object_value retval;
-
- intern = emalloc(sizeof(ze_zip_object));
- memset(&intern->zo, 0, sizeof(zend_object));
- intern->za = NULL;
- intern->buffers = NULL;
- intern->filename = NULL;
- intern->buffers_cnt = 0;
+ intern = ecalloc(1, sizeof(ze_zip_object) + zend_object_properties_size(class_type));
intern->prop_handler = &zip_prop_handlers;
-
-#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 1 && PHP_RELEASE_VERSION > 2))
- zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
-#else
- ALLOC_HASHTABLE(intern->zo.properties);
- zend_hash_init(intern->zo.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
- intern->zo.ce = class_type;
-#endif
-
-
-#if PHP_VERSION_ID < 50400
- zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,
- (void *) &tmp, sizeof(zval *));
-#else
+ zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);
-#endif
- retval.handle = zend_objects_store_put(intern,
- NULL,
- (zend_objects_free_object_storage_t) php_zip_object_free_storage,
- NULL TSRMLS_CC);
-
- retval.handlers = (zend_object_handlers *) & zip_object_handlers;
+ intern->zo.handlers = &zip_object_handlers;
- return retval;
+ return &intern->zo;
}
/* }}} */
-#endif
/* {{{ Resource dtors */
/* {{{ php_zip_free_dir */
-static void php_zip_free_dir(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+static void php_zip_free_dir(zend_resource *rsrc)
{
zip_rsrc * zip_int = (zip_rsrc *) rsrc->ptr;
if (zip_int) {
if (zip_int->za) {
if (zip_close(zip_int->za) != 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot destroy the zip context");
+ php_error_docref(NULL, E_WARNING, "Cannot destroy the zip context");
}
zip_int->za = NULL;
}
@@ -1190,7 +1062,7 @@ static void php_zip_free_dir(zend_rsrc_list_entry *rsrc TSRMLS_DC)
/* }}} */
/* {{{ php_zip_free_entry */
-static void php_zip_free_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+static void php_zip_free_entry(zend_resource *rsrc)
{
zip_read_rsrc *zr_rsrc = (zip_read_rsrc *) rsrc->ptr;
@@ -1240,26 +1112,25 @@ ZEND_GET_MODULE(zip)
Create new zip using source uri for output */
static PHP_NAMED_FUNCTION(zif_zip_open)
{
- char *filename;
- int filename_len;
char resolved_path[MAXPATHLEN + 1];
zip_rsrc *rsrc_int;
int err = 0;
+ zend_string *filename;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH, &filename, &filename_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &filename) == FAILURE) {
return;
}
- if (filename_len == 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source");
+ if (ZSTR_LEN(filename) == 0) {
+ php_error_docref(NULL, E_WARNING, "Empty string as source");
RETURN_FALSE;
}
- if (ZIP_OPENBASEDIR_CHECKPATH(filename)) {
+ if (ZIP_OPENBASEDIR_CHECKPATH(ZSTR_VAL(filename))) {
RETURN_FALSE;
}
- if(!expand_filepath(filename, resolved_path TSRMLS_CC)) {
+ if(!expand_filepath(ZSTR_VAL(filename), resolved_path)) {
RETURN_FALSE;
}
@@ -1268,13 +1139,13 @@ static PHP_NAMED_FUNCTION(zif_zip_open)
rsrc_int->za = zip_open(resolved_path, 0, &err);
if (rsrc_int->za == NULL) {
efree(rsrc_int);
- RETURN_LONG((long)err);
+ RETURN_LONG((zend_long)err);
}
rsrc_int->index_current = 0;
rsrc_int->num_files = zip_get_num_files(rsrc_int->za);
- ZEND_REGISTER_RESOURCE(return_value, rsrc_int, le_zip_dir);
+ RETURN_RES(zend_register_resource(rsrc_int, le_zip_dir));
}
/* }}} */
@@ -1285,13 +1156,16 @@ static PHP_NAMED_FUNCTION(zif_zip_close)
zval * zip;
zip_rsrc *z_rsrc = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zip) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(z_rsrc, zip_rsrc *, &zip, -1, le_zip_dir_name, le_zip_dir);
+
+ if ((z_rsrc = (zip_rsrc *)zend_fetch_resource(Z_RES_P(zip), le_zip_dir_name, le_zip_dir)) == NULL) {
+ RETURN_FALSE;
+ }
/* really close the zip will break BC :-D */
- zend_list_delete(Z_LVAL_P(zip));
+ zend_list_close(Z_RES_P(zip));
}
/* }}} */
@@ -1304,10 +1178,13 @@ static PHP_NAMED_FUNCTION(zif_zip_read)
int ret;
zip_rsrc *rsrc_int;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip_dp) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zip_dp) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(rsrc_int, zip_rsrc *, &zip_dp, -1, le_zip_dir_name, le_zip_dir);
+
+ if ((rsrc_int = (zip_rsrc *)zend_fetch_resource(Z_RES_P(zip_dp), le_zip_dir_name, le_zip_dir)) == NULL) {
+ RETURN_FALSE;
+ }
if (rsrc_int && rsrc_int->za) {
if (rsrc_int->index_current >= rsrc_int->num_files) {
@@ -1326,7 +1203,7 @@ static PHP_NAMED_FUNCTION(zif_zip_read)
zr_rsrc->zf = zip_fopen_index(rsrc_int->za, rsrc_int->index_current, 0);
if (zr_rsrc->zf) {
rsrc_int->index_current++;
- ZEND_REGISTER_RESOURCE(return_value, zr_rsrc, le_zip_entry);
+ RETURN_RES(zend_register_resource(zr_rsrc, le_zip_entry));
} else {
efree(zr_rsrc);
RETURN_FALSE;
@@ -1346,16 +1223,21 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_open)
zval * zip;
zval * zip_entry;
char *mode = NULL;
- int mode_len = 0;
+ size_t mode_len = 0;
zip_read_rsrc * zr_rsrc;
zip_rsrc *z_rsrc;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|s", &zip, &zip_entry, &mode, &mode_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|s", &zip, &zip_entry, &mode, &mode_len) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry);
- ZEND_FETCH_RESOURCE(z_rsrc, zip_rsrc *, &zip, -1, le_zip_dir_name, le_zip_dir);
+ if ((zr_rsrc = (zip_read_rsrc *)zend_fetch_resource(Z_RES_P(zip_entry), le_zip_entry_name, le_zip_entry)) == NULL) {
+ RETURN_FALSE;
+ }
+
+ if ((z_rsrc = (zip_rsrc *)zend_fetch_resource(Z_RES_P(zip), le_zip_dir_name, le_zip_dir)) == NULL) {
+ RETURN_FALSE;
+ }
if (zr_rsrc->zf != NULL) {
RETURN_TRUE;
@@ -1372,13 +1254,15 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_close)
zval * zip_entry;
zip_read_rsrc * zr_rsrc;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip_entry) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zip_entry) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry);
+ if ((zr_rsrc = (zip_read_rsrc *)zend_fetch_resource(Z_RES_P(zip_entry), le_zip_entry_name, le_zip_entry)) == NULL) {
+ RETURN_FALSE;
+ }
- RETURN_BOOL(SUCCESS == zend_list_delete(Z_LVAL_P(zip_entry)));
+ RETURN_BOOL(SUCCESS == zend_list_close(Z_RES_P(zip_entry)));
}
/* }}} */
@@ -1387,29 +1271,32 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_close)
static PHP_NAMED_FUNCTION(zif_zip_entry_read)
{
zval * zip_entry;
- long len = 0;
+ zend_long len = 0;
zip_read_rsrc * zr_rsrc;
- char *buffer;
+ zend_string *buffer;
int n = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zip_entry, &len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l", &zip_entry, &len) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry);
+ if ((zr_rsrc = (zip_read_rsrc *)zend_fetch_resource(Z_RES_P(zip_entry), le_zip_entry_name, le_zip_entry)) == NULL) {
+ RETURN_FALSE;
+ }
if (len <= 0) {
len = 1024;
}
if (zr_rsrc->zf) {
- buffer = safe_emalloc(len, 1, 1);
- n = zip_fread(zr_rsrc->zf, buffer, len);
+ buffer = zend_string_safe_alloc(1, len, 0, 0);
+ n = zip_fread(zr_rsrc->zf, ZSTR_VAL(buffer), ZSTR_LEN(buffer));
if (n > 0) {
- buffer[n] = 0;
- RETURN_STRINGL(buffer, n, 0);
+ ZSTR_VAL(buffer)[n] = '\0';
+ ZSTR_LEN(buffer) = n;
+ RETURN_NEW_STR(buffer);
} else {
- efree(buffer);
+ zend_string_free(buffer);
RETURN_EMPTY_STRING()
}
} else {
@@ -1423,11 +1310,13 @@ static void php_zip_entry_get_info(INTERNAL_FUNCTION_PARAMETERS, int opt) /* {{{
zval * zip_entry;
zip_read_rsrc * zr_rsrc;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zip_entry) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zip_entry) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(zr_rsrc, zip_read_rsrc *, &zip_entry, -1, le_zip_entry_name, le_zip_entry);
+ if ((zr_rsrc = (zip_read_rsrc *)zend_fetch_resource(Z_RES_P(zip_entry), le_zip_entry_name, le_zip_entry)) == NULL) {
+ RETURN_FALSE;
+ }
if (!zr_rsrc->zf) {
RETURN_FALSE;
@@ -1435,47 +1324,47 @@ static void php_zip_entry_get_info(INTERNAL_FUNCTION_PARAMETERS, int opt) /* {{{
switch (opt) {
case 0:
- RETURN_STRING((char *)zr_rsrc->sb.name, 1);
+ RETURN_STRING((char *)zr_rsrc->sb.name);
break;
case 1:
- RETURN_LONG((long) (zr_rsrc->sb.comp_size));
+ RETURN_LONG((zend_long) (zr_rsrc->sb.comp_size));
break;
case 2:
- RETURN_LONG((long) (zr_rsrc->sb.size));
+ RETURN_LONG((zend_long) (zr_rsrc->sb.size));
break;
case 3:
switch (zr_rsrc->sb.comp_method) {
case 0:
- RETURN_STRING("stored", 1);
+ RETURN_STRING("stored");
break;
case 1:
- RETURN_STRING("shrunk", 1);
+ RETURN_STRING("shrunk");
break;
case 2:
case 3:
case 4:
case 5:
- RETURN_STRING("reduced", 1);
+ RETURN_STRING("reduced");
break;
case 6:
- RETURN_STRING("imploded", 1);
+ RETURN_STRING("imploded");
break;
case 7:
- RETURN_STRING("tokenized", 1);
+ RETURN_STRING("tokenized");
break;
case 8:
- RETURN_STRING("deflated", 1);
+ RETURN_STRING("deflated");
break;
case 9:
- RETURN_STRING("deflatedX", 1);
+ RETURN_STRING("deflatedX");
break;
case 10:
- RETURN_STRING("implodedX", 1);
+ RETURN_STRING("implodedX");
break;
default:
RETURN_FALSE;
}
- RETURN_LONG((long) (zr_rsrc->sb.comp_method));
+ RETURN_LONG((zend_long) (zr_rsrc->sb.comp_method));
break;
}
@@ -1514,47 +1403,44 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_compressionmethod)
}
/* }}} */
-#ifdef PHP_ZIP_USE_OO
/* {{{ proto mixed ZipArchive::open(string source [, int flags])
Create new zip using source uri for output, return TRUE on success or the error code */
static ZIPARCHIVE_METHOD(open)
{
struct zip *intern;
- char *filename;
- int filename_len;
int err = 0;
- long flags = 0;
+ zend_long flags = 0;
char *resolved_path;
-
- zval *this = getThis();
+ zend_string *filename;
+ zval *self = getThis();
ze_zip_object *ze_obj = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &filename, &filename_len, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &filename, &flags) == FAILURE) {
return;
}
- if (this) {
+ if (self) {
/* We do not use ZIP_FROM_OBJECT, zip init function here */
- ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC);
+ ze_obj = Z_ZIP_P(self);
}
- if (filename_len == 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source");
+ if (ZSTR_LEN(filename) == 0) {
+ php_error_docref(NULL, E_WARNING, "Empty string as source");
RETURN_FALSE;
}
- if (ZIP_OPENBASEDIR_CHECKPATH(filename)) {
+ if (ZIP_OPENBASEDIR_CHECKPATH(ZSTR_VAL(filename))) {
RETURN_FALSE;
}
- if (!(resolved_path = expand_filepath(filename, NULL TSRMLS_CC))) {
+ if (!(resolved_path = expand_filepath(ZSTR_VAL(filename), NULL))) {
RETURN_FALSE;
}
if (ze_obj->za) {
/* we already have an opened zip, free it */
if (zip_close(ze_obj->za) != 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source");
+ php_error_docref(NULL, E_WARNING, "Empty string as source");
efree(resolved_path);
RETURN_FALSE;
}
@@ -1568,7 +1454,7 @@ static ZIPARCHIVE_METHOD(open)
intern = zip_open(resolved_path, flags, &err);
if (!intern || err) {
efree(resolved_path);
- RETURN_LONG((long)err);
+ RETURN_LONG((zend_long)err);
}
ze_obj->filename = resolved_path;
ze_obj->filename_len = strlen(resolved_path);
@@ -1582,17 +1468,17 @@ Set the password for the active archive */
static ZIPARCHIVE_METHOD(setPassword)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
char *password;
- int password_len;
+ size_t password_len;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &password, &password_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &password, &password_len) == FAILURE) {
return;
}
@@ -1614,20 +1500,20 @@ close the zip archive */
static ZIPARCHIVE_METHOD(close)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
ze_zip_object *ze_obj;
int err;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC);
+ ze_obj = Z_ZIP_P(self);
if ((err = zip_close(intern))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", zip_strerror(intern));
+ php_error_docref(NULL, E_WARNING, "%s", zip_strerror(intern));
zip_discard(intern);
}
@@ -1649,20 +1535,30 @@ static ZIPARCHIVE_METHOD(close)
static ZIPARCHIVE_METHOD(getStatusString)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
+#if LIBZIP_VERSION_MAJOR < 1
int zep, syp, len;
char error_string[128];
+#else
+ zip_error_t *err;
+#endif
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
+#if LIBZIP_VERSION_MAJOR < 1
zip_error_get(intern, &zep, &syp);
len = zip_error_to_str(error_string, 128, zep, syp);
- RETVAL_STRINGL(error_string, len, 1);
+ RETVAL_STRINGL(error_string, len);
+#else
+ err = zip_get_error(intern);
+ RETVAL_STRING(zip_error_strerror(err));
+ zip_error_fini(err);
+#endif
}
/* }}} */
@@ -1671,20 +1567,20 @@ Returns the index of the entry named filename in the archive */
static ZIPARCHIVE_METHOD(addEmptyDir)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
char *dirname;
- int dirname_len;
+ size_t dirname_len;
int idx;
struct zip_stat sb;
char *s;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s",
&dirname, &dirname_len) == FAILURE) {
return;
}
@@ -1694,7 +1590,7 @@ static ZIPARCHIVE_METHOD(addEmptyDir)
}
if (dirname[dirname_len-1] != '/') {
- s=(char *)emalloc(dirname_len+2);
+ s=(char *)safe_emalloc(dirname_len, 1, 2);
strcpy(s, dirname);
s[dirname_len] = '/';
s[dirname_len+1] = '\0';
@@ -1722,83 +1618,85 @@ static ZIPARCHIVE_METHOD(addEmptyDir)
static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
{
struct zip *intern;
- zval *this = getThis();
- char *pattern;
- char *path = NULL;
+ zval *self = getThis();
+ char *path = ".";
char *remove_path = NULL;
char *add_path = NULL;
- int pattern_len, add_path_len, remove_path_len = 0, path_len = 0;
- long remove_all_path = 0;
- long flags = 0;
+ size_t add_path_len, remove_path_len = 0, path_len = 1;
+ zend_long remove_all_path = 0;
+ zend_long flags = 0;
zval *options = NULL;
int found;
+ zend_string *pattern;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
- /* 1 == glob, 2==pcre */
+ ZIP_FROM_OBJECT(intern, self);
+ /* 1 == glob, 2 == pcre */
if (type == 1) {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|la",
- &pattern, &pattern_len, &flags, &options) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|la",
+ &pattern, &flags, &options) == FAILURE) {
return;
}
} else {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|sa",
- &pattern, &pattern_len, &path, &path_len, &options) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|sa",
+ &pattern, &path, &path_len, &options) == FAILURE) {
return;
}
}
- if (pattern_len == 0) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as pattern");
+ if (ZSTR_LEN(pattern) == 0) {
+ php_error_docref(NULL, E_NOTICE, "Empty string as pattern");
RETURN_FALSE;
}
if (options && (php_zip_parse_options(options, &remove_all_path, &remove_path, &remove_path_len,
- &add_path, &add_path_len TSRMLS_CC) < 0)) {
+ &add_path, &add_path_len) < 0)) {
RETURN_FALSE;
}
- if (remove_path && remove_path_len > 1 && (remove_path[strlen(remove_path) - 1] == '/' ||
- remove_path[strlen(remove_path) - 1] == '\\')) {
- remove_path[strlen(remove_path) - 1] = '\0';
+ if (remove_path && remove_path_len > 1) {
+ size_t real_len = strlen(remove_path);
+ if ((real_len > 1) && ((remove_path[real_len - 1] == '/') || (remove_path[real_len - 1] == '\\'))) {
+ remove_path[real_len - 1] = '\0';
+ }
}
if (type == 1) {
- found = php_zip_glob(pattern, pattern_len, flags, return_value TSRMLS_CC);
+ found = php_zip_glob(ZSTR_VAL(pattern), ZSTR_LEN(pattern), flags, return_value);
} else {
- found = php_zip_pcre(pattern, pattern_len, path, path_len, return_value TSRMLS_CC);
+ found = php_zip_pcre(pattern, path, path_len, return_value);
}
if (found > 0) {
int i;
- zval **zval_file = NULL;
+ zval *zval_file;
for (i = 0; i < found; i++) {
char *file_stripped, *entry_name;
size_t entry_name_len, file_stripped_len;
char entry_name_buf[MAXPATHLEN];
- char *basename = NULL;
+ zend_string *basename = NULL;
- if (zend_hash_index_find(Z_ARRVAL_P(return_value), i, (void **) &zval_file) == SUCCESS) {
+ if ((zval_file = zend_hash_index_find(Z_ARRVAL_P(return_value), i)) != NULL) {
if (remove_all_path) {
- php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0,
- &basename, (size_t *)&file_stripped_len TSRMLS_CC);
- file_stripped = basename;
- } else if (remove_path && strstr(Z_STRVAL_PP(zval_file), remove_path) != NULL) {
- file_stripped = Z_STRVAL_PP(zval_file) + remove_path_len + 1;
- file_stripped_len = Z_STRLEN_PP(zval_file) - remove_path_len - 1;
+ basename = php_basename(Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file), NULL, 0);
+ file_stripped = ZSTR_VAL(basename);
+ file_stripped_len = ZSTR_LEN(basename);
+ } else if (remove_path && strstr(Z_STRVAL_P(zval_file), remove_path) != NULL) {
+ file_stripped = Z_STRVAL_P(zval_file) + remove_path_len + 1;
+ file_stripped_len = Z_STRLEN_P(zval_file) - remove_path_len - 1;
} else {
- file_stripped = Z_STRVAL_PP(zval_file);
- file_stripped_len = Z_STRLEN_PP(zval_file);
+ file_stripped = Z_STRVAL_P(zval_file);
+ file_stripped_len = Z_STRLEN_P(zval_file);
}
if (add_path) {
if ((add_path_len + file_stripped_len) > MAXPATHLEN) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Entry name too long (max: %d, %ld given)",
+ php_error_docref(NULL, E_WARNING, "Entry name too long (max: %d, %pd given)",
MAXPATHLEN - 1, (add_path_len + file_stripped_len));
- zval_dtor(return_value);
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
}
@@ -1806,15 +1704,15 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
entry_name = entry_name_buf;
entry_name_len = strlen(entry_name);
} else {
- entry_name = Z_STRVAL_PP(zval_file);
- entry_name_len = Z_STRLEN_PP(zval_file);
+ entry_name = file_stripped;
+ entry_name_len = file_stripped_len;
}
if (basename) {
- efree(basename);
+ zend_string_release(basename);
basename = NULL;
}
- if (php_zip_add_file(intern, Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file),
- entry_name, entry_name_len, 0, 0 TSRMLS_CC) < 0) {
+ if (php_zip_add_file(intern, Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file),
+ entry_name, entry_name_len, 0, 0) < 0) {
zval_dtor(return_value);
RETURN_FALSE;
}
@@ -1845,36 +1743,34 @@ Add a file in a Zip archive using its path and the name to use. */
static ZIPARCHIVE_METHOD(addFile)
{
struct zip *intern;
- zval *this = getThis();
- char *filename;
- int filename_len;
+ zval *self = getThis();
char *entry_name = NULL;
- int entry_name_len = 0;
- long offset_start = 0, offset_len = 0;
+ size_t entry_name_len = 0;
+ zend_long offset_start = 0, offset_len = 0;
+ zend_string *filename;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|sll",
- &filename, &filename_len, &entry_name, &entry_name_len, &offset_start, &offset_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|sll",
+ &filename, &entry_name, &entry_name_len, &offset_start, &offset_len) == FAILURE) {
return;
}
- if (filename_len == 0) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as filename");
+ if (ZSTR_LEN(filename) == 0) {
+ php_error_docref(NULL, E_NOTICE, "Empty string as filename");
RETURN_FALSE;
}
if (entry_name_len == 0) {
- entry_name = filename;
- entry_name_len = filename_len;
+ entry_name = ZSTR_VAL(filename);
+ entry_name_len = ZSTR_LEN(filename);
}
- if (php_zip_add_file(intern, filename, filename_len,
- entry_name, entry_name_len, 0, 0 TSRMLS_CC) < 0) {
+ if (php_zip_add_file(intern, ZSTR_VAL(filename), ZSTR_LEN(filename), entry_name, entry_name_len, 0, 0) < 0) {
RETURN_FALSE;
} else {
RETURN_TRUE;
@@ -1887,38 +1783,39 @@ Add a file using content and the entry name */
static ZIPARCHIVE_METHOD(addFromString)
{
struct zip *intern;
- zval *this = getThis();
- char *buffer, *name;
- int buffer_len, name_len;
+ zval *self = getThis();
+ zend_string *buffer;
+ char *name;
+ size_t name_len;
ze_zip_object *ze_obj;
struct zip_source *zs;
int pos = 0;
int cur_idx;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
- &name, &name_len, &buffer, &buffer_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sS",
+ &name, &name_len, &buffer) == FAILURE) {
return;
}
- ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC);
+ ze_obj = Z_ZIP_P(self);
if (ze_obj->buffers_cnt) {
- ze_obj->buffers = (char **)erealloc(ze_obj->buffers, sizeof(char *) * (ze_obj->buffers_cnt+1));
+ ze_obj->buffers = (char **)safe_erealloc(ze_obj->buffers, sizeof(char *), (ze_obj->buffers_cnt+1), 0);
pos = ze_obj->buffers_cnt++;
} else {
ze_obj->buffers = (char **)emalloc(sizeof(char *));
ze_obj->buffers_cnt++;
pos = 0;
}
- ze_obj->buffers[pos] = (char *)emalloc(buffer_len + 1);
- memcpy(ze_obj->buffers[pos], buffer, buffer_len + 1);
+ ze_obj->buffers[pos] = (char *)safe_emalloc(ZSTR_LEN(buffer), 1, 1);
+ memcpy(ze_obj->buffers[pos], ZSTR_VAL(buffer), ZSTR_LEN(buffer) + 1);
- zs = zip_source_buffer(intern, ze_obj->buffers[pos], buffer_len, 0);
+ zs = zip_source_buffer(intern, ze_obj->buffers[pos], ZSTR_LEN(buffer), 0);
if (zs == NULL) {
RETURN_FALSE;
@@ -1948,24 +1845,22 @@ Returns the information about a the zip entry filename */
static ZIPARCHIVE_METHOD(statName)
{
struct zip *intern;
- zval *this = getThis();
- char *name;
- int name_len;
- long flags = 0;
+ zval *self = getThis();
+ zend_long flags = 0;
struct zip_stat sb;
+ zend_string *name;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l",
- &name, &name_len, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &name, &flags) == FAILURE) {
return;
}
- PHP_ZIP_STAT_PATH(intern, name, name_len, flags, sb);
+ PHP_ZIP_STAT_PATH(intern, ZSTR_VAL(name), ZSTR_LEN(name), flags, sb);
RETURN_SB(&sb);
}
@@ -1976,18 +1871,18 @@ Returns the zip entry informations using its index */
static ZIPARCHIVE_METHOD(statIndex)
{
struct zip *intern;
- zval *this = getThis();
- long index, flags = 0;
+ zval *self = getThis();
+ zend_long index, flags = 0;
struct zip_stat sb;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l",
&index, &flags) == FAILURE) {
return;
}
@@ -2004,27 +1899,26 @@ Returns the index of the entry named filename in the archive */
static ZIPARCHIVE_METHOD(locateName)
{
struct zip *intern;
- zval *this = getThis();
- char *name;
- int name_len;
- long flags = 0;
- long idx = -1;
+ zval *self = getThis();
+ zend_long flags = 0;
+ zend_long idx = -1;
+ zend_string *name;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l",
- &name, &name_len, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &name, &flags) == FAILURE) {
return;
}
- if (name_len<1) {
+
+ if (ZSTR_LEN(name) < 1) {
RETURN_FALSE;
}
- idx = (long)zip_name_locate(intern, (const char *)name, flags);
+ idx = (zend_long)zip_name_locate(intern, (const char *)ZSTR_VAL(name), flags);
if (idx >= 0) {
RETURN_LONG(idx);
@@ -2039,17 +1933,17 @@ Returns the name of the file at position index */
static ZIPARCHIVE_METHOD(getNameIndex)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
const char *name;
- long flags = 0, index = 0;
+ zend_long flags = 0, index = 0;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l",
&index, &flags) == FAILURE) {
return;
}
@@ -2057,7 +1951,7 @@ static ZIPARCHIVE_METHOD(getNameIndex)
name = zip_get_name(intern, (int) index, flags);
if (name) {
- RETVAL_STRING((char *)name, 1);
+ RETVAL_STRING((char *)name);
} else {
RETURN_FALSE;
}
@@ -2069,17 +1963,17 @@ Set or remove (NULL/'') the comment of the archive */
static ZIPARCHIVE_METHOD(setArchiveComment)
{
struct zip *intern;
- zval *this = getThis();
- int comment_len;
+ zval *self = getThis();
+ size_t comment_len;
char * comment;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &comment, &comment_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &comment, &comment_len) == FAILURE) {
return;
}
if (zip_set_archive_comment(intern, (const char *)comment, (int)comment_len)) {
@@ -2095,18 +1989,18 @@ Returns the comment of an entry using its index */
static ZIPARCHIVE_METHOD(getArchiveComment)
{
struct zip *intern;
- zval *this = getThis();
- long flags = 0;
+ zval *self = getThis();
+ zend_long flags = 0;
const char * comment;
int comment_len = 0;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &flags) == FAILURE) {
return;
}
@@ -2114,7 +2008,7 @@ static ZIPARCHIVE_METHOD(getArchiveComment)
if(comment==NULL) {
RETURN_FALSE;
}
- RETURN_STRINGL((char *)comment, (long)comment_len, 1);
+ RETURN_STRINGL((char *)comment, (zend_long)comment_len);
}
/* }}} */
@@ -2123,24 +2017,24 @@ Set or remove (NULL/'') the comment of an entry using its Name */
static ZIPARCHIVE_METHOD(setCommentName)
{
struct zip *intern;
- zval *this = getThis();
- int comment_len, name_len;
+ zval *self = getThis();
+ size_t comment_len, name_len;
char * comment, *name;
int idx;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss",
&name, &name_len, &comment, &comment_len) == FAILURE) {
return;
}
if (name_len < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as entry name");
+ php_error_docref(NULL, E_NOTICE, "Empty string as entry name");
}
idx = zip_name_locate(intern, name, 0);
@@ -2156,19 +2050,19 @@ Set or remove (NULL/'') the comment of an entry using its index */
static ZIPARCHIVE_METHOD(setCommentIndex)
{
struct zip *intern;
- zval *this = getThis();
- long index;
- int comment_len;
+ zval *self = getThis();
+ zend_long index;
+ size_t comment_len;
char * comment;
struct zip_stat sb;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls",
&index, &comment, &comment_len) == FAILURE) {
return;
}
@@ -2186,25 +2080,25 @@ Set external attributes for file in zip, using its name */
static ZIPARCHIVE_METHOD(setExternalAttributesName)
{
struct zip *intern;
- zval *this = getThis();
- int name_len;
+ zval *self = getThis();
+ size_t name_len;
char *name;
- long flags=0, opsys, attr;
+ zend_long flags=0, opsys, attr;
zip_int64_t idx;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sll|l",
&name, &name_len, &opsys, &attr, &flags) == FAILURE) {
return;
}
if (name_len < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as entry name");
+ php_error_docref(NULL, E_NOTICE, "Empty string as entry name");
}
idx = zip_name_locate(intern, name, 0);
@@ -2224,17 +2118,17 @@ Set external attributes for file in zip, using its index */
static ZIPARCHIVE_METHOD(setExternalAttributesIndex)
{
struct zip *intern;
- zval *this = getThis();
- long index, flags=0, opsys, attr;
+ zval *self = getThis();
+ zend_long index, flags=0, opsys, attr;
struct zip_stat sb;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lll|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll|l",
&index, &opsys, &attr, &flags) == FAILURE) {
return;
}
@@ -2253,27 +2147,27 @@ Get external attributes for file in zip, using its name */
static ZIPARCHIVE_METHOD(getExternalAttributesName)
{
struct zip *intern;
- zval *this = getThis(), *z_opsys, *z_attr;
- int name_len;
+ zval *self = getThis(), *z_opsys, *z_attr;
+ size_t name_len;
char *name;
- long flags=0;
+ zend_long flags=0;
zip_uint8_t opsys;
zip_uint32_t attr;
zip_int64_t idx;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szz|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/|l",
&name, &name_len, &z_opsys, &z_attr, &flags) == FAILURE) {
return;
}
if (name_len < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as entry name");
+ php_error_docref(NULL, E_NOTICE, "Empty string as entry name");
}
idx = zip_name_locate(intern, name, 0);
@@ -2284,9 +2178,9 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName)
(zip_flags_t)flags, &opsys, &attr) < 0) {
RETURN_FALSE;
}
- zval_dtor(z_opsys);
+ zval_ptr_dtor(z_opsys);
ZVAL_LONG(z_opsys, opsys);
- zval_dtor(z_attr);
+ zval_ptr_dtor(z_attr);
ZVAL_LONG(z_attr, attr);
RETURN_TRUE;
}
@@ -2297,19 +2191,19 @@ Get external attributes for file in zip, using its index */
static ZIPARCHIVE_METHOD(getExternalAttributesIndex)
{
struct zip *intern;
- zval *this = getThis(), *z_opsys, *z_attr;
- long index, flags=0;
+ zval *self = getThis(), *z_opsys, *z_attr;
+ zend_long index, flags=0;
zip_uint8_t opsys;
zip_uint32_t attr;
struct zip_stat sb;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lzz|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/z/|l",
&index, &z_opsys, &z_attr, &flags) == FAILURE) {
return;
}
@@ -2333,25 +2227,26 @@ Returns the comment of an entry using its name */
static ZIPARCHIVE_METHOD(getCommentName)
{
struct zip *intern;
- zval *this = getThis();
- int name_len, idx;
- long flags = 0;
+ zval *self = getThis();
+ size_t name_len;
+ int idx;
+ zend_long flags = 0;
int comment_len = 0;
const char * comment;
char *name;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l",
&name, &name_len, &flags) == FAILURE) {
return;
}
if (name_len < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as entry name");
+ php_error_docref(NULL, E_NOTICE, "Empty string as entry name");
RETURN_FALSE;
}
@@ -2361,7 +2256,7 @@ static ZIPARCHIVE_METHOD(getCommentName)
}
comment = zip_get_file_comment(intern, idx, &comment_len, (int)flags);
- RETURN_STRINGL((char *)comment, (long)comment_len, 1);
+ RETURN_STRINGL((char *)comment, (zend_long)comment_len);
}
/* }}} */
@@ -2370,36 +2265,76 @@ Returns the comment of an entry using its index */
static ZIPARCHIVE_METHOD(getCommentIndex)
{
struct zip *intern;
- zval *this = getThis();
- long index, flags = 0;
+ zval *self = getThis();
+ zend_long index, flags = 0;
const char * comment;
int comment_len = 0;
struct zip_stat sb;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l",
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l",
&index, &flags) == FAILURE) {
return;
}
PHP_ZIP_STAT_INDEX(intern, index, 0, sb);
comment = zip_get_file_comment(intern, index, &comment_len, (int)flags);
- RETURN_STRINGL((char *)comment, (long)comment_len, 1);
+ RETURN_STRINGL((char *)comment, (zend_long)comment_len);
}
/* }}} */
-/* {{{ proto bool ZipArchive::deleteIndex(int index)
-Delete a file using its index */
-static ZIPARCHIVE_METHOD(deleteIndex)
+/* {{{ proto bool ZipArchive::setCompressionName(string name, int comp_method[, int comp_flags])
+Set the compression of a file in zip, using its name */
+static ZIPARCHIVE_METHOD(setCompressionName)
+ {
+ struct zip *intern;
+ zval *this = getThis();
+ size_t name_len;
+ char *name;
+ zip_int64_t idx;
+ zend_long comp_method, comp_flags = 0;
+
+ if (!this) {
+ RETURN_FALSE;
+ }
+
+ ZIP_FROM_OBJECT(intern, this);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|l",
+ &name, &name_len, &comp_method, &comp_flags) == FAILURE) {
+ return;
+ }
+
+ if (name_len < 1) {
+ php_error_docref(NULL, E_NOTICE, "Empty string as entry name");
+ }
+
+ idx = zip_name_locate(intern, name, 0);
+ if (idx < 0) {
+ RETURN_FALSE;
+ }
+
+ if (zip_set_file_compression(intern, (zip_uint64_t)idx,
+ (zip_int32_t)comp_method, (zip_uint32_t)comp_flags) != 0) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool ZipArchive::setCompressionIndex(int index, int comp_method[, int comp_flags])
+Set the compression of a file in zip, using its index */
+static ZIPARCHIVE_METHOD(setCompressionIndex)
{
struct zip *intern;
zval *this = getThis();
- long index;
+ zend_long index;
+ zend_long comp_method, comp_flags = 0;
if (!this) {
RETURN_FALSE;
@@ -2407,7 +2342,34 @@ static ZIPARCHIVE_METHOD(deleteIndex)
ZIP_FROM_OBJECT(intern, this);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll|l",
+ &index, &comp_method, &comp_flags) == FAILURE) {
+ return;
+ }
+
+ if (zip_set_file_compression(intern, (zip_uint64_t)index,
+ (zip_int32_t)comp_method, (zip_uint32_t)comp_flags) != 0) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool ZipArchive::deleteIndex(int index)
+Delete a file using its index */
+static ZIPARCHIVE_METHOD(deleteIndex)
+{
+ struct zip *intern;
+ zval *self = getThis();
+ zend_long index;
+
+ if (!self) {
+ RETURN_FALSE;
+ }
+
+ ZIP_FROM_OBJECT(intern, self);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &index) == FAILURE) {
return;
}
@@ -2428,18 +2390,18 @@ Delete a file using its index */
static ZIPARCHIVE_METHOD(deleteName)
{
struct zip *intern;
- zval *this = getThis();
- int name_len;
+ zval *self = getThis();
+ size_t name_len;
char *name;
struct zip_stat sb;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
return;
}
if (name_len < 1) {
@@ -2459,19 +2421,19 @@ Rename an entry selected by its index to new_name */
static ZIPARCHIVE_METHOD(renameIndex)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
char *new_name;
- int new_name_len;
- long index;
+ size_t new_name_len;
+ zend_long index;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &index, &new_name, &new_name_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &index, &new_name, &new_name_len) == FAILURE) {
return;
}
@@ -2480,7 +2442,7 @@ static ZIPARCHIVE_METHOD(renameIndex)
}
if (new_name_len < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as new entry name");
+ php_error_docref(NULL, E_NOTICE, "Empty string as new entry name");
RETURN_FALSE;
}
if (zip_rename(intern, index, (const char *)new_name) != 0) {
@@ -2495,23 +2457,23 @@ Rename an entry selected by its name to new_name */
static ZIPARCHIVE_METHOD(renameName)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
struct zip_stat sb;
char *name, *new_name;
- int name_len, new_name_len;
+ size_t name_len, new_name_len;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &new_name, &new_name_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name, &name_len, &new_name, &new_name_len) == FAILURE) {
return;
}
if (new_name_len < 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Empty string as new entry name");
+ php_error_docref(NULL, E_NOTICE, "Empty string as new entry name");
RETURN_FALSE;
}
@@ -2529,16 +2491,16 @@ Changes to the file at position index are reverted */
static ZIPARCHIVE_METHOD(unchangeIndex)
{
struct zip *intern;
- zval *this = getThis();
- long index;
+ zval *self = getThis();
+ zend_long index;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &index) == FAILURE) {
return;
}
@@ -2559,18 +2521,18 @@ Changes to the file named 'name' are reverted */
static ZIPARCHIVE_METHOD(unchangeName)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
struct zip_stat sb;
char *name;
- int name_len;
+ size_t name_len;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
return;
}
@@ -2593,13 +2555,13 @@ All changes to files and global information in archive are reverted */
static ZIPARCHIVE_METHOD(unchangeAll)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
if (zip_unchange_all(intern) != 0) {
RETURN_FALSE;
@@ -2614,13 +2576,13 @@ Revert all global changes to the archive archive. For now, this only reverts ar
static ZIPARCHIVE_METHOD(unchangeArchive)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
if (zip_unchange_archive(intern) != 0) {
RETURN_FALSE;
@@ -2641,21 +2603,21 @@ static ZIPARCHIVE_METHOD(extractTo)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
zval *zval_files = NULL;
- zval **zval_file = NULL;
+ zval *zval_file = NULL;
php_stream_statbuf ssb;
char *pathto;
- int pathto_len;
+ size_t pathto_len;
int ret, i;
int nelems;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &pathto, &pathto_len, &zval_files) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &pathto, &pathto_len, &zval_files) == FAILURE) {
return;
}
@@ -2670,11 +2632,11 @@ static ZIPARCHIVE_METHOD(extractTo)
}
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
if (zval_files && (Z_TYPE_P(zval_files) != IS_NULL)) {
switch (Z_TYPE_P(zval_files)) {
case IS_STRING:
- if (!php_zip_extract_file(intern, pathto, Z_STRVAL_P(zval_files), Z_STRLEN_P(zval_files) TSRMLS_CC)) {
+ if (!php_zip_extract_file(intern, pathto, Z_STRVAL_P(zval_files), Z_STRLEN_P(zval_files))) {
RETURN_FALSE;
}
break;
@@ -2684,12 +2646,12 @@ static ZIPARCHIVE_METHOD(extractTo)
RETURN_FALSE;
}
for (i = 0; i < nelems; i++) {
- if (zend_hash_index_find(Z_ARRVAL_P(zval_files), i, (void **) &zval_file) == SUCCESS) {
- switch (Z_TYPE_PP(zval_file)) {
+ if ((zval_file = zend_hash_index_find(Z_ARRVAL_P(zval_files), i)) != NULL) {
+ switch (Z_TYPE_P(zval_file)) {
case IS_LONG:
break;
case IS_STRING:
- if (!php_zip_extract_file(intern, pathto, Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file) TSRMLS_CC)) {
+ if (!php_zip_extract_file(intern, pathto, Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file))) {
RETURN_FALSE;
}
break;
@@ -2699,7 +2661,7 @@ static ZIPARCHIVE_METHOD(extractTo)
break;
case IS_LONG:
default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument, expect string or array of strings");
+ php_error_docref(NULL, E_WARNING, "Invalid argument, expect string or array of strings");
break;
}
} else {
@@ -2707,13 +2669,13 @@ static ZIPARCHIVE_METHOD(extractTo)
int filecount = zip_get_num_files(intern);
if (filecount == -1) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal archive");
+ php_error_docref(NULL, E_WARNING, "Illegal archive");
RETURN_FALSE;
}
for (i = 0; i < filecount; i++) {
char *file = (char*)zip_get_name(intern, i, ZIP_FL_UNCHANGED);
- if (!php_zip_extract_file(intern, pathto, file, strlen(file) TSRMLS_CC)) {
+ if (!file || !php_zip_extract_file(intern, pathto, file, strlen(file))) {
RETURN_FALSE;
}
}
@@ -2725,33 +2687,33 @@ static ZIPARCHIVE_METHOD(extractTo)
static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
struct zip_stat sb;
struct zip_file *zf;
- char *filename;
- int filename_len;
- long index = -1;
- long flags = 0;
- long len = 0;
+ zend_long index = -1;
+ zend_long flags = 0;
+ zend_long len = 0;
+
+ zend_string *filename;
+ zend_string *buffer;
- char *buffer;
int n = 0;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
if (type == 1) {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|ll", &filename, &filename_len, &len, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ll", &filename, &len, &flags) == FAILURE) {
return;
}
- PHP_ZIP_STAT_PATH(intern, filename, filename_len, flags, sb);
+ PHP_ZIP_STAT_PATH(intern, ZSTR_VAL(filename), ZSTR_LEN(filename), flags, sb);
} else {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ll", &index, &len, &flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|ll", &index, &len, &flags) == FAILURE) {
return;
}
PHP_ZIP_STAT_INDEX(intern, index, 0, sb);
@@ -2767,23 +2729,24 @@ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
if (index >= 0) {
zf = zip_fopen_index(intern, index, flags);
} else {
- zf = zip_fopen(intern, filename, flags);
+ zf = zip_fopen(intern, ZSTR_VAL(filename), flags);
}
if (zf == NULL) {
RETURN_FALSE;
}
- buffer = safe_emalloc(len, 1, 2);
- n = zip_fread(zf, buffer, len);
+ buffer = zend_string_safe_alloc(1, len, 0, 0);
+ n = zip_fread(zf, ZSTR_VAL(buffer), ZSTR_LEN(buffer));
if (n < 1) {
- efree(buffer);
+ zend_string_free(buffer);
RETURN_EMPTY_STRING();
}
zip_fclose(zf);
- buffer[n] = 0;
- RETURN_STRINGL(buffer, n, 0);
+ ZSTR_VAL(buffer)[n] = '\0';
+ ZSTR_LEN(buffer) = n;
+ RETURN_NEW_STR(buffer);
}
/* }}} */
@@ -2808,33 +2771,34 @@ get a stream for an entry using its name */
static ZIPARCHIVE_METHOD(getStream)
{
struct zip *intern;
- zval *this = getThis();
+ zval *self = getThis();
struct zip_stat sb;
- char *filename;
- int filename_len;
char *mode = "rb";
+ zend_string *filename;
php_stream *stream;
ze_zip_object *obj;
- if (!this) {
+ if (!self) {
RETURN_FALSE;
}
- ZIP_FROM_OBJECT(intern, this);
+ ZIP_FROM_OBJECT(intern, self);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH, &filename, &filename_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &filename) == FAILURE) {
return;
}
- if (zip_stat(intern, filename, 0, &sb) != 0) {
+ if (zip_stat(intern, ZSTR_VAL(filename), 0, &sb) != 0) {
RETURN_FALSE;
}
- obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC);
+ obj = Z_ZIP_P(self);
- stream = php_stream_zip_open(obj->filename, filename, mode STREAMS_CC TSRMLS_CC);
+ stream = php_stream_zip_open(obj->filename, ZSTR_VAL(filename), mode STREAMS_CC);
if (stream) {
php_stream_to_zval(stream, return_value);
+ } else {
+ RETURN_FALSE;
}
}
/* }}} */
@@ -2988,6 +2952,18 @@ ZEND_END_ARG_INFO()
#endif /* ifdef ZIP_OPSYS_DEFAULT */
/* }}} */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setcompname, 0, 0, 2)
+ ZEND_ARG_INFO(0, name)
+ ZEND_ARG_INFO(0, method)
+ ZEND_ARG_INFO(0, compflags)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setcompindex, 0, 0, 2)
+ ZEND_ARG_INFO(0, index)
+ ZEND_ARG_INFO(0, method)
+ ZEND_ARG_INFO(0, compflags)
+ZEND_END_ARG_INFO()
+
/* {{{ ze_zip_object_class_functions */
static const zend_function_entry zip_class_functions[] = {
ZIPARCHIVE_ME(open, arginfo_ziparchive_open, ZEND_ACC_PUBLIC)
@@ -3025,35 +3001,42 @@ static const zend_function_entry zip_class_functions[] = {
ZIPARCHIVE_ME(setExternalAttributesIndex, arginfo_ziparchive_setextattrindex, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(getExternalAttributesName, arginfo_ziparchive_getextattrname, ZEND_ACC_PUBLIC)
ZIPARCHIVE_ME(getExternalAttributesIndex, arginfo_ziparchive_getextattrindex, ZEND_ACC_PUBLIC)
+ ZIPARCHIVE_ME(setCompressionName, arginfo_ziparchive_setcompname, ZEND_ACC_PUBLIC)
+ ZIPARCHIVE_ME(setCompressionIndex, arginfo_ziparchive_setcompindex, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
/* }}} */
-#endif
+
+static void php_zip_free_prop_handler(zval *el) /* {{{ */ {
+ pefree(Z_PTR_P(el), 1);
+} /* }}} */
/* {{{ PHP_MINIT_FUNCTION */
static PHP_MINIT_FUNCTION(zip)
{
-#ifdef PHP_ZIP_USE_OO
zend_class_entry ce;
memcpy(&zip_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
- zip_object_handlers.clone_obj = NULL;
+ zip_object_handlers.offset = XtOffsetOf(ze_zip_object, zo);
+ zip_object_handlers.free_obj = php_zip_object_free_storage;
+ zip_object_handlers.clone_obj = NULL;
zip_object_handlers.get_property_ptr_ptr = php_zip_get_property_ptr_ptr;
+ zip_object_handlers.get_gc = php_zip_get_gc;
zip_object_handlers.get_properties = php_zip_get_properties;
zip_object_handlers.read_property = php_zip_read_property;
zip_object_handlers.has_property = php_zip_has_property;
INIT_CLASS_ENTRY(ce, "ZipArchive", zip_class_functions);
ce.create_object = php_zip_object_new;
- zip_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
+ zip_class_entry = zend_register_internal_class(&ce);
- zend_hash_init(&zip_prop_handlers, 0, NULL, NULL, 1);
- php_zip_register_prop_handler(&zip_prop_handlers, "status", php_zip_status, NULL, NULL, IS_LONG TSRMLS_CC);
- php_zip_register_prop_handler(&zip_prop_handlers, "statusSys", php_zip_status_sys, NULL, NULL, IS_LONG TSRMLS_CC);
- php_zip_register_prop_handler(&zip_prop_handlers, "numFiles", php_zip_get_num_files, NULL, NULL, IS_LONG TSRMLS_CC);
- php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, NULL, php_zipobj_get_filename, IS_STRING TSRMLS_CC);
- php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, NULL, IS_STRING TSRMLS_CC);
+ zend_hash_init(&zip_prop_handlers, 0, NULL, php_zip_free_prop_handler, 1);
+ php_zip_register_prop_handler(&zip_prop_handlers, "status", php_zip_status, NULL, NULL, IS_LONG);
+ php_zip_register_prop_handler(&zip_prop_handlers, "statusSys", php_zip_status_sys, NULL, NULL, IS_LONG);
+ php_zip_register_prop_handler(&zip_prop_handlers, "numFiles", php_zip_get_num_files, NULL, NULL, IS_LONG);
+ php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, NULL, php_zipobj_get_filename, IS_STRING);
+ php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, NULL, IS_STRING);
REGISTER_ZIP_CLASS_CONST_LONG("CREATE", ZIP_CREATE);
REGISTER_ZIP_CLASS_CONST_LONG("EXCL", ZIP_EXCL);
@@ -3064,6 +3047,24 @@ static PHP_MINIT_FUNCTION(zip)
REGISTER_ZIP_CLASS_CONST_LONG("FL_NODIR", ZIP_FL_NODIR);
REGISTER_ZIP_CLASS_CONST_LONG("FL_COMPRESSED", ZIP_FL_COMPRESSED);
REGISTER_ZIP_CLASS_CONST_LONG("FL_UNCHANGED", ZIP_FL_UNCHANGED);
+
+#ifdef ZIP_FL_ENC_GUESS
+ /* Default filename encoding policy. */
+ REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_GUESS", ZIP_FL_ENC_GUESS);
+#endif
+#ifdef ZIP_FL_ENC_RAW
+ REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_RAW", ZIP_FL_ENC_RAW);
+#endif
+#ifdef ZIP_FL_ENC_STRICT
+ REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_STRICT", ZIP_FL_ENC_STRICT);
+#endif
+#ifdef ZIP_FL_ENC_UTF_8
+ REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_UTF_8", ZIP_FL_ENC_UTF_8);
+#endif
+#ifdef ZIP_FL_ENC_CP437
+ REGISTER_ZIP_CLASS_CONST_LONG("FL_ENC_CP437", ZIP_FL_ENC_CP437);
+#endif
+
REGISTER_ZIP_CLASS_CONST_LONG("CM_DEFAULT", ZIP_CM_DEFAULT);
REGISTER_ZIP_CLASS_CONST_LONG("CM_STORE", ZIP_CM_STORE);
REGISTER_ZIP_CLASS_CONST_LONG("CM_SHRINK", ZIP_CM_SHRINK);
@@ -3133,8 +3134,7 @@ static PHP_MINIT_FUNCTION(zip)
REGISTER_ZIP_CLASS_CONST_LONG("OPSYS_DEFAULT", ZIP_OPSYS_DEFAULT);
#endif /* ifdef ZIP_OPSYS_DEFAULT */
- php_register_url_stream_wrapper("zip", &php_stream_zip_wrapper TSRMLS_CC);
-#endif /* ifdef PHP_ZIP_USE_OO */
+ php_register_url_stream_wrapper("zip", &php_stream_zip_wrapper);
le_zip_dir = zend_register_list_destructors_ex(php_zip_free_dir, NULL, le_zip_dir_name, module_number);
le_zip_entry = zend_register_list_destructors_ex(php_zip_free_entry, NULL, le_zip_entry_name, module_number);
@@ -3147,10 +3147,8 @@ static PHP_MINIT_FUNCTION(zip)
*/
static PHP_MSHUTDOWN_FUNCTION(zip)
{
-#ifdef PHP_ZIP_USE_OO
zend_hash_destroy(&zip_prop_handlers);
- php_unregister_url_stream_wrapper("zip" TSRMLS_CC);
-#endif
+ php_unregister_url_stream_wrapper("zip");
return SUCCESS;
}
/* }}} */
@@ -3162,7 +3160,6 @@ static PHP_MINFO_FUNCTION(zip)
php_info_print_table_start();
php_info_print_table_row(2, "Zip", "enabled");
- php_info_print_table_row(2, "Extension Version","$Id$");
php_info_print_table_row(2, "Zip version", PHP_ZIP_VERSION);
php_info_print_table_row(2, "Libzip version", LIBZIP_VERSION);