pajoye Thu Aug 7 23:24:11 2008 UTC Added files: (Branch: PHP_5_3) /php-src/ext/zip/lib zip_filerange_crc.c zip_get_archive_flag.c zip_set_archive_flag.c
Modified files: /php-src/ext/zip config.w32 /php-src/ext/zip/lib .cvsignore zip.h zip_close.c zip_dirent.c zip_err_str.c zip_open.c zip_rename.c zip_source_file.c zip_source_filep.c zip_source_zip.c zip_unchange_archive.c zipint.h Log: - MFH: update to 0.9 (torrentzip support, files open only when necessary), windows fixes
http://cvs.php.net/viewvc.cgi/php-src/ext/zip/config.w32?r1=1.1.2.1.2.5&r2=1.1.2.1.2.6&diff_format=u Index: php-src/ext/zip/config.w32 diff -u php-src/ext/zip/config.w32:1.1.2.1.2.5 php-src/ext/zip/config.w32:1.1.2.1.2.6 --- php-src/ext/zip/config.w32:1.1.2.1.2.5 Wed Jul 9 16:09:35 2008 +++ php-src/ext/zip/config.w32 Thu Aug 7 23:24:11 2008 @@ -1,4 +1,4 @@ -// $Id: config.w32,v 1.1.2.1.2.5 2008/07/09 16:09:35 rrichards Exp $ +// $Id: config.w32,v 1.1.2.1.2.6 2008/08/07 23:24:11 pajoye Exp $ // vim:ft=javascript ARG_ENABLE("zip", "ZIP support", "yes"); @@ -17,7 +17,8 @@ zip_error_get_sys_type.c zip_file_get_offset.c \ zip_get_name.c zip_replace.c zip_source_function.c \ zip_unchange.c zip_dirent.c zip_error_strerror.c \ - zip_file_strerror.c zip_get_num_files.c \ + zip_filerange_crc.c zip_file_strerror.c zip_get_num_files.c \ + zip_get_archive_flag.c zip_set_archive_flag.c \ zip_set_name.c zip_source_zip.c zip_unchange_data.c \ zip_entry_free.c zip_error_to_str.c zip_fopen.c \ zip_name_locate.c zip_source_buffer.c zip_stat.c \ http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/.cvsignore?r1=1.1.2.4&r2=1.1.2.4.2.1&diff_format=u Index: php-src/ext/zip/lib/.cvsignore diff -u php-src/ext/zip/lib/.cvsignore:1.1.2.4 php-src/ext/zip/lib/.cvsignore:1.1.2.4.2.1 --- php-src/ext/zip/lib/.cvsignore:1.1.2.4 Tue Feb 13 10:07:39 2007 +++ php-src/ext/zip/lib/.cvsignore Thu Aug 7 23:24:11 2008 @@ -1,4 +1,3 @@ *.lo -.libs -*.gcda *.gcno +*.gcda http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip.h?r1=1.1.2.3.2.7&r2=1.1.2.3.2.8&diff_format=u Index: php-src/ext/zip/lib/zip.h diff -u php-src/ext/zip/lib/zip.h:1.1.2.3.2.7 php-src/ext/zip/lib/zip.h:1.1.2.3.2.8 --- php-src/ext/zip/lib/zip.h:1.1.2.3.2.7 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip.h Thu Aug 7 23:24:11 2008 @@ -70,6 +70,7 @@ #define ZIP_FL_NODIR 2 /* ignore directory component */ #define ZIP_FL_COMPRESSED 4 /* read compressed data */ #define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */ /* archive global flags flags */ @@ -161,8 +162,6 @@ ZIP_SOURCE_FREE /* cleanup and free resources */ }; - - typedef ssize_t (*zip_source_callback)(void *state, void *data, size_t len, enum zip_source_cmd cmd); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_close.c?r1=1.1.2.6.2.3&r2=1.1.2.6.2.4&diff_format=u Index: php-src/ext/zip/lib/zip_close.c diff -u php-src/ext/zip/lib/zip_close.c:1.1.2.6.2.3 php-src/ext/zip/lib/zip_close.c:1.1.2.6.2.4 --- php-src/ext/zip/lib/zip_close.c:1.1.2.6.2.3 Sun Aug 3 12:15:55 2008 +++ php-src/ext/zip/lib/zip_close.c Thu Aug 7 23:24:11 2008 @@ -42,16 +42,26 @@ #include "zipint.h" -static int add_data(struct zip *, int, struct zip_dirent *, FILE *); +static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, + FILE *); static int add_data_comp(zip_source_callback, void *, struct zip_stat *, FILE *, struct zip_error *); -static int add_data_uncomp(zip_source_callback, void *, struct zip_stat *, - FILE *, struct zip_error *); +static int add_data_uncomp(struct zip *, zip_source_callback, void *, + struct zip_stat *, FILE *); static void ch_set_error(struct zip_error *, zip_source_callback, void *); static int copy_data(FILE *, off_t, FILE *, struct zip_error *); +static int write_cdir(struct zip *, struct zip_cdir *, FILE *); static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *); static int _zip_changed(struct zip *, int *); static char *_zip_create_temp_output(struct zip *, FILE **); +static int _zip_torrentzip_cmp(const void *, const void *); + + + +struct filelist { + int idx; + const char *name; +}; @@ -65,7 +75,9 @@ mode_t mask; struct zip_cdir *cd; struct zip_dirent de; + struct filelist *filelist; int reopen_on_error; + int new_torrentzip; reopen_on_error = 0; @@ -79,7 +91,7 @@ /* don't create zip files with no entries */ if (survivors == 0) { - if (za->zn) { + if (za->zn && za->zp) { if (remove(za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_REMOVE, errno); return -1; @@ -89,45 +101,85 @@ return 0; } - if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) + if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors)) + == NULL) return -1; + if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) { + free(filelist); + return -1; + } + for (i=0; i<survivors; i++) _zip_dirent_init(&cd->entry[i]); + /* archive comment is special for torrentzip */ + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) { + cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX", + TORRENT_SIG_LEN + TORRENT_CRC_LEN, + &za->error); + if (cd->comment == NULL) { + _zip_cdir_free(cd); + free(filelist); + return -1; + } + cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN; + } + else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) { if (_zip_cdir_set_comment(cd, za) == -1) { _zip_cdir_free(cd); + free(filelist); return -1; } + } if ((temp=_zip_create_temp_output(za, &out)) == NULL) { _zip_cdir_free(cd); return -1; } - error = 0; + + /* create list of files with index into original archive */ for (i=j=0; i<za->nentry; i++) { if (za->entry[i].state == ZIP_ST_DELETED) continue; + filelist[j].idx = i; + filelist[j].name = zip_get_name(za, i, 0); + j++; + } + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + qsort(filelist, survivors, sizeof(filelist[0]), + _zip_torrentzip_cmp); + + new_torrentzip = (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 1 + && zip_get_archive_flag(za, ZIP_AFL_TORRENT, + ZIP_FL_UNCHANGED) == 0); + error = 0; + for (j=0; j<survivors; j++) { + i = filelist[j].idx; + /* create new local directory entry */ - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { + if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { _zip_dirent_init(&de); + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(&de); + /* use it as central directory entry */ memcpy(cd->entry+j, &de, sizeof(cd->entry[j])); /* set/update file name */ if (za->entry[i].ch_filename == NULL) { - if (za->entry[i].state == ZIP_ST_REPLACED) { - de.filename = strdup(za->cdir->entry[i].filename); - de.filename_len = strlen(de.filename); - cd->entry[j].filename = za->cdir->entry[i].filename; - cd->entry[j].filename_len = de.filename_len; - } - else { + if (za->entry[i].state == ZIP_ST_ADDED) { de.filename = strdup("-"); de.filename_len = 1; cd->entry[j].filename = "-"; + } + else { + de.filename = strdup(za->cdir->entry[i].filename); + de.filename_len = strlen(de.filename); + cd->entry[j].filename = za->cdir->entry[i].filename; cd->entry[j].filename_len = de.filename_len; } } @@ -147,7 +199,7 @@ de.crc = za->cdir->entry[i].crc; de.comp_size = za->cdir->entry[i].comp_size; de.uncomp_size = za->cdir->entry[i].uncomp_size; - /* de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; */ + de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; } memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j])); } @@ -163,7 +215,8 @@ cd->entry[j].filename_len = de.filename_len; } - if (za->entry[i].ch_comment_len != -1) { + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0 + && za->entry[i].ch_comment_len != -1) { /* as the rest of cd entries, its malloc/free is done by za */ cd->entry[j].comment = za->entry[i].ch_comment; cd->entry[j].comment_len = za->entry[i].ch_comment_len; @@ -171,8 +224,19 @@ cd->entry[j].offset = ftello(out); - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { - if (add_data(za, i, &de, out) < 0) { + if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { + struct zip_source *zs; + + zs = NULL; + if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { + if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) + == NULL) { + error = 1; + break; + } + } + + if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) { error = 1; break; } @@ -195,13 +259,11 @@ } } - j++; - _zip_dirent_finalize(&de); } if (!error) { - if (_zip_cdir_write(cd, out, &za->error) < 0) + if (write_cdir(za, cd, out) < 0) error = 1; } @@ -252,15 +314,15 @@ static int -add_data(struct zip *za, int idx, struct zip_dirent *de, FILE *ft) +add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft) { off_t offstart, offend; zip_source_callback cb; void *ud; struct zip_stat st; - cb = za->entry[idx].source->f; - ud = za->entry[idx].source->ud; + cb = zs->f; + ud = zs->ud; if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) { ch_set_error(&za->error, cb, ud); @@ -282,7 +344,7 @@ return -1; } else { - if (add_data_uncomp(cb, ud, &st, ft, &za->error) < 0) + if (add_data_uncomp(za, cb, ud, &st, ft) < 0) return -1; } @@ -298,12 +360,16 @@ return -1; } - de->comp_method = st.comp_method; + de->last_mod = st.mtime; + de->comp_method = st.comp_method; de->crc = st.crc; de->uncomp_size = st.size; de->comp_size = st.comp_size; + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(de); + if (_zip_dirent_write(de, ft, 1, &za->error) < 0) return -1; @@ -344,14 +410,15 @@ static int -add_data_uncomp(zip_source_callback cb, void *ud, struct zip_stat *st, - FILE *ft, struct zip_error *error) +add_data_uncomp(struct zip *za, zip_source_callback cb, void *ud, + struct zip_stat *st, FILE *ft) { char b1[BUFSIZE], b2[BUFSIZE]; int end, flush, ret; ssize_t n; size_t n2; z_stream zstr; + int mem_level; st->comp_method = ZIP_CM_DEFLATE; st->comp_size = st->size = 0; @@ -363,8 +430,13 @@ zstr.avail_in = 0; zstr.avail_out = 0; - /* -15: undocumented feature of zlib to _not_ write a zlib header */ - deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -15, 9, + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + mem_level = TORRENT_MEM_LEVEL; + else + mem_level = MAX_MEM_LEVEL; + + /* -MAX_WBITS: undocumented feature of zlib to _not_ write a zlib header */ + deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, mem_level, Z_DEFAULT_STRATEGY); zstr.next_out = (Bytef *)b2; @@ -376,7 +448,7 @@ while (!end) { if (zstr.avail_in == 0 && !flush) { if ((n=cb(ud, b1, sizeof(b1), ZIP_SOURCE_READ)) < 0) { - ch_set_error(error, cb, ud); + ch_set_error(&za->error, cb, ud); deflateEnd(&zstr); return -1; } @@ -392,7 +464,7 @@ ret = deflate(&zstr, flush); if (ret != Z_OK && ret != Z_STREAM_END) { - _zip_error_set(error, ZIP_ER_ZLIB, ret); + _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); return -1; } @@ -400,7 +472,7 @@ n2 = sizeof(b2) - zstr.avail_out; if (fwrite(b2, 1, n2, ft) != n2) { - _zip_error_set(error, ZIP_ER_WRITE, errno); + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); return -1; } @@ -471,6 +543,44 @@ static int +write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) +{ + off_t offset; + uLong crc; + char buf[TORRENT_CRC_LEN+1]; + + if (_zip_cdir_write(cd, out, &za->error) < 0) + return -1; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0) + return 0; + + + /* fix up torrentzip comment */ + + offset = ftello(out); + + if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0) + return -1; + + snprintf(buf, sizeof(buf), "%08lX", (long)crc); + + if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fwrite(buf, TORRENT_CRC_LEN, 1, out) != 1) { + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +static int _zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src) { if (src->ch_comment_len != -1) { @@ -501,7 +611,8 @@ changed = survivors = 0; - if (za->ch_comment_len != -1) + if (za->ch_comment_len != -1 + || za->ch_flags != za->flags) changed = 1; for (i=0; i<za->nentry; i++) { @@ -550,3 +661,12 @@ *outp = tfp; return temp; } + + + +static int +_zip_torrentzip_cmp(const void *a, const void *b) +{ + return strcasecmp(((const struct filelist *)a)->name, + ((const struct filelist *)b)->name); +} http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_dirent.c?r1=1.1.2.2.2.2&r2=1.1.2.2.2.3&diff_format=u Index: php-src/ext/zip/lib/zip_dirent.c diff -u php-src/ext/zip/lib/zip_dirent.c:1.1.2.2.2.2 php-src/ext/zip/lib/zip_dirent.c:1.1.2.2.2.3 --- php-src/ext/zip/lib/zip_dirent.c:1.1.2.2.2.2 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_dirent.c Thu Aug 7 23:24:11 2008 @@ -1,6 +1,6 @@ /* zip_dirent.c -- read directory entry (local or central), clean dirent - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> @@ -318,6 +318,63 @@ +/* _zip_dirent_torrent_normalize(de); + Set values suitable for torrentzip. +*/ + +void +_zip_dirent_torrent_normalize(struct zip_dirent *de) +{ + static struct tm torrenttime; + static time_t last_mod = 0; + + if (last_mod == 0) { +#ifdef HAVE_STRUCT_TM_TM_ZONE + time_t now; + struct tm *l; +#endif + + torrenttime.tm_sec = 0; + torrenttime.tm_min = 32; + torrenttime.tm_hour = 23; + torrenttime.tm_mday = 24; + torrenttime.tm_mon = 11; + torrenttime.tm_year = 96; + torrenttime.tm_wday = 0; + torrenttime.tm_yday = 0; + torrenttime.tm_isdst = 0; + +#ifdef HAVE_STRUCT_TM_TM_ZONE + time(&now); + l = localtime(&now); + torrenttime.tm_gmtoff = l->tm_gmtoff; + torrenttime.tm_zone = l->tm_zone; +#endif + + last_mod = mktime(&torrenttime); + } + + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 2; /* maximum compression */ + de->comp_method = ZIP_CM_DEFLATE; + de->last_mod = last_mod; + + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + de->offset = 0; + + free(de->extrafield); + de->extrafield = NULL; + de->extrafield_len = 0; + free(de->comment); + de->comment = NULL; + de->comment_len = 0; +} + + + /* _zip_dirent_write(zde, fp, localp, error): Writes zip directory entry zde to file fp. http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_err_str.c?r1=1.1.4.1&r2=1.1.4.2&diff_format=u Index: php-src/ext/zip/lib/zip_err_str.c diff -u php-src/ext/zip/lib/zip_err_str.c:1.1.4.1 php-src/ext/zip/lib/zip_err_str.c:1.1.4.2 --- php-src/ext/zip/lib/zip_err_str.c:1.1.4.1 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_err_str.c Thu Aug 7 23:24:11 2008 @@ -1,6 +1,6 @@ /* - This file was generated automatically by make_zip_err_str.sh - from zip.h; make changes there. + This file was generated automatically by ./make_zip_err_str.sh + from ./zip.h; make changes there. */ #include "zipint.h" http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_open.c?r1=1.1.2.4.2.3&r2=1.1.2.4.2.4&diff_format=u Index: php-src/ext/zip/lib/zip_open.c diff -u php-src/ext/zip/lib/zip_open.c:1.1.2.4.2.3 php-src/ext/zip/lib/zip_open.c:1.1.2.4.2.4 --- php-src/ext/zip/lib/zip_open.c:1.1.2.4.2.3 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_open.c Thu Aug 7 23:24:11 2008 @@ -310,9 +310,8 @@ _zip_check_torrentzip(struct zip *za) { uLong crc_got, crc_should; + char buf[8+1]; char *end; - Bytef buf[BUFSIZE]; - unsigned int n, remain; if (za->zp == NULL || za->cdir == NULL) return; @@ -321,27 +320,17 @@ || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0) return; + memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8); + buf[8] = '\0'; errno = 0; - crc_should = strtoul(za->cdir->comment+TORRENT_SIG_LEN, &end, 16); + crc_should = strtoul(buf, &end, 16); if ((crc_should == UINT_MAX && errno != 0) || (end && *end)) return; - crc_got = crc32(0L, Z_NULL, 0); - - if (fseek(za->zp, za->cdir->offset, SEEK_SET) != 0) - return; - remain = za->cdir->size; - - while (remain > 0) { - n = remain > BUFSIZE ? BUFSIZE : remain; - if ((n=fread(buf, 1, n, za->zp)) <= 0) + if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size, + &crc_got, NULL) < 0) return; - crc_got = crc32(crc_got, buf, n); - - remain -= n; - } - if (crc_got == crc_should) za->flags |= ZIP_AFL_TORRENT; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_rename.c?r1=1.1.4.2&r2=1.1.4.3&diff_format=u Index: php-src/ext/zip/lib/zip_rename.c diff -u php-src/ext/zip/lib/zip_rename.c:1.1.4.2 php-src/ext/zip/lib/zip_rename.c:1.1.4.3 --- php-src/ext/zip/lib/zip_rename.c:1.1.4.2 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_rename.c Thu Aug 7 23:24:11 2008 @@ -1,6 +1,6 @@ /* zip_rename.c -- rename file in zip archive - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> @@ -33,6 +33,8 @@ +#include <string.h> + #include "zipint.h" @@ -40,7 +42,21 @@ ZIP_EXTERN(int) zip_rename(struct zip *za, int idx, const char *name) { - if (idx >= za->nentry || idx < 0) { + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || idx < 0 || name[0] == '\0') { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((old_name=zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name[strlen(name)-1] == '/'); + old_is_dir = (old_name[strlen(old_name)-1] == '/'); + + if (new_is_dir != old_is_dir) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_file.c?r1=1.1.2.1.2.2&r2=1.1.2.1.2.3&diff_format=u Index: php-src/ext/zip/lib/zip_source_file.c diff -u php-src/ext/zip/lib/zip_source_file.c:1.1.2.1.2.2 php-src/ext/zip/lib/zip_source_file.c:1.1.2.1.2.3 --- php-src/ext/zip/lib/zip_source_file.c:1.1.2.1.2.2 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_source_file.c Thu Aug 7 23:24:11 2008 @@ -1,6 +1,6 @@ /* zip_source_file.c -- create data source from file - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> @@ -43,9 +43,6 @@ ZIP_EXTERN(struct zip_source *) zip_source_file(struct zip *za, const char *fname, off_t start, off_t len) { - struct zip_source *zs; - FILE *fp; - if (za == NULL) return NULL; @@ -54,15 +51,5 @@ return NULL; } - if ((fp=fopen(fname, "rb")) == NULL) { - _zip_error_set(&za->error, ZIP_ER_OPEN, errno); - return NULL; - } - - if ((zs=zip_source_filep(za, fp, start, len)) == NULL) { - fclose(fp); - return NULL; - } - - return zs; + return _zip_source_file_or_p(za, fname, NULL, start, len); } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_filep.c?r1=1.1.2.2.2.3&r2=1.1.2.2.2.4&diff_format=u Index: php-src/ext/zip/lib/zip_source_filep.c diff -u php-src/ext/zip/lib/zip_source_filep.c:1.1.2.2.2.3 php-src/ext/zip/lib/zip_source_filep.c:1.1.2.2.2.4 --- php-src/ext/zip/lib/zip_source_filep.c:1.1.2.2.2.3 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_source_filep.c Thu Aug 7 23:24:11 2008 @@ -1,6 +1,6 @@ /* zip_source_filep.c -- create data source from FILE * - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> @@ -42,6 +42,7 @@ #include "zipint.h" struct read_file { + char *fname; /* name of file to copy from */ FILE *f; /* file to copy from */ off_t off; /* start offset of */ off_t len; /* lengt of data to copy */ @@ -57,9 +58,6 @@ ZIP_EXTERN(struct zip_source *) zip_source_filep(struct zip *za, FILE *file, off_t start, off_t len) { - struct read_file *f; - struct zip_source *zs; - if (za == NULL) return NULL; @@ -68,11 +66,36 @@ return NULL; } + return _zip_source_file_or_p(za, NULL, file, start, len); +} + + + +struct zip_source * +_zip_source_file_or_p(struct zip *za, const char *fname, FILE *file, + off_t start, off_t len) +{ + struct read_file *f; + struct zip_source *zs; + + if (file == NULL && fname == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } + f->fname = NULL; + if (fname) { + if ((f->fname=strdup(fname)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + free(f); + return NULL; + } + } f->f = file; f->off = start; f->len = (len ? len : -1); @@ -99,6 +122,14 @@ switch (cmd) { case ZIP_SOURCE_OPEN: + if (z->fname) { + if ((z->f=fopen(z->fname, "rb")) == NULL) { + z->e[0] = ZIP_ER_OPEN; + z->e[1] = errno; + return -1; + } + } + if (fseeko(z->f, z->off, SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; @@ -125,17 +156,27 @@ return i; case ZIP_SOURCE_CLOSE: + if (z->fname) { + fclose(z->f); + z->f = NULL; + } return 0; case ZIP_SOURCE_STAT: { struct zip_stat *st; struct stat fst; + int err; if (len < sizeof(*st)) return -1; - if (fstat(fileno(z->f), &fst) != 0) { + if (z->f) + err = fstat(fileno(z->f), &fst); + else + err = stat(z->fname, &fst); + + if (err != 0) { z->e[0] = ZIP_ER_READ; /* best match */ z->e[1] = errno; return -1; @@ -161,6 +202,8 @@ return sizeof(int)*2; case ZIP_SOURCE_FREE: + free(z->fname); + if (z->f) fclose(z->f); free(z); return 0; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_source_zip.c?r1=1.1.4.2&r2=1.1.4.3&diff_format=u Index: php-src/ext/zip/lib/zip_source_zip.c diff -u php-src/ext/zip/lib/zip_source_zip.c:1.1.4.2 php-src/ext/zip/lib/zip_source_zip.c:1.1.4.3 --- php-src/ext/zip/lib/zip_source_zip.c:1.1.4.2 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_source_zip.c Thu Aug 7 23:24:11 2008 @@ -57,6 +57,8 @@ struct zip_source *zs; struct read_zip *p; + /* XXX: ZIP_FL_RECOMPRESS */ + if (za == NULL) return NULL; @@ -74,7 +76,7 @@ if (len == 0) len = -1; - if (start == 0 && len == -1) + if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0) flags |= ZIP_FL_COMPRESSED; else flags &= ~ZIP_FL_COMPRESSED; http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_unchange_archive.c?r1=1.1.4.2&r2=1.1.4.3&diff_format=u Index: php-src/ext/zip/lib/zip_unchange_archive.c diff -u php-src/ext/zip/lib/zip_unchange_archive.c:1.1.4.2 php-src/ext/zip/lib/zip_unchange_archive.c:1.1.4.3 --- php-src/ext/zip/lib/zip_unchange_archive.c:1.1.4.2 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zip_unchange_archive.c Thu Aug 7 23:24:11 2008 @@ -1,6 +1,6 @@ /* zip_unchange_archive.c -- undo global changes to ZIP archive - Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> @@ -34,7 +34,7 @@ #include <stdlib.h> -#include "zip.h" + #include "zipint.h" @@ -46,5 +46,7 @@ za->ch_comment = NULL; za->ch_comment_len = -1; + za->ch_flags = za->flags; + return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zipint.h?r1=1.1.2.1.2.3&r2=1.1.2.1.2.4&diff_format=u Index: php-src/ext/zip/lib/zipint.h diff -u php-src/ext/zip/lib/zipint.h:1.1.2.1.2.3 php-src/ext/zip/lib/zipint.h:1.1.2.1.2.4 --- php-src/ext/zip/lib/zipint.h:1.1.2.1.2.3 Wed May 21 09:27:41 2008 +++ php-src/ext/zip/lib/zipint.h Thu Aug 7 23:24:11 2008 @@ -67,6 +67,8 @@ #define DATADES_MAGIC "PK\7\8" #define TORRENT_SIG "TORRENTZIPPED-" #define TORRENT_SIG_LEN 14 +#define TORRENT_CRC_LEN 8 +#define TORRENT_MEM_LEVEL 8 #define CDENTRYSIZE 46u #define LENTRYSIZE 30 #define MAXCOMLEN 65536 @@ -208,6 +210,7 @@ +int _zip_cdir_compute_crc(struct zip *, uLong *); void _zip_cdir_free(struct zip_cdir *); struct zip_cdir *_zip_cdir_new(int, struct zip_error *); int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); @@ -216,6 +219,7 @@ void _zip_dirent_init(struct zip_dirent *); int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **, unsigned int, int, struct zip_error *); +void _zip_dirent_torrent_normalize(struct zip_dirent *); int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); void _zip_entry_free(struct zip_entry *); @@ -233,6 +237,11 @@ int _zip_file_fillbuf(void *, size_t, struct zip_file *); unsigned int _zip_file_get_offset(struct zip *, int); +int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *); + +struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *, + off_t, off_t); + void _zip_free(struct zip *); const char *_zip_get_name(struct zip *, int, int, struct zip_error *); int _zip_local_header_read(struct zip *, int); http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_filerange_crc.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_filerange_crc.c +++ php-src/ext/zip/lib/zip_filerange_crc.c /* zip_filerange_crc.c -- compute CRC32 for a range of a file Copyright (C) 2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <errno.h> #include "zipint.h" int _zip_filerange_crc(FILE *fp, off_t start, off_t len, uLong *crcp, struct zip_error *errp) { Bytef buf[BUFSIZE]; size_t n; *crcp = crc32(0L, Z_NULL, 0); if (fseeko(fp, start, SEEK_SET) != 0) { _zip_error_set(errp, ZIP_ER_SEEK, errno); return -1; } while (len > 0) { n = len > BUFSIZE ? BUFSIZE : len; if ((n=fread(buf, 1, n, fp)) <= 0) { _zip_error_set(errp, ZIP_ER_READ, errno); return -1; } *crcp = crc32(*crcp, buf, n); len-= n; } return 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_get_archive_flag.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_get_archive_flag.c +++ php-src/ext/zip/lib/zip_get_archive_flag.c /* zip_get_archive_flag.c -- get archive global flag Copyright (C) 2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zipint.h" ZIP_EXTERN(int) zip_get_archive_flag(struct zip *za, int flag, int flags) { int fl; fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; return (fl & flag) ? 1 : 0; } http://cvs.php.net/viewvc.cgi/php-src/ext/zip/lib/zip_set_archive_flag.c?view=markup&rev=1.1 Index: php-src/ext/zip/lib/zip_set_archive_flag.c +++ php-src/ext/zip/lib/zip_set_archive_flag.c /* zip_get_archive_flag.c -- set archive global flag Copyright (C) 2008 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at <[EMAIL PROTECTED]> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "zipint.h" ZIP_EXTERN(int) zip_set_archive_flag(struct zip *za, int flag, int value) { if (value) za->ch_flags |= flag; else za->ch_flags &= ~flag; return 0; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php