Annotation of embedaddon/php/ext/zip/lib/zipint.h, revision 1.1.1.2
1.1 misho 1: #ifndef _HAD_ZIPINT_H
2: #define _HAD_ZIPINT_H
3:
4: /*
5: zipint.h -- internal declarations.
1.1.1.2 ! misho 6: Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
1.1 misho 7:
8: This file is part of libzip, a library to manipulate ZIP archives.
9: The authors can be contacted at <libzip@nih.at>
10:
11: Redistribution and use in source and binary forms, with or without
12: modification, are permitted provided that the following conditions
13: are met:
14: 1. Redistributions of source code must retain the above copyright
15: notice, this list of conditions and the following disclaimer.
16: 2. Redistributions in binary form must reproduce the above copyright
17: notice, this list of conditions and the following disclaimer in
18: the documentation and/or other materials provided with the
19: distribution.
20: 3. The names of the authors may not be used to endorse or promote
21: products derived from this software without specific prior
22: written permission.
23:
24: THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
25: OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
28: DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
30: GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31: INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
32: IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
33: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
34: IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35: */
36:
37: #include <zlib.h>
38:
39: #include "zip.h"
40:
1.1.1.2 ! misho 41: #ifndef HAVE_FSEEKO
! 42: #define fseeko(s, o, w) (fseek((s), (long int)(o), (w)))
! 43: #endif
! 44:
! 45: #ifndef HAVE_FTELLO
! 46: #define ftello(s) ((long)ftell((s)))
! 47: #endif
! 48:
! 49: #ifndef PHP_WIN32
! 50: #ifndef HAVE_MKSTEMP
! 51: int _zip_mkstemp(char *);
! 52: #define mkstemp _zip_mkstemp
! 53: #endif
! 54: #endif
! 55:
1.1 misho 56: #ifdef PHP_WIN32
57: #include <windows.h>
58: #include <wchar.h>
59: #define _zip_rename(s, t) \
60: (!MoveFileExA((s), (t), \
61: MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING))
1.1.1.2 ! misho 62:
! 63: /* for dup(), close(), etc. */
! 64: #include <io.h>
! 65:
! 66: #if !defined(HAVE_OPEN)
! 67: #if defined(HAVE__OPEN)
! 68: #define open(a, b, c) _open((a), (b))
! 69: #endif
! 70: #endif
! 71:
1.1 misho 72: #else
73: #define _zip_rename rename
74: #endif
75:
76: #ifndef strcasecmp
77: # define strcmpi strcasecmp
78: #endif
79:
80:
81:
82:
83: #define CENTRAL_MAGIC "PK\1\2"
84: #define LOCAL_MAGIC "PK\3\4"
85: #define EOCD_MAGIC "PK\5\6"
86: #define DATADES_MAGIC "PK\7\8"
87: #define TORRENT_SIG "TORRENTZIPPED-"
88: #define TORRENT_SIG_LEN 14
89: #define TORRENT_CRC_LEN 8
90: #define TORRENT_MEM_LEVEL 8
91: #define CDENTRYSIZE 46u
92: #define LENTRYSIZE 30
93: #undef MAXCOMLEN /* defined as 19 on BSD for max command name */
94: #define MAXCOMLEN 65536
1.1.1.2 ! misho 95: #define MAXEXTLEN 65536
1.1 misho 96: #define EOCDLEN 22
97: #define CDBUFSIZE (MAXCOMLEN+EOCDLEN)
98: #define BUFSIZE 8192
99:
100:
101:
1.1.1.2 ! misho 102: /* This section contains API that won't materialize like this. It's
! 103: placed in the internal section, pending cleanup. */
! 104:
! 105: typedef struct zip_source *(*zip_compression_implementation)(struct zip *,
! 106: struct zip_source *,
! 107: zip_uint16_t, int);
! 108: typedef struct zip_source *(*zip_encryption_implementation)(struct zip *,
! 109: struct zip_source *,
! 110: zip_uint16_t, int,
! 111: const char *);
! 112:
! 113: ZIP_EXTERN(zip_compression_implementation) zip_get_compression_implementation(
! 114: zip_uint16_t);
! 115: ZIP_EXTERN(zip_encryption_implementation) zip_get_encryption_implementation(
! 116: zip_uint16_t);
! 117:
! 118:
! 119:
! 120:
! 121: /* This section contains API that is of limited use until support for
! 122: user-supplied compression/encryption implementation is finished.
! 123: Thus we will keep it private for now. */
! 124:
! 125: typedef zip_int64_t (*zip_source_layered_callback)(struct zip_source *, void *,
! 126: void *, zip_uint64_t,
! 127: enum zip_source_cmd);
! 128:
! 129: ZIP_EXTERN(void) zip_source_close(struct zip_source *);
! 130: ZIP_EXTERN(struct zip_source *)zip_source_crc(struct zip *, struct zip_source *,
! 131: int);
! 132: ZIP_EXTERN(struct zip_source *)zip_source_deflate(struct zip *,
! 133: struct zip_source *,
! 134: zip_uint16_t, int);
! 135: ZIP_EXTERN(void) zip_source_error(struct zip_source *, int *, int *);
! 136: ZIP_EXTERN(struct zip_source *)zip_source_layered(struct zip *,
! 137: struct zip_source *,
! 138: zip_source_layered_callback,
! 139: void *);
! 140: ZIP_EXTERN(int) zip_source_open(struct zip_source *);
! 141: ZIP_EXTERN(struct zip_source *)zip_source_pkware(struct zip *,
! 142: struct zip_source *,
! 143: zip_uint16_t, int,
! 144: const char *);
! 145: ZIP_EXTERN(zip_int64_t) zip_source_read(struct zip_source *, void *,
! 146: zip_uint64_t);
! 147: ZIP_EXTERN(int) zip_source_stat(struct zip_source *, struct zip_stat *);
! 148:
! 149:
! 150: /* This function will probably remain private. It is not needed to
! 151: implement compression/encryption routines. (We should probably
! 152: rename it to _zip_source_pop.) */
! 153:
! 154: ZIP_EXTERN(struct zip_source *)zip_source_pop(struct zip_source *);
! 155:
! 156:
! 157:
1.1 misho 158: /* state of change of a file in zip archive */
159:
160: enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED,
161: ZIP_ST_ADDED, ZIP_ST_RENAMED };
162:
1.1.1.2 ! misho 163: /* error source for layered sources */
1.1 misho 164:
1.1.1.2 ! misho 165: enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL };
1.1 misho 166:
167: /* directory entry: general purpose bit flags */
168:
169: #define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */
170: #define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */
171: #define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */
172:
173: /* error information */
174:
175: struct zip_error {
176: int zip_err; /* libzip error code (ZIP_ER_*) */
177: int sys_err; /* copy of errno (E*) or zlib error code */
178: char *str; /* string representation or NULL */
179: };
180:
181: /* zip archive, part of API */
182:
183: struct zip {
184: char *zn; /* file name */
185: FILE *zp; /* file */
186: struct zip_error error; /* error information */
187:
188: unsigned int flags; /* archive global flags */
189: unsigned int ch_flags; /* changed archive global flags */
190:
1.1.1.2 ! misho 191: char *default_password; /* password used when no other supplied */
! 192:
1.1 misho 193: struct zip_cdir *cdir; /* central directory */
194: char *ch_comment; /* changed archive comment */
195: int ch_comment_len; /* length of changed zip archive
196: * comment, -1 if unchanged */
1.1.1.2 ! misho 197: zip_uint64_t nentry; /* number of entries */
! 198: zip_uint64_t nentry_alloc; /* number of entries allocated */
1.1 misho 199: struct zip_entry *entry; /* entries */
200: int nfile; /* number of opened files within archive */
201: int nfile_alloc; /* number of files allocated */
202: struct zip_file **file; /* opened files within archive */
203: };
204:
205: /* file in zip archive, part of API */
206:
207: struct zip_file {
208: struct zip *za; /* zip archive containing this file */
209: struct zip_error error; /* error information */
1.1.1.2 ! misho 210: int eof;
! 211: struct zip_source *src; /* data source */
1.1 misho 212: };
213:
214: /* zip archive directory entry (central or local) */
215:
216: struct zip_dirent {
217: unsigned short version_madeby; /* (c) version of creator */
218: unsigned short version_needed; /* (cl) version needed to extract */
219: unsigned short bitflags; /* (cl) general purpose bit flag */
220: unsigned short comp_method; /* (cl) compression method used */
221: time_t last_mod; /* (cl) time of last modification */
222: unsigned int crc; /* (cl) CRC-32 of uncompressed data */
223: unsigned int comp_size; /* (cl) size of commpressed data */
224: unsigned int uncomp_size; /* (cl) size of uncommpressed data */
225: char *filename; /* (cl) file name (NUL-terminated) */
226: unsigned short filename_len; /* (cl) length of filename (w/o NUL) */
227: char *extrafield; /* (cl) extra field */
228: unsigned short extrafield_len; /* (cl) length of extra field */
229: char *comment; /* (c) file comment */
230: unsigned short comment_len; /* (c) length of file comment */
231: unsigned short disk_number; /* (c) disk number start */
232: unsigned short int_attrib; /* (c) internal file attributes */
233: unsigned int ext_attrib; /* (c) external file attributes */
234: unsigned int offset; /* (c) offset of local header */
235: };
236:
237: /* zip archive central directory */
238:
239: struct zip_cdir {
240: struct zip_dirent *entry; /* directory entries */
241: int nentry; /* number of entries */
242:
243: unsigned int size; /* size of central direcotry */
244: unsigned int offset; /* offset of central directory in file */
245: char *comment; /* zip archive comment */
246: unsigned short comment_len; /* length of zip archive comment */
247: };
248:
249:
250:
251: struct zip_source {
1.1.1.2 ! misho 252: struct zip_source *src;
! 253: union {
! 254: zip_source_callback f;
! 255: zip_source_layered_callback l;
! 256: } cb;
1.1 misho 257: void *ud;
1.1.1.2 ! misho 258: enum zip_les error_source;
! 259: int is_open;
1.1 misho 260: };
261:
262: /* entry in zip archive directory */
263:
264: struct zip_entry {
265: enum zip_state state;
266: struct zip_source *source;
267: char *ch_filename;
1.1.1.2 ! misho 268: char *ch_extra;
! 269: int ch_extra_len;
1.1 misho 270: char *ch_comment;
271: int ch_comment_len;
272: };
273:
274:
275:
276: extern const char * const _zip_err_str[];
277: extern const int _zip_nerr_str;
278: extern const int _zip_err_type[];
279:
280:
281:
282: #define ZIP_ENTRY_DATA_CHANGED(x) \
283: ((x)->state == ZIP_ST_REPLACED \
284: || (x)->state == ZIP_ST_ADDED)
285:
1.1.1.2 ! misho 286: #define ZIP_IS_RDONLY(za) ((za)->ch_flags & ZIP_AFL_RDONLY)
! 287:
1.1 misho 288:
289:
290: int _zip_cdir_compute_crc(struct zip *, uLong *);
291: void _zip_cdir_free(struct zip_cdir *);
292: int _zip_cdir_grow(struct zip_cdir *, int, struct zip_error *);
293: struct zip_cdir *_zip_cdir_new(int, struct zip_error *);
294: int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *);
295:
296: void _zip_dirent_finalize(struct zip_dirent *);
297: void _zip_dirent_init(struct zip_dirent *);
298: int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **,
1.1.1.2 ! misho 299: zip_uint32_t *, int, struct zip_error *);
1.1 misho 300: void _zip_dirent_torrent_normalize(struct zip_dirent *);
301: int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *);
302:
303: void _zip_entry_free(struct zip_entry *);
304: void _zip_entry_init(struct zip *, int);
305: struct zip_entry *_zip_entry_new(struct zip *);
306:
307: void _zip_error_clear(struct zip_error *);
308: void _zip_error_copy(struct zip_error *, struct zip_error *);
309: void _zip_error_fini(struct zip_error *);
310: void _zip_error_get(struct zip_error *, int *, int *);
311: void _zip_error_init(struct zip_error *);
312: void _zip_error_set(struct zip_error *, int, int);
1.1.1.2 ! misho 313: void _zip_error_set_from_source(struct zip_error *, struct zip_source *);
1.1 misho 314: const char *_zip_error_strerror(struct zip_error *);
315:
316: int _zip_file_fillbuf(void *, size_t, struct zip_file *);
317: unsigned int _zip_file_get_offset(struct zip *, int);
318:
319: int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *);
320:
1.1.1.2 ! misho 321: struct zip *_zip_open(const char *, FILE *, int, int, int *);
! 322:
1.1 misho 323: struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *,
1.1.1.2 ! misho 324: zip_uint64_t, zip_int64_t, int,
! 325: const struct zip_stat *);
! 326: struct zip_source *_zip_source_new(struct zip *);
1.1 misho 327:
1.1.1.2 ! misho 328: int _zip_changed(struct zip *, int *);
1.1 misho 329: void _zip_free(struct zip *);
1.1.1.2 ! misho 330: const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *);
1.1 misho 331: int _zip_local_header_read(struct zip *, int);
332: void *_zip_memdup(const void *, size_t, struct zip_error *);
333: int _zip_name_locate(struct zip *, const char *, int, struct zip_error *);
334: struct zip *_zip_new(struct zip_error *);
335: unsigned short _zip_read2(unsigned char **);
336: unsigned int _zip_read4(unsigned char **);
1.1.1.2 ! misho 337: zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *,
! 338: struct zip_source *);
! 339: int _zip_set_name(struct zip *, zip_uint64_t, const char *);
! 340: void _zip_u2d_time(time_t, unsigned short *, unsigned short *);
! 341: int _zip_unchange(struct zip *, zip_uint64_t, int);
1.1 misho 342: void _zip_unchange_data(struct zip_entry *);
343:
344: #endif /* zipint.h */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>