Annotation of embedaddon/php/ext/zip/lib/zipint.h, revision 1.1.1.1
1.1 misho 1: #ifndef _HAD_ZIPINT_H
2: #define _HAD_ZIPINT_H
3:
4: /*
5: zipint.h -- internal declarations.
6: Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
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:
41: #ifdef PHP_WIN32
42: #include <windows.h>
43: #include <wchar.h>
44: #define _zip_rename(s, t) \
45: (!MoveFileExA((s), (t), \
46: MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING))
47: #else
48: #define _zip_rename rename
49: #endif
50:
51: #ifndef strcasecmp
52: # define strcmpi strcasecmp
53: #endif
54:
55: #ifndef HAVE_FSEEKO
56: #define fseeko(s, o, w) (fseek((s), (long int)(o), (w)))
57: #endif
58: #ifndef HAVE_FTELLO
59: #define ftello(s) ((long)ftell((s)))
60: #endif
61:
62:
63:
64: #define CENTRAL_MAGIC "PK\1\2"
65: #define LOCAL_MAGIC "PK\3\4"
66: #define EOCD_MAGIC "PK\5\6"
67: #define DATADES_MAGIC "PK\7\8"
68: #define TORRENT_SIG "TORRENTZIPPED-"
69: #define TORRENT_SIG_LEN 14
70: #define TORRENT_CRC_LEN 8
71: #define TORRENT_MEM_LEVEL 8
72: #define CDENTRYSIZE 46u
73: #define LENTRYSIZE 30
74: #undef MAXCOMLEN /* defined as 19 on BSD for max command name */
75: #define MAXCOMLEN 65536
76: #define EOCDLEN 22
77: #define CDBUFSIZE (MAXCOMLEN+EOCDLEN)
78: #define BUFSIZE 8192
79:
80:
81:
82: /* state of change of a file in zip archive */
83:
84: enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED,
85: ZIP_ST_ADDED, ZIP_ST_RENAMED };
86:
87: /* constants for struct zip_file's member flags */
88:
89: #define ZIP_ZF_EOF 1 /* EOF reached */
90: #define ZIP_ZF_DECOMP 2 /* decompress data */
91: #define ZIP_ZF_CRC 4 /* compute and compare CRC */
92:
93: /* directory entry: general purpose bit flags */
94:
95: #define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */
96: #define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */
97: #define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */
98:
99: /* error information */
100:
101: struct zip_error {
102: int zip_err; /* libzip error code (ZIP_ER_*) */
103: int sys_err; /* copy of errno (E*) or zlib error code */
104: char *str; /* string representation or NULL */
105: };
106:
107: /* zip archive, part of API */
108:
109: struct zip {
110: char *zn; /* file name */
111: FILE *zp; /* file */
112: struct zip_error error; /* error information */
113:
114: unsigned int flags; /* archive global flags */
115: unsigned int ch_flags; /* changed archive global flags */
116:
117: struct zip_cdir *cdir; /* central directory */
118: char *ch_comment; /* changed archive comment */
119: int ch_comment_len; /* length of changed zip archive
120: * comment, -1 if unchanged */
121: int nentry; /* number of entries */
122: int nentry_alloc; /* number of entries allocated */
123: struct zip_entry *entry; /* entries */
124: int nfile; /* number of opened files within archive */
125: int nfile_alloc; /* number of files allocated */
126: struct zip_file **file; /* opened files within archive */
127: };
128:
129: /* file in zip archive, part of API */
130:
131: struct zip_file {
132: struct zip *za; /* zip archive containing this file */
133: struct zip_error error; /* error information */
134: int flags; /* -1: eof, >0: error */
135:
136: int method; /* compression method */
137: off_t fpos; /* position within zip file (fread/fwrite) */
138: unsigned long bytes_left; /* number of bytes left to read */
139: unsigned long cbytes_left; /* number of bytes of compressed data left */
140:
141: unsigned long crc; /* CRC so far */
142: unsigned long crc_orig; /* CRC recorded in archive */
143:
144: char *buffer;
145: z_stream *zstr;
146: };
147:
148: /* zip archive directory entry (central or local) */
149:
150: struct zip_dirent {
151: unsigned short version_madeby; /* (c) version of creator */
152: unsigned short version_needed; /* (cl) version needed to extract */
153: unsigned short bitflags; /* (cl) general purpose bit flag */
154: unsigned short comp_method; /* (cl) compression method used */
155: time_t last_mod; /* (cl) time of last modification */
156: unsigned int crc; /* (cl) CRC-32 of uncompressed data */
157: unsigned int comp_size; /* (cl) size of commpressed data */
158: unsigned int uncomp_size; /* (cl) size of uncommpressed data */
159: char *filename; /* (cl) file name (NUL-terminated) */
160: unsigned short filename_len; /* (cl) length of filename (w/o NUL) */
161: char *extrafield; /* (cl) extra field */
162: unsigned short extrafield_len; /* (cl) length of extra field */
163: char *comment; /* (c) file comment */
164: unsigned short comment_len; /* (c) length of file comment */
165: unsigned short disk_number; /* (c) disk number start */
166: unsigned short int_attrib; /* (c) internal file attributes */
167: unsigned int ext_attrib; /* (c) external file attributes */
168: unsigned int offset; /* (c) offset of local header */
169: };
170:
171: /* zip archive central directory */
172:
173: struct zip_cdir {
174: struct zip_dirent *entry; /* directory entries */
175: int nentry; /* number of entries */
176:
177: unsigned int size; /* size of central direcotry */
178: unsigned int offset; /* offset of central directory in file */
179: char *comment; /* zip archive comment */
180: unsigned short comment_len; /* length of zip archive comment */
181: };
182:
183:
184:
185: struct zip_source {
186: zip_source_callback f;
187: void *ud;
188: };
189:
190: /* entry in zip archive directory */
191:
192: struct zip_entry {
193: enum zip_state state;
194: struct zip_source *source;
195: char *ch_filename;
196: char *ch_comment;
197: int ch_comment_len;
198: };
199:
200:
201:
202: extern const char * const _zip_err_str[];
203: extern const int _zip_nerr_str;
204: extern const int _zip_err_type[];
205:
206:
207:
208: #define ZIP_ENTRY_DATA_CHANGED(x) \
209: ((x)->state == ZIP_ST_REPLACED \
210: || (x)->state == ZIP_ST_ADDED)
211:
212:
213:
214: int _zip_cdir_compute_crc(struct zip *, uLong *);
215: void _zip_cdir_free(struct zip_cdir *);
216: int _zip_cdir_grow(struct zip_cdir *, int, struct zip_error *);
217: struct zip_cdir *_zip_cdir_new(int, struct zip_error *);
218: int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *);
219:
220: void _zip_dirent_finalize(struct zip_dirent *);
221: void _zip_dirent_init(struct zip_dirent *);
222: int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **,
223: unsigned int *, int, struct zip_error *);
224: void _zip_dirent_torrent_normalize(struct zip_dirent *);
225: int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *);
226:
227: void _zip_entry_free(struct zip_entry *);
228: void _zip_entry_init(struct zip *, int);
229: struct zip_entry *_zip_entry_new(struct zip *);
230:
231: void _zip_error_clear(struct zip_error *);
232: void _zip_error_copy(struct zip_error *, struct zip_error *);
233: void _zip_error_fini(struct zip_error *);
234: void _zip_error_get(struct zip_error *, int *, int *);
235: void _zip_error_init(struct zip_error *);
236: void _zip_error_set(struct zip_error *, int, int);
237: const char *_zip_error_strerror(struct zip_error *);
238:
239: int _zip_file_fillbuf(void *, size_t, struct zip_file *);
240: unsigned int _zip_file_get_offset(struct zip *, int);
241:
242: int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *);
243:
244: struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *,
245: off_t, off_t);
246:
247: void _zip_free(struct zip *);
248: const char *_zip_get_name(struct zip *, int, int, struct zip_error *);
249: int _zip_local_header_read(struct zip *, int);
250: void *_zip_memdup(const void *, size_t, struct zip_error *);
251: int _zip_name_locate(struct zip *, const char *, int, struct zip_error *);
252: struct zip *_zip_new(struct zip_error *);
253: unsigned short _zip_read2(unsigned char **);
254: unsigned int _zip_read4(unsigned char **);
255: int _zip_replace(struct zip *, int, const char *, struct zip_source *);
256: int _zip_set_name(struct zip *, int, const char *);
257: int _zip_unchange(struct zip *, int, int);
258: void _zip_unchange_data(struct zip_entry *);
259:
260: #endif /* zipint.h */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>