]>
Commit | Line | Data |
---|---|---|
cfbe30dd ER |
1 | diff --git a/API.txt b/API.txt |
2 | index b2c690e..6895062 100644 | |
3 | --- a/API.txt | |
4 | +++ b/API.txt | |
5 | @@ -31,7 +31,8 @@ Classes: | |
6 | ||
7 | class ArchiveReader { | |
8 | /** | |
9 | - * ArchiveReader __construct (string filename[, int format[, int compression]]) | |
10 | + * ArchiveReader __construct (string filename[, int format[, int | |
11 | + * compression [, int block_size]]]) | |
12 | * | |
13 | * You need to specify format & compression params *only* if you need | |
14 | * to support only these particular formats/compressions. | |
15 | diff --git a/archive.c b/archive.c | |
16 | index 045adfc..6239edd 100644 | |
17 | --- a/archive.c | |
18 | +++ b/archive.c | |
19 | @@ -12,7 +12,7 @@ | |
20 | | obtain it through the world-wide-web, please send a note to | | |
21 | | license@php.net so we can mail you a copy immediately. | | |
22 | +----------------------------------------------------------------------+ | |
23 | - | Author: Antony Dovgal <antony@zend.com> | | |
24 | + | Author: Antony Dovgal <tony2001@php.net> | | |
25 | +----------------------------------------------------------------------+ | |
26 | */ | |
27 | ||
28 | @@ -33,11 +33,15 @@ | |
29 | #include "archive_clbk.h" | |
30 | #include "php_archive_entry.h" | |
31 | ||
32 | +#if (PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION < 2) | |
33 | #define archive_ce_Exception zend_exception_get_default() | |
34 | +#else | |
35 | +#define archive_ce_Exception zend_exception_get_default(TSRMLS_C) | |
36 | +#endif | |
37 | ||
38 | /* {{{ archive_functions[] | |
39 | */ | |
40 | -function_entry archive_functions[] = { | |
41 | +zend_function_entry archive_functions[] = { | |
42 | {NULL, NULL, NULL} | |
43 | }; | |
44 | /* }}} */ | |
45 | @@ -56,7 +60,7 @@ zend_module_entry archive_module_entry = { | |
46 | NULL, /* here */ | |
47 | PHP_MINFO(archive), | |
48 | #if ZEND_MODULE_API_NO >= 20010901 | |
49 | - "0.1", | |
50 | + PHP_ARCHIVE_VERSION, | |
51 | #endif | |
52 | STANDARD_MODULE_PROPERTIES | |
53 | }; | |
54 | @@ -65,9 +69,9 @@ zend_module_entry archive_module_entry = { | |
55 | #ifdef COMPILE_DL_ARCHIVE | |
56 | ZEND_GET_MODULE(archive) | |
57 | #endif | |
58 | - | |
59 | + | |
60 | static void _archive_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC); | |
61 | - | |
62 | + | |
63 | /* {{{ _archive_entries_hash_dtor | |
64 | */ | |
65 | void _archive_entries_hash_dtor(void *data) | |
66 | @@ -83,20 +87,20 @@ void _archive_entries_hash_dtor(void *data) | |
67 | */ | |
68 | static void _archive_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) | |
69 | { | |
70 | - archive_file_t *arch = (archive_file_t *)rsrc->ptr; | |
71 | + archive_file_t *arch = (archive_file_t *)rsrc->ptr; | |
72 | ||
73 | if (arch->mode == PHP_ARCHIVE_READ_MODE) { | |
74 | - archive_read_finish(arch->arch); | |
75 | + archive_read_free(arch->arch); | |
76 | } | |
77 | else if (arch->mode == PHP_ARCHIVE_WRITE_MODE) { | |
78 | archive_write_close(arch->arch); | |
79 | - archive_write_finish(arch->arch); | |
80 | + archive_write_free(arch->arch); | |
81 | } | |
82 | - | |
83 | + | |
84 | if (arch->stream) { | |
85 | php_stream_close(arch->stream); | |
86 | } | |
87 | - | |
88 | + | |
89 | if (arch->filename) { | |
90 | efree(arch->filename); | |
91 | } | |
92 | @@ -116,12 +120,12 @@ static void _archive_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) | |
93 | int _archive_get_rsrc_id(zval *this TSRMLS_DC) | |
94 | { | |
95 | zval **prop; | |
96 | - | |
97 | - if (zend_hash_find(Z_OBJPROP_P(this), "fd", sizeof("fd"), (void **)&prop) == FAILURE) { | |
98 | - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find archive file descriptor"); | |
99 | - return 0; | |
100 | - } | |
101 | - | |
102 | + | |
103 | + if (zend_hash_find(Z_OBJPROP_P(this), "fd", sizeof("fd"), (void **)&prop) == FAILURE) { | |
104 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find archive file descriptor"); | |
105 | + return 0; | |
106 | + } | |
107 | + | |
108 | return Z_LVAL_PP(prop); | |
109 | } | |
110 | /* }}} */ | |
111 | @@ -131,7 +135,7 @@ int _archive_get_rsrc_id(zval *this TSRMLS_DC) | |
112 | int _archive_get_fd(zval *this, archive_file_t **arch TSRMLS_DC) | |
113 | { | |
114 | int resource_id, type; | |
115 | - | |
116 | + | |
117 | ||
118 | if ((resource_id = _archive_get_rsrc_id(this TSRMLS_CC))) { | |
119 | *arch = (archive_file_t *) zend_list_find(resource_id, &type); | |
120 | @@ -149,12 +153,12 @@ int _archive_get_fd(zval *this, archive_file_t **arch TSRMLS_DC) | |
121 | PHP_MINIT_FUNCTION(archive) | |
122 | { | |
123 | zend_class_entry tmp_ce_ArchiveException; | |
124 | - | |
125 | + | |
126 | le_archive = zend_register_list_destructors_ex(_archive_desc_dtor, NULL, "archive descriptor", module_number); | |
127 | - | |
128 | + | |
129 | INIT_CLASS_ENTRY(tmp_ce_ArchiveException, "ArchiveException", NULL); | |
130 | ce_ArchiveException = zend_register_internal_class_ex(&tmp_ce_ArchiveException, archive_ce_Exception, NULL TSRMLS_CC); | |
131 | - | |
132 | + | |
133 | PHP_MINIT(archive_entry)(INIT_FUNC_ARGS_PASSTHRU); | |
134 | PHP_MINIT(archive_reader)(INIT_FUNC_ARGS_PASSTHRU); | |
135 | ||
136 | @@ -174,7 +178,7 @@ PHP_MINIT_FUNCTION(archive) | |
137 | #endif | |
138 | REGISTER_LONG_CONSTANT("ARCH_COMPRESSION_COMPRESS", PHP_ARCHIVE_COMPRESSION_COMPRESS, CONST_CS | CONST_PERSISTENT); | |
139 | REGISTER_LONG_CONSTANT("ARCH_COMPRESSION_NONE", PHP_ARCHIVE_COMPRESSION_NONE, CONST_CS | CONST_PERSISTENT); | |
140 | - | |
141 | + | |
142 | return SUCCESS; | |
143 | } | |
144 | /* }}} */ | |
145 | @@ -185,7 +189,8 @@ PHP_MINFO_FUNCTION(archive) | |
146 | { | |
147 | php_info_print_table_start(); | |
148 | php_info_print_table_header(2, "archive support", "enabled"); | |
149 | - php_info_print_table_row(2, "libarchive version", archive_version()); | |
150 | + php_info_print_table_row(2, "extension version", PHP_ARCHIVE_VERSION); | |
151 | + php_info_print_table_row(2, "libarchive version", archive_version()); | |
152 | php_info_print_table_end(); | |
153 | } | |
154 | /* }}} */ | |
155 | diff --git a/archive_clbk.c b/archive_clbk.c | |
156 | index 3034e0a..3b09d8b 100644 | |
157 | --- a/archive_clbk.c | |
158 | +++ b/archive_clbk.c | |
159 | @@ -12,7 +12,7 @@ | |
160 | | obtain it through the world-wide-web, please send a note to | | |
161 | | license@php.net so we can mail you a copy immediately. | | |
162 | +----------------------------------------------------------------------+ | |
163 | - | Author: Antony Dovgal <antony@zend.com> | | |
164 | + | Author: Antony Dovgal <tony2001@php.net> | | |
165 | +----------------------------------------------------------------------+ | |
166 | */ | |
167 | ||
168 | @@ -32,7 +32,6 @@ ssize_t _archive_read_clbk(struct archive *a, void *client_data, const void **bu | |
169 | { | |
170 | archive_file_t *arch = (archive_file_t *)client_data; | |
171 | ssize_t len = 0; | |
172 | - | |
173 | TSRMLS_FETCH(); | |
174 | ||
175 | if (arch->stream == NULL) { | |
176 | @@ -40,7 +39,7 @@ ssize_t _archive_read_clbk(struct archive *a, void *client_data, const void **bu | |
177 | } | |
178 | ||
179 | *buff = arch->buf; | |
180 | - if ((len = php_stream_read(arch->stream, arch->buf, PHP_ARCHIVE_BUF_LEN))) { | |
181 | + if ((len = php_stream_read(arch->stream, arch->buf, arch->block_size))) { | |
182 | return len; | |
183 | } | |
184 | return 0; | |
185 | @@ -49,11 +48,10 @@ ssize_t _archive_read_clbk(struct archive *a, void *client_data, const void **bu | |
186 | ||
187 | /* {{{ _archive_write_clbk | |
188 | */ | |
189 | -ssize_t _archive_write_clbk(struct archive *a, void *client_data, void *buff, size_t buf_len) | |
190 | +ssize_t _archive_write_clbk(struct archive *a, void *client_data, const void *buff, size_t buf_len) | |
191 | { | |
192 | archive_file_t *arch = (archive_file_t *)client_data; | |
193 | ssize_t len; | |
194 | - | |
195 | TSRMLS_FETCH(); | |
196 | ||
197 | if (arch->stream == NULL) { | |
198 | @@ -67,12 +65,58 @@ ssize_t _archive_write_clbk(struct archive *a, void *client_data, void *buff, si | |
199 | } | |
200 | /* }}} */ | |
201 | ||
202 | +/* {{{ _archive_skip_clbk | |
203 | + * */ | |
204 | +off_t _archive_skip_clbk(struct archive *a, void *client_data, off_t request) | |
205 | +{ | |
206 | + archive_file_t *arch = (archive_file_t *)client_data; | |
207 | + off_t size; | |
208 | + int r; | |
209 | + TSRMLS_FETCH(); | |
210 | + | |
211 | + if(request == 0) { | |
212 | + return 0; | |
213 | + } | |
214 | + | |
215 | + if(arch->stream){ | |
216 | + size = (request/arch->block_size) * arch->block_size; | |
217 | + if(size == 0){ /*do not break a block*/ | |
218 | + return 0; | |
219 | + } | |
220 | + /*TODO maybe lasy seek is a better idea for performance | |
221 | + * refer: libarchive archive_read_open_filename.c file_skip_lseek | |
222 | + * */ | |
223 | + r = php_stream_seek(arch->stream, size, SEEK_CUR); | |
224 | + if(r < 0){ | |
225 | + return 0; | |
226 | + } | |
227 | + return size; | |
228 | + } | |
229 | + return 0; | |
230 | +} | |
231 | +/*}}}*/ | |
232 | + | |
233 | +/* {{{ _archive_seek_clbk | |
234 | + * */ | |
235 | +ssize_t _archive_seek_clbk(struct archive *a, void *client_data, off_t offset, int whence) | |
236 | +{ | |
237 | + int r; | |
238 | + archive_file_t *arch = (archive_file_t *)client_data; | |
239 | + TSRMLS_FETCH(); | |
240 | + | |
241 | + r = php_stream_seek(arch->stream, offset, whence); | |
242 | + if(r == 0){ | |
243 | + | |
244 | + return php_stream_tell(arch->stream); | |
245 | + } | |
246 | + return r; | |
247 | +}/*}}}*/ | |
248 | + | |
249 | /* {{{ _archive_open_clbk | |
250 | */ | |
251 | int _archive_open_clbk(struct archive *a, void *client_data) | |
252 | { | |
253 | archive_file_t *arch = (archive_file_t *)client_data; | |
254 | - | |
255 | TSRMLS_FETCH(); | |
256 | ||
257 | if (arch->mode == PHP_ARCHIVE_WRITE_MODE) { | |
258 | @@ -80,8 +124,17 @@ int _archive_open_clbk(struct archive *a, void *client_data) | |
259 | } else if (arch->mode == PHP_ARCHIVE_READ_MODE) { | |
260 | arch->stream = php_stream_open_wrapper_ex(arch->filename, "r", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, NULL); | |
261 | } | |
262 | - | |
263 | + | |
264 | if (arch->stream) { | |
265 | + /* Use libarchive to manage buffer | |
266 | + * here we set non-buffer of php stream | |
267 | + * */ | |
268 | + arch->stream->flags |= PHP_STREAM_FLAG_NO_BUFFER; | |
269 | + if((arch->stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0){ | |
270 | + archive_read_set_skip_callback(arch->arch, _archive_skip_clbk); | |
271 | + /*TODO it is usually not a good idea to support seek | |
272 | + * archive_read_set_seek_callback(arch->arch, _archive_seek_clbk);*/ | |
273 | + } | |
274 | return 0; | |
275 | } | |
276 | return 1; | |
277 | @@ -93,7 +146,6 @@ int _archive_open_clbk(struct archive *a, void *client_data) | |
278 | int _archive_close_clbk(struct archive *a, void *client_data) | |
279 | { | |
280 | archive_file_t *arch = (archive_file_t *)client_data; | |
281 | - | |
282 | TSRMLS_FETCH(); | |
283 | ||
284 | if (arch->stream) { | |
285 | diff --git a/archive_clbk.h b/archive_clbk.h | |
286 | index 6196a29..626a5ad 100644 | |
287 | --- a/archive_clbk.h | |
288 | +++ b/archive_clbk.h | |
289 | @@ -12,7 +12,7 @@ | |
290 | | obtain it through the world-wide-web, please send a note to | | |
291 | | license@php.net so we can mail you a copy immediately. | | |
292 | +----------------------------------------------------------------------+ | |
293 | - | Author: Antony Dovgal <antony@zend.com> | | |
294 | + | Author: Antony Dovgal <tony2001@php.net> | | |
295 | +----------------------------------------------------------------------+ | |
296 | */ | |
297 | ||
298 | @@ -24,7 +24,9 @@ | |
299 | ssize_t _archive_read_clbk(struct archive *, void *, const void **); | |
300 | int _archive_open_clbk(struct archive *, void *); | |
301 | int _archive_close_clbk(struct archive *, void *); | |
302 | -ssize_t _archive_write_clbk(struct archive *, void *, void *, size_t); | |
303 | +off_t _archive_skip_clbk(struct archive *, void *, off_t); | |
304 | +ssize_t _archive_seek_clbk(struct archive *, void *, off_t, int); | |
305 | +ssize_t _archive_write_clbk(struct archive *, void *, const void *, size_t); | |
306 | ||
307 | #endif /* ARCHIVE_CLBK_H */ | |
308 | ||
309 | diff --git a/archive_entry.c b/archive_entry.c | |
310 | index 2cc511b..df9c657 100644 | |
311 | --- a/archive_entry.c | |
312 | +++ b/archive_entry.c | |
313 | @@ -12,7 +12,7 @@ | |
314 | | obtain it through the world-wide-web, please send a note to | | |
315 | | license@php.net so we can mail you a copy immediately. | | |
316 | +----------------------------------------------------------------------+ | |
317 | - | Author: Antony Dovgal <antony@zend.com> | | |
318 | + | Author: Antony Dovgal <tony2001@php.net> | | |
319 | +----------------------------------------------------------------------+ | |
320 | */ | |
321 | ||
322 | @@ -29,8 +29,8 @@ | |
323 | #include "php_archive.h" | |
324 | #include "php_archive_entry.h" | |
325 | ||
326 | -/* function_entry funcs_ArchiveEntry {{{ */ | |
327 | -function_entry funcs_ArchiveEntry[] = { | |
328 | +/* zend_function_entry funcs_ArchiveEntry {{{ */ | |
329 | +zend_function_entry funcs_ArchiveEntry[] = { | |
330 | ZEND_ME(ArchiveEntry, __construct, NULL, 0) | |
331 | ZEND_ME(ArchiveEntry, isDir, NULL, 0) | |
332 | ZEND_ME(ArchiveEntry, isFile, NULL, 0) | |
333 | @@ -50,12 +50,13 @@ function_entry funcs_ArchiveEntry[] = { | |
334 | static void _archive_entry_desc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC); | |
335 | ||
336 | #define PHP_ENTRY_GET_STRUCT \ | |
337 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); \ | |
338 | + zend_error_handling error_handling; \ | |
339 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); \ | |
340 | if(!_archive_get_entry_struct(this, &entry TSRMLS_CC)) { \ | |
341 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); \ | |
342 | + zend_restore_error_handling(&error_handling TSRMLS_CC); \ | |
343 | return; \ | |
344 | } \ | |
345 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
346 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
347 | ||
348 | /* {{{ _archive_entry_desc_dtor | |
349 | */ | |
350 | @@ -98,10 +99,10 @@ int _archive_get_entry_rsrc_id(zval *this TSRMLS_DC) | |
351 | { | |
352 | zval **prop; | |
353 | ||
354 | - if (zend_hash_find(Z_OBJPROP_P(this), "entry", sizeof("entry"), (void **)&prop) == FAILURE) { | |
355 | - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find entry descriptor"); | |
356 | - return 0; | |
357 | - } | |
358 | + if (zend_hash_find(Z_OBJPROP_P(this), "entry", sizeof("entry"), (void **)&prop) == FAILURE) { | |
359 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find entry descriptor"); | |
360 | + return 0; | |
361 | + } | |
362 | ||
363 | return Z_LVAL_PP(prop); | |
364 | } | |
365 | @@ -149,27 +150,30 @@ ZEND_METHOD(ArchiveEntry, __construct) | |
366 | archive_entry_t *entry; | |
367 | struct stat *stat_sb; | |
368 | php_stream_statbuf ssb; | |
369 | - | |
370 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
371 | + zend_error_handling error_handling; | |
372 | + | |
373 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
374 | ||
375 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { | |
376 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
377 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
378 | return; | |
379 | } | |
380 | ||
381 | +#if PHP_API_VERSION < 20100412 | |
382 | if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { | |
383 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
384 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
385 | return; | |
386 | } | |
387 | - | |
388 | +#endif | |
389 | + | |
390 | if (php_check_open_basedir(filename TSRMLS_CC)) { | |
391 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
392 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
393 | return; | |
394 | } | |
395 | - | |
396 | + | |
397 | if (php_stream_stat_path_ex((char *)filename, PHP_STREAM_URL_STAT_LINK, &ssb, NULL)) { | |
398 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "stat failed for %s", filename); | |
399 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
400 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
401 | return; | |
402 | } | |
403 | ||
404 | @@ -177,18 +181,18 @@ ZEND_METHOD(ArchiveEntry, __construct) | |
405 | ||
406 | entry = (archive_entry_t *) emalloc(sizeof(archive_entry_t)); | |
407 | entry->resolved_filename = NULL; | |
408 | - | |
409 | + | |
410 | #if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS) | |
411 | if (S_ISLNK(stat_sb->st_mode)) { | |
412 | char resolved_path_buff[MAXPATHLEN]; | |
413 | ||
414 | if (VCWD_REALPATH(filename, resolved_path_buff)) { | |
415 | -/* TODO figure out if we need this check */ | |
416 | + /* TODO figure out if we need this check */ | |
417 | #if 0 && defined(ZTS) | |
418 | if (VCWD_ACCESS(resolved_path_buff, F_OK)) { | |
419 | efree(entry); | |
420 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "stat failed for %s", filename); | |
421 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
422 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
423 | return; | |
424 | } | |
425 | #endif | |
426 | @@ -211,7 +215,7 @@ ZEND_METHOD(ArchiveEntry, __construct) | |
427 | resource_id = zend_list_insert(entry,le_archive_entry); | |
428 | add_property_resource(this, "entry", resource_id); | |
429 | ||
430 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
431 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
432 | return; | |
433 | } | |
434 | /* }}} */ | |
435 | diff --git a/archive_reader.c b/archive_reader.c | |
436 | index 0673a83..b0f070a 100644 | |
437 | --- a/archive_reader.c | |
438 | +++ b/archive_reader.c | |
439 | @@ -12,7 +12,7 @@ | |
440 | | obtain it through the world-wide-web, please send a note to | | |
441 | | license@php.net so we can mail you a copy immediately. | | |
442 | +----------------------------------------------------------------------+ | |
443 | - | Author: Antony Dovgal <antony@zend.com> | | |
444 | + | Author: Antony Dovgal <tony2001@php.net> | | |
445 | +----------------------------------------------------------------------+ | |
446 | */ | |
447 | ||
448 | @@ -32,8 +32,8 @@ | |
449 | zend_class_entry *ce_ArchiveReader; | |
450 | zend_class_entry *ce_ArchiveReaderInterface; | |
451 | ||
452 | -/* function_entry funcs_ArchiveReaderInterface {{{ */ | |
453 | -function_entry funcs_ArchiveReaderInterface[] = { | |
454 | +/* zend_function_entry funcs_ArchiveReaderInterface {{{ */ | |
455 | +zend_function_entry funcs_ArchiveReaderInterface[] = { | |
456 | ZEND_ABSTRACT_ME(ArchiveReader, __construct, NULL) | |
457 | ZEND_ABSTRACT_ME(ArchiveReader, getNextEntry, NULL) | |
458 | ZEND_ABSTRACT_ME(ArchiveReader, getCurrentEntryData, NULL) | |
459 | @@ -43,8 +43,8 @@ function_entry funcs_ArchiveReaderInterface[] = { | |
460 | }; | |
461 | /* }}} */ | |
462 | ||
463 | -/* function_entry funcs_ArchiveReader {{{ */ | |
464 | -function_entry funcs_ArchiveReader[] = { | |
465 | +/* zend_function_entry funcs_ArchiveReader {{{ */ | |
466 | +zend_function_entry funcs_ArchiveReader[] = { | |
467 | ZEND_ME(ArchiveReader, __construct, NULL, 0) | |
468 | ZEND_ME(ArchiveReader, getNextEntry, NULL, 0) | |
469 | ZEND_ME(ArchiveReader, getCurrentEntryData, NULL, 0) | |
470 | @@ -83,24 +83,30 @@ ZEND_METHOD(ArchiveReader, __construct) | |
471 | zval *this = getThis(); | |
472 | const char *error_string = NULL; | |
473 | char *filename; | |
474 | - int error_num, filename_len, result, format = 0, compression = 0; | |
475 | + long error_num, filename_len, result, format = 0, compression = 0, block_size = 0; | |
476 | + zend_error_handling error_handling; | |
477 | ||
478 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
479 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
480 | ||
481 | - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &format, &compression) == FAILURE) { | |
482 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
483 | + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lll", &filename, &filename_len, &format, &compression, &block_size) == FAILURE) { | |
484 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
485 | return; | |
486 | } | |
487 | - | |
488 | +#if PHP_API_VERSION < 20100412 | |
489 | if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { | |
490 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
491 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
492 | return; | |
493 | } | |
494 | +#endif | |
495 | ||
496 | if (php_check_open_basedir(filename TSRMLS_CC)) { | |
497 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
498 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
499 | return; | |
500 | } | |
501 | + | |
502 | + if(block_size <= 0){ | |
503 | + block_size = PHP_ARCHIVE_BUF_LEN; | |
504 | + } | |
505 | ||
506 | arch = (archive_file_t *) emalloc(sizeof(archive_file_t)); | |
507 | ||
508 | @@ -108,69 +114,53 @@ ZEND_METHOD(ArchiveReader, __construct) | |
509 | arch->current_entry = NULL; | |
510 | arch->entries = NULL; | |
511 | arch->struct_state = ARCHIVE_OK; | |
512 | + arch->block_size = block_size; | |
513 | arch->mode = PHP_ARCHIVE_READ_MODE; | |
514 | - arch->buf = emalloc(PHP_ARCHIVE_BUF_LEN + 1); | |
515 | + arch->buf = emalloc(arch->block_size + 1); | |
516 | arch->filename = estrndup(filename, filename_len); | |
517 | arch->arch = archive_read_new(); | |
518 | ||
519 | ||
520 | - _php_archive_read_support_compression_all(arch->arch); | |
521 | - | |
522 | - if (format == 0) { | |
523 | - /* support all by default */ | |
524 | - archive_read_support_format_all(arch->arch); | |
525 | - } | |
526 | - else { | |
527 | - if (format & PHP_ARCHIVE_FORMAT_TAR) { | |
528 | - archive_read_support_format_tar(arch->arch); | |
529 | - } | |
530 | - | |
531 | - if (format & PHP_ARCHIVE_FORMAT_CPIO) { | |
532 | - archive_read_support_format_cpio(arch->arch); | |
533 | - } | |
534 | - } | |
535 | + archive_read_support_filter_all(arch->arch); | |
536 | + switch(format){ | |
537 | + case PHP_ARCHIVE_FORMAT_TAR: | |
538 | + archive_read_support_format_tar(arch->arch); | |
539 | + break; | |
540 | + case PHP_ARCHIVE_FORMAT_CPIO: | |
541 | + archive_read_support_format_cpio(arch->arch); | |
542 | + break; | |
543 | + default: | |
544 | + archive_read_support_format_all(arch->arch); | |
545 | + break; | |
546 | + } | |
547 | ||
548 | - if (compression == 0) { | |
549 | - /* support all possible compression types by default */ | |
550 | - _php_archive_read_support_compression_all(arch->arch); | |
551 | - } | |
552 | - else { | |
553 | - if (compression & PHP_ARCHIVE_COMPRESSION_NONE) { | |
554 | - /* none */ | |
555 | - } | |
556 | - else { | |
557 | - if (compression & PHP_ARCHIVE_COMPRESSION_GZIP) { | |
558 | -#ifdef HAVE_ZLIB | |
559 | - archive_read_support_compression_gzip(arch->arch); | |
560 | -#else | |
561 | + switch(compression){ | |
562 | + case PHP_ARCHIVE_COMPRESSION_NONE: | |
563 | + break; | |
564 | + case PHP_ARCHIVE_COMPRESSION_GZIP: | |
565 | + if(archive_read_support_filter_gzip(arch->arch) != ARCHIVE_OK){ | |
566 | efree(arch->filename); | |
567 | efree(arch->buf); | |
568 | efree(arch); | |
569 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Gzip compression support is not available in this build "); | |
570 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
571 | - return; | |
572 | -#endif | |
573 | - } | |
574 | - | |
575 | - if (compression & PHP_ARCHIVE_COMPRESSION_BZIP2) { | |
576 | -#ifdef HAVE_BZ2 | |
577 | - archive_read_support_compression_bzip2(arch->arch); | |
578 | -#else | |
579 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
580 | + return; | |
581 | + } | |
582 | + break; | |
583 | + case PHP_ARCHIVE_COMPRESSION_BZIP2: | |
584 | + if(archive_read_support_filter_gzip(arch->arch) != ARCHIVE_OK){ | |
585 | efree(arch->filename); | |
586 | efree(arch->buf); | |
587 | efree(arch); | |
588 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bzip2 compression support is not available in this build "); | |
589 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
590 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
591 | return; | |
592 | -#endif | |
593 | - } | |
594 | - | |
595 | - /* compress support is always available */ | |
596 | - if (compression & PHP_ARCHIVE_COMPRESSION_COMPRESS) { | |
597 | - archive_read_support_compression_compress(arch->arch); | |
598 | - } | |
599 | - } | |
600 | - } | |
601 | + } | |
602 | + default: | |
603 | + archive_read_support_filter_all(arch->arch); | |
604 | + break; | |
605 | + } | |
606 | + | |
607 | result = archive_read_open(arch->arch, arch, _archive_open_clbk, _archive_read_clbk, _archive_close_clbk); | |
608 | ||
609 | if (result) { | |
610 | @@ -188,14 +178,14 @@ ZEND_METHOD(ArchiveReader, __construct) | |
611 | else { | |
612 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to open file %s for reading: unknown error %d", filename, result); | |
613 | } | |
614 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
615 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
616 | return; | |
617 | } | |
618 | ||
619 | resource_id = zend_list_insert(arch,le_archive); | |
620 | add_property_resource(this, "fd", resource_id); | |
621 | ||
622 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
623 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
624 | return; | |
625 | } | |
626 | /* }}} */ | |
627 | @@ -212,19 +202,20 @@ ZEND_METHOD(ArchiveReader, getNextEntry) | |
628 | zend_bool fetch_entry_data = 0; | |
629 | archive_entry_t *entry; | |
630 | struct archive_entry *current_entry; | |
631 | - int len; | |
632 | + size_t len; | |
633 | off_t offset; | |
634 | char *buf; | |
635 | + zend_error_handling error_handling; | |
636 | ||
637 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
638 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
639 | ||
640 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &fetch_entry_data) == FAILURE) { | |
641 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
642 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
643 | return; | |
644 | } | |
645 | ||
646 | if (!_archive_get_fd(this, &arch TSRMLS_CC)) { | |
647 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
648 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
649 | return; | |
650 | } | |
651 | ||
652 | @@ -240,7 +231,7 @@ ZEND_METHOD(ArchiveReader, getNextEntry) | |
653 | arch->current_entry = entry; | |
654 | } | |
655 | else { | |
656 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
657 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
658 | RETURN_FALSE; | |
659 | } | |
660 | ||
661 | @@ -256,14 +247,14 @@ ZEND_METHOD(ArchiveReader, getNextEntry) | |
662 | else { | |
663 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read file %s: unknown error %d", arch->filename, result); | |
664 | } | |
665 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
666 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
667 | return; | |
668 | } | |
669 | ||
670 | if (result == ARCHIVE_EOF) { | |
671 | arch->current_entry = NULL; | |
672 | efree(entry); | |
673 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
674 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
675 | RETURN_FALSE; | |
676 | } | |
677 | ||
678 | @@ -287,7 +278,7 @@ ZEND_METHOD(ArchiveReader, getNextEntry) | |
679 | else { | |
680 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read file %s: unknown error %d", arch->filename, result); | |
681 | } | |
682 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
683 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
684 | return; | |
685 | } | |
686 | } | |
687 | @@ -297,7 +288,7 @@ ZEND_METHOD(ArchiveReader, getNextEntry) | |
688 | add_property_resource(return_value, "entry", resource_id); | |
689 | } | |
690 | ||
691 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
692 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
693 | } | |
694 | /* }}} */ | |
695 | ||
696 | @@ -313,22 +304,23 @@ ZEND_METHOD(ArchiveReader, getCurrentEntryData) | |
697 | off_t offset; | |
698 | const char *error_string; | |
699 | char *buf; | |
700 | + zend_error_handling error_handling; | |
701 | ||
702 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
703 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
704 | ||
705 | if (!_archive_get_fd(this, &arch TSRMLS_CC)) { | |
706 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
707 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
708 | return; | |
709 | } | |
710 | ||
711 | if (arch->current_entry == NULL) { | |
712 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Current archive entry is not available"); | |
713 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
714 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
715 | return; | |
716 | } | |
717 | ||
718 | if (arch->current_entry->data) { | |
719 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
720 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
721 | RETURN_STRINGL(arch->current_entry->data, arch->current_entry->data_len, 1); | |
722 | } | |
723 | ||
724 | @@ -348,11 +340,11 @@ ZEND_METHOD(ArchiveReader, getCurrentEntryData) | |
725 | else { | |
726 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read entry data: unknown error %d", result); | |
727 | } | |
728 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
729 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
730 | return; | |
731 | } | |
732 | ||
733 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
734 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
735 | RETURN_STRINGL(arch->current_entry->data, arch->current_entry->data_len, 1); | |
736 | } | |
737 | /* }}} */ | |
738 | @@ -366,22 +358,23 @@ ZEND_METHOD(ArchiveReader, extractCurrentEntry) | |
739 | archive_file_t *arch; | |
740 | int result, error_num, flags = 0; | |
741 | const char *error_string; | |
742 | + zend_error_handling error_handling; | |
743 | ||
744 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
745 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
746 | ||
747 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) { | |
748 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
749 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
750 | return; | |
751 | } | |
752 | ||
753 | if (!_archive_get_fd(this, &arch TSRMLS_CC)) { | |
754 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
755 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
756 | return; | |
757 | } | |
758 | ||
759 | if (arch->current_entry == NULL) { | |
760 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Current archive entry is not available"); | |
761 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
762 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
763 | return; | |
764 | } | |
765 | ||
766 | @@ -389,7 +382,7 @@ ZEND_METHOD(ArchiveReader, extractCurrentEntry) | |
767 | /* again, rather annoying libarchive limitation: you can't extract or | |
768 | * read entry anymore if it had been extracted/read before. | |
769 | * */ | |
770 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
771 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
772 | RETURN_FALSE; | |
773 | } | |
774 | ||
775 | @@ -406,10 +399,10 @@ ZEND_METHOD(ArchiveReader, extractCurrentEntry) | |
776 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to extract entry: unknown error %d", result); | |
777 | } | |
778 | ||
779 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
780 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
781 | return; | |
782 | } | |
783 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
784 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
785 | RETURN_TRUE; | |
786 | } | |
787 | /* }}} */ | |
788 | @@ -421,18 +414,19 @@ ZEND_METHOD(ArchiveReader, close) | |
789 | { | |
790 | zval *this = getThis(); | |
791 | int resourse_id; | |
792 | + zend_error_handling error_handling; | |
793 | ||
794 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
795 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
796 | ||
797 | if ((resourse_id = _archive_get_rsrc_id(this TSRMLS_CC))) { | |
798 | add_property_resource(this, "fd", 0); | |
799 | zend_list_delete(resourse_id); | |
800 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
801 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
802 | RETURN_TRUE; | |
803 | } | |
804 | ||
805 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to close archive file descriptor"); | |
806 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
807 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
808 | } | |
809 | /* }}} */ | |
810 | ||
811 | diff --git a/archive_reader.h b/archive_reader.h | |
812 | index ed1c7f9..29d3acc 100644 | |
813 | --- a/archive_reader.h | |
814 | +++ b/archive_reader.h | |
815 | @@ -12,7 +12,7 @@ | |
816 | | obtain it through the world-wide-web, please send a note to | | |
817 | | license@php.net so we can mail you a copy immediately. | | |
818 | +----------------------------------------------------------------------+ | |
819 | - | Author: Antony Dovgal <antony@zend.com> | | |
820 | + | Author: Antony Dovgal <tony2001@php.net> | | |
821 | +----------------------------------------------------------------------+ | |
822 | */ | |
823 | ||
824 | diff --git a/archive_util.c b/archive_util.c | |
825 | index 9838820..5e4c477 100644 | |
826 | --- a/archive_util.c | |
827 | +++ b/archive_util.c | |
828 | @@ -12,7 +12,7 @@ | |
829 | | obtain it through the world-wide-web, please send a note to | | |
830 | | license@php.net so we can mail you a copy immediately. | | |
831 | +----------------------------------------------------------------------+ | |
832 | - | Author: Antony Dovgal <antony@zend.com> | | |
833 | + | Author: Antony Dovgal <tony2001@php.net> | | |
834 | +----------------------------------------------------------------------+ | |
835 | */ | |
836 | ||
837 | @@ -48,11 +48,11 @@ int _archive_pathname_compare(const void *a, const void *b TSRMLS_DC) | |
838 | s = *((Bucket **) b); | |
839 | ||
840 | Z_TYPE(first) = IS_STRING; | |
841 | - Z_STRVAL(first) = f->arKey; | |
842 | + Z_STRVAL(first) = (char *)f->arKey; | |
843 | Z_STRLEN(first) = f->nKeyLength-1; | |
844 | ||
845 | Z_TYPE(second) = IS_STRING; | |
846 | - Z_STRVAL(second) = s->arKey; | |
847 | + Z_STRVAL(second) = (char *)s->arKey; | |
848 | Z_STRLEN(second) = s->nKeyLength-1; | |
849 | ||
850 | if (string_compare_function(&result, &first, &second TSRMLS_CC) != SUCCESS) { | |
851 | diff --git a/archive_util.h b/archive_util.h | |
852 | index c897738..100493d 100644 | |
853 | --- a/archive_util.h | |
854 | +++ b/archive_util.h | |
855 | @@ -12,7 +12,7 @@ | |
856 | | obtain it through the world-wide-web, please send a note to | | |
857 | | license@php.net so we can mail you a copy immediately. | | |
858 | +----------------------------------------------------------------------+ | |
859 | - | Author: Antony Dovgal <antony@zend.com> | | |
860 | + | Author: Antony Dovgal <tony2001@php.net> | | |
861 | +----------------------------------------------------------------------+ | |
862 | */ | |
863 | ||
864 | diff --git a/archive_writer.c b/archive_writer.c | |
865 | index 30647bf..2637633 100644 | |
866 | --- a/archive_writer.c | |
867 | +++ b/archive_writer.c | |
868 | @@ -12,7 +12,7 @@ | |
869 | | obtain it through the world-wide-web, please send a note to | | |
870 | | license@php.net so we can mail you a copy immediately. | | |
871 | +----------------------------------------------------------------------+ | |
872 | - | Author: Antony Dovgal <antony@zend.com> | | |
873 | + | Author: Antony Dovgal <tony2001@php.net> | | |
874 | +----------------------------------------------------------------------+ | |
875 | */ | |
876 | ||
877 | @@ -35,8 +35,8 @@ | |
878 | zend_class_entry *ce_ArchiveWriter; | |
879 | zend_class_entry *ce_ArchiveWriterInterface; | |
880 | ||
881 | -/* function_entry funcs_ArchiveWriterInterface {{{ */ | |
882 | -function_entry funcs_ArchiveWriterInterface[] = { | |
883 | +/* zend_function_entry funcs_ArchiveWriterInterface {{{ */ | |
884 | +zend_function_entry funcs_ArchiveWriterInterface[] = { | |
885 | ZEND_ABSTRACT_ME(ArchiveWriter, __construct, NULL) | |
886 | ZEND_ABSTRACT_ME(ArchiveWriter, addEntry, NULL) | |
887 | ZEND_ABSTRACT_ME(ArchiveWriter, finish, NULL) | |
888 | @@ -44,8 +44,8 @@ function_entry funcs_ArchiveWriterInterface[] = { | |
889 | }; | |
890 | /* }}} */ | |
891 | ||
892 | -/* function_entry funcs_ArchiveWriter {{{ */ | |
893 | -function_entry funcs_ArchiveWriter[] = { | |
894 | +/* zend_function_entry funcs_ArchiveWriter {{{ */ | |
895 | +zend_function_entry funcs_ArchiveWriter[] = { | |
896 | ZEND_ME(ArchiveWriter, __construct, NULL, 0) | |
897 | ZEND_ME(ArchiveWriter, addEntry, NULL, 0) | |
898 | ZEND_ME(ArchiveWriter, finish, NULL, 0) | |
899 | @@ -83,21 +83,24 @@ ZEND_METHOD(ArchiveWriter, __construct) | |
900 | const char *error_string = NULL; | |
901 | char *filename; | |
902 | int error_num, filename_len, result, format=0, compression=0; | |
903 | + zend_error_handling error_handling; | |
904 | ||
905 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
906 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
907 | ||
908 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &filename, &filename_len, &format, &compression) == FAILURE) { | |
909 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
910 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
911 | return; | |
912 | } | |
913 | ||
914 | +#if PHP_API_VERSION < 20100412 | |
915 | if (PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { | |
916 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
917 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
918 | return; | |
919 | } | |
920 | +#endif | |
921 | ||
922 | if (php_check_open_basedir(filename TSRMLS_CC)) { | |
923 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
924 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
925 | return; | |
926 | } | |
927 | ||
928 | @@ -114,36 +117,28 @@ ZEND_METHOD(ArchiveWriter, __construct) | |
929 | arch->arch = archive_write_new(); | |
930 | ||
931 | switch (compression) { | |
932 | -#ifdef HAVE_ZLIB | |
933 | case PHP_ARCHIVE_COMPRESSION_GZIP: | |
934 | - archive_write_set_compression_gzip(arch->arch); | |
935 | + if(archive_write_add_filter_gzip(arch->arch) != ARCHIVE_OK){ | |
936 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Gzip compression is not supported in this build"); | |
937 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
938 | + return; | |
939 | + } | |
940 | break; | |
941 | -#else | |
942 | - case PHP_ARCHIVE_COMPRESSION_GZIP: | |
943 | - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Gzip compression is not supported in this build"); | |
944 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
945 | - return; | |
946 | - break; | |
947 | -#endif | |
948 | ||
949 | -#ifdef HAVE_BZ2 | |
950 | case PHP_ARCHIVE_COMPRESSION_BZIP2: | |
951 | - archive_write_set_compression_bzip2(arch->arch); | |
952 | - break; | |
953 | -#else | |
954 | - case PHP_ARCHIVE_COMPRESSION_BZIP2: | |
955 | - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bzip2 compression is not supported in this build"); | |
956 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
957 | - return; | |
958 | + if(archive_write_add_filter_bzip2(arch->arch) != ARCHIVE_OK){ | |
959 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bzip2 compression is not supported in this build"); | |
960 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
961 | + return; | |
962 | + } | |
963 | break; | |
964 | -#endif | |
965 | case 0: /* default value */ | |
966 | case PHP_ARCHIVE_COMPRESSION_NONE: | |
967 | /* always supported */ | |
968 | break; | |
969 | default: | |
970 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported compression type %d", compression); | |
971 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
972 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
973 | return; | |
974 | break; | |
975 | } | |
976 | @@ -168,7 +163,7 @@ ZEND_METHOD(ArchiveWriter, __construct) | |
977 | break; | |
978 | default: | |
979 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported archive format: %d", format); | |
980 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
981 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
982 | return; | |
983 | break; | |
984 | } | |
985 | @@ -190,14 +185,14 @@ ZEND_METHOD(ArchiveWriter, __construct) | |
986 | else { | |
987 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to open file %s for writing: unknown error %d", filename, result); | |
988 | } | |
989 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
990 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
991 | return; | |
992 | } | |
993 | ||
994 | resource_id = zend_list_insert(arch,le_archive); | |
995 | add_property_resource(this, "fd", resource_id); | |
996 | ||
997 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
998 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
999 | return; | |
1000 | } | |
1001 | /* }}} */ | |
1002 | @@ -214,27 +209,28 @@ ZEND_METHOD(ArchiveWriter, addEntry) | |
1003 | char *pathname; | |
1004 | int pathname_len; | |
1005 | const struct stat *stat_sb; | |
1006 | + zend_error_handling error_handling; | |
1007 | ||
1008 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
1009 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
1010 | ||
1011 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &entry_obj) == FAILURE) { | |
1012 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1013 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1014 | return; | |
1015 | } | |
1016 | ||
1017 | if (!_archive_get_fd(this, &arch TSRMLS_CC)) { | |
1018 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1019 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1020 | return; | |
1021 | } | |
1022 | ||
1023 | if (!instanceof_function(Z_OBJCE_P(entry_obj), ce_ArchiveEntry TSRMLS_CC)) { | |
1024 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "An instance of ArchiveEntry is required"); | |
1025 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1026 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1027 | return; | |
1028 | } | |
1029 | ||
1030 | if(!_archive_get_entry_struct(entry_obj, &entry TSRMLS_CC)) { | |
1031 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1032 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1033 | return; | |
1034 | } | |
1035 | ||
1036 | @@ -245,7 +241,7 @@ ZEND_METHOD(ArchiveWriter, addEntry) | |
1037 | ||
1038 | if (pathname_len == 0 || pathname[0] == '\0') { | |
1039 | /* user is probably trying to add "./", "/", ".." or ".", ignoring it silently */ | |
1040 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1041 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1042 | RETURN_TRUE; | |
1043 | } | |
1044 | ||
1045 | @@ -265,7 +261,7 @@ ZEND_METHOD(ArchiveWriter, addEntry) | |
1046 | ||
1047 | /* ..and add it to the hash */ | |
1048 | zend_hash_update(arch->entries, pathname, pathname_len + 1, &entry_copy, sizeof(archive_entry_t), NULL); | |
1049 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1050 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1051 | RETURN_TRUE; | |
1052 | } | |
1053 | /* }}} */ | |
1054 | @@ -284,11 +280,12 @@ ZEND_METHOD(ArchiveWriter, finish) | |
1055 | const char *error_string; | |
1056 | mode_t mode; | |
1057 | php_stream *stream; | |
1058 | + zend_error_handling error_handling; | |
1059 | ||
1060 | - php_set_error_handling(EH_THROW, ce_ArchiveException TSRMLS_CC); | |
1061 | + zend_replace_error_handling(EH_THROW, ce_ArchiveException, &error_handling TSRMLS_CC); | |
1062 | ||
1063 | if (!_archive_get_fd(this, &arch TSRMLS_CC)) { | |
1064 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1065 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1066 | return; | |
1067 | } | |
1068 | ||
1069 | @@ -313,7 +310,7 @@ ZEND_METHOD(ArchiveWriter, finish) | |
1070 | result = archive_write_header(arch->arch, (*entry)->entry); | |
1071 | if (result == ARCHIVE_FATAL) { | |
1072 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write entry header for file %s: fatal error", (*entry)->filename); | |
1073 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1074 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1075 | return; | |
1076 | } | |
1077 | header_written = 1; | |
1078 | @@ -331,7 +328,7 @@ ZEND_METHOD(ArchiveWriter, finish) | |
1079 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write file %s: unknown error %d", (*entry)->filename, result); | |
1080 | } | |
1081 | php_stream_close(stream); | |
1082 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1083 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1084 | return; | |
1085 | } | |
1086 | } | |
1087 | @@ -342,7 +339,7 @@ ZEND_METHOD(ArchiveWriter, finish) | |
1088 | result = archive_write_header(arch->arch, (*entry)->entry); | |
1089 | if (result == ARCHIVE_FATAL) { | |
1090 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write entry header for file %s: fatal error", (*entry)->filename); | |
1091 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1092 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1093 | return; | |
1094 | } | |
1095 | } | |
1096 | @@ -352,12 +349,12 @@ ZEND_METHOD(ArchiveWriter, finish) | |
1097 | if ((resource_id = _archive_get_rsrc_id(this TSRMLS_CC))) { | |
1098 | add_property_resource(this, "fd", 0); | |
1099 | zend_list_delete(resource_id); | |
1100 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1101 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1102 | RETURN_TRUE; | |
1103 | } | |
1104 | ||
1105 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to finish writing of archive file"); | |
1106 | - php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC); | |
1107 | + zend_restore_error_handling(&error_handling TSRMLS_CC); | |
1108 | } | |
1109 | /* }}} */ | |
1110 | ||
1111 | diff --git a/archive_writer.h b/archive_writer.h | |
1112 | index f87909c..e51b3a4 100644 | |
1113 | --- a/archive_writer.h | |
1114 | +++ b/archive_writer.h | |
1115 | @@ -12,7 +12,7 @@ | |
1116 | | obtain it through the world-wide-web, please send a note to | | |
1117 | | license@php.net so we can mail you a copy immediately. | | |
1118 | +----------------------------------------------------------------------+ | |
1119 | - | Author: Antony Dovgal <antony@zend.com> | | |
1120 | + | Author: Antony Dovgal <tony2001@php.net> | | |
1121 | +----------------------------------------------------------------------+ | |
1122 | */ | |
1123 | ||
1124 | diff --git a/package.xml b/package.xml | |
1125 | index cb319ed..9cefd16 100644 | |
1126 | diff --git a/php_archive.h b/php_archive.h | |
1127 | index ad3724b..21094f8 100644 | |
1128 | --- a/php_archive.h | |
1129 | +++ b/php_archive.h | |
1130 | @@ -12,7 +12,7 @@ | |
1131 | | obtain it through the world-wide-web, please send a note to | | |
1132 | | license@php.net so we can mail you a copy immediately. | | |
1133 | +----------------------------------------------------------------------+ | |
1134 | - | Author: Antony Dovgal <antony@zend.com> | | |
1135 | + | Author: Antony Dovgal <tony2001@php.net> | | |
1136 | +----------------------------------------------------------------------+ | |
1137 | */ | |
1138 | ||
1139 | @@ -24,6 +24,7 @@ | |
1140 | #include <archive.h> | |
1141 | #include <archive_entry.h> | |
1142 | ||
1143 | +#define PHP_ARCHIVE_VERSION "0.3.1-dev" | |
1144 | ||
1145 | #define PHP_ARCHIVE_FORMAT_TAR (1<<0) | |
1146 | #define PHP_ARCHIVE_FORMAT_CPIO (1<<1) | |
1147 | @@ -58,33 +59,43 @@ typedef struct archive_file { | |
1148 | char *filename; | |
1149 | char *buf; | |
1150 | int struct_state; | |
1151 | + int block_size; | |
1152 | HashTable *entries; | |
1153 | } archive_file_t; | |
1154 | ||
1155 | #define PHP_ARCHIVE_BUF_LEN 8196 | |
1156 | ||
1157 | -#if defined(HAVE_BZ2) && defined(HAVE_ZLIB) | |
1158 | -#define _php_archive_read_support_compression_all(arch) \ | |
1159 | - archive_read_support_compression_bzip2(arch); \ | |
1160 | - archive_read_support_compression_gzip(arch); \ | |
1161 | - archive_read_support_compression_compress(arch); | |
1162 | +#if ARCHIVE_VERSION_NUMBER < 3000000 | |
1163 | +#define archive_read_free archive_read_finish | |
1164 | +#define archive_write_free archive_write_finish | |
1165 | + | |
1166 | +#define archive_read_support_filter_all archive_read_support_compression_all | |
1167 | +#define archive_read_support_filter_bzip2 archive_read_support_compression_bzip2 | |
1168 | +#define archive_read_support_filter_compress archive_read_support_compression_compress | |
1169 | +#define archive_read_support_filter_gzip archive_read_support_compression_gzip | |
1170 | +#define archive_read_support_filter_lzip archive_read_support_compression_lzip | |
1171 | +#define archive_read_support_filter_lzma archive_read_support_compression_lzma | |
1172 | +#define archive_read_support_filter_none archive_read_support_compression_none | |
1173 | +#define archive_read_support_filter_program archive_read_support_compression_program | |
1174 | +#define archive_read_support_filter_program_signature archive_read_support_compression_program_signature | |
1175 | +#define archive_read_support_filter_rpm archive_read_support_compression_rpm | |
1176 | +#define archive_read_support_filter_uu archive_read_support_compression_uu | |
1177 | +#define archive_read_support_filter_xz archive_read_support_compression_xz | |
1178 | + | |
1179 | +#define archive_write_add_filter_bzip2 archive_write_set_compression_bzip2 | |
1180 | +#define archive_write_add_filter_compress archive_write_set_compression_compress | |
1181 | +#define archive_write_add_filter_gzip archive_write_set_compression_gzip | |
1182 | +#define archive_write_add_filter_lzip archive_write_set_compression_lzip | |
1183 | +#define archive_write_add_filter_lzma archive_write_set_compression_lzma | |
1184 | +#define archive_write_add_filter_none archive_write_set_compression_none | |
1185 | +#define archive_write_add_filter_program archive_write_set_compression_program | |
1186 | +#define archive_write_add_filter_xz archive_write_set_compression_xz | |
1187 | #endif | |
1188 | ||
1189 | -#if defined(HAVE_BZ2) && !defined(HAVE_ZLIB) | |
1190 | -#define _php_archive_read_support_compression_all(arch) \ | |
1191 | - archive_read_support_compression_bzip2(arch); \ | |
1192 | - archive_read_support_compression_compress(arch); | |
1193 | -#endif | |
1194 | - | |
1195 | -#if !defined(HAVE_BZ2) && defined(HAVE_ZLIB) | |
1196 | -#define _php_archive_read_support_compression_all(arch) \ | |
1197 | - archive_read_support_compression_gzip(arch); \ | |
1198 | - archive_read_support_compression_compress(arch); | |
1199 | -#endif | |
1200 | - | |
1201 | -#if !defined(HAVE_BZ2) && !defined(HAVE_ZLIB) | |
1202 | -#define _php_archive_read_support_compression_all(arch) \ | |
1203 | - archive_read_support_compression_compress(arch); | |
1204 | +#if ZEND_MODULE_API_NO < 20090626 | |
1205 | +typedef int zend_error_handling; | |
1206 | +#define zend_replace_error_handling(type, exception, current) php_set_error_handling((type), (exception) TSRMLS_CC) | |
1207 | +#define zend_restore_error_handling(exception) php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC) | |
1208 | #endif | |
1209 | ||
1210 | PHPAPI zend_class_entry *ce_ArchiveException; | |
1211 | diff --git a/php_archive_entry.h b/php_archive_entry.h | |
1212 | index 88479ed..1bb7914 100644 | |
1213 | --- a/php_archive_entry.h | |
1214 | +++ b/php_archive_entry.h | |
1215 | @@ -12,7 +12,7 @@ | |
1216 | | obtain it through the world-wide-web, please send a note to | | |
1217 | | license@php.net so we can mail you a copy immediately. | | |
1218 | +----------------------------------------------------------------------+ | |
1219 | - | Author: Antony Dovgal <antony@zend.com> | | |
1220 | + | Author: Antony Dovgal <tony2001@php.net> | | |
1221 | +----------------------------------------------------------------------+ | |
1222 | */ | |
1223 |