1 #ifndef _HAD_ZIP_H
2 #define _HAD_ZIP_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #ifndef ZIP_EXTERN
39 # ifndef ZIP_STATIC
40 # if defined(_WIN32) && defined(PHP_ZIP_EXPORTS)
41 # define ZIP_EXTERN __declspec(dllimport)
42 # elif defined(__GNUC__) && __GNUC__ >= 4
43 # define ZIP_EXTERN __attribute__ ((visibility ("default")))
44 # else
45 # define ZIP_EXTERN
46 # endif
47 # else
48 # define ZIP_EXTERN
49 # endif
50 #endif
51
52 #ifdef __cplusplus
53 extern "C" {
54 #if 0
55 }
56 #endif
57 #endif
58
59 #include <zipconf.h>
60
61 #include <sys/types.h>
62 #include <stdio.h>
63 #include <time.h>
64
65
66
67 #define ZIP_CREATE 1
68 #define ZIP_EXCL 2
69 #define ZIP_CHECKCONS 4
70 #define ZIP_TRUNCATE 8
71 #define ZIP_RDONLY 16
72
73
74
75
76 #define ZIP_FL_NOCASE 1u
77 #define ZIP_FL_NODIR 2u
78 #define ZIP_FL_COMPRESSED 4u
79 #define ZIP_FL_UNCHANGED 8u
80 #define ZIP_FL_RECOMPRESS 16u
81 #define ZIP_FL_ENCRYPTED 32u
82 #define ZIP_FL_ENC_GUESS 0u
83 #define ZIP_FL_ENC_RAW 64u
84 #define ZIP_FL_ENC_STRICT 128u
85 #define ZIP_FL_LOCAL 256u
86 #define ZIP_FL_CENTRAL 512u
87
88 #define ZIP_FL_ENC_UTF_8 2048u
89 #define ZIP_FL_ENC_CP437 4096u
90 #define ZIP_FL_OVERWRITE 8192u
91
92
93
94 #define ZIP_AFL_RDONLY 2u
95
96
97
98
99 #define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX
100 #define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX
101
102
103
104
105 #define ZIP_ER_OK 0
106 #define ZIP_ER_MULTIDISK 1
107 #define ZIP_ER_RENAME 2
108 #define ZIP_ER_CLOSE 3
109 #define ZIP_ER_SEEK 4
110 #define ZIP_ER_READ 5
111 #define ZIP_ER_WRITE 6
112 #define ZIP_ER_CRC 7
113 #define ZIP_ER_ZIPCLOSED 8
114 #define ZIP_ER_NOENT 9
115 #define ZIP_ER_EXISTS 10
116 #define ZIP_ER_OPEN 11
117 #define ZIP_ER_TMPOPEN 12
118 #define ZIP_ER_ZLIB 13
119 #define ZIP_ER_MEMORY 14
120 #define ZIP_ER_CHANGED 15
121 #define ZIP_ER_COMPNOTSUPP 16
122 #define ZIP_ER_EOF 17
123 #define ZIP_ER_INVAL 18
124 #define ZIP_ER_NOZIP 19
125 #define ZIP_ER_INTERNAL 20
126 #define ZIP_ER_INCONS 21
127 #define ZIP_ER_REMOVE 22
128 #define ZIP_ER_DELETED 23
129 #define ZIP_ER_ENCRNOTSUPP 24
130 #define ZIP_ER_RDONLY 25
131 #define ZIP_ER_NOPASSWD 26
132 #define ZIP_ER_WRONGPASSWD 27
133 #define ZIP_ER_OPNOTSUPP 28
134 #define ZIP_ER_INUSE 29
135 #define ZIP_ER_TELL 30
136
137
138
139 #define ZIP_ET_NONE 0
140 #define ZIP_ET_SYS 1
141 #define ZIP_ET_ZLIB 2
142
143
144
145 #define ZIP_CM_DEFAULT -1
146 #define ZIP_CM_STORE 0
147 #define ZIP_CM_SHRINK 1
148 #define ZIP_CM_REDUCE_1 2
149 #define ZIP_CM_REDUCE_2 3
150 #define ZIP_CM_REDUCE_3 4
151 #define ZIP_CM_REDUCE_4 5
152 #define ZIP_CM_IMPLODE 6
153
154 #define ZIP_CM_DEFLATE 8
155 #define ZIP_CM_DEFLATE64 9
156 #define ZIP_CM_PKWARE_IMPLODE 10
157
158 #define ZIP_CM_BZIP2 12
159
160 #define ZIP_CM_LZMA 14
161
162 #define ZIP_CM_TERSE 18
163 #define ZIP_CM_LZ77 19
164 #define ZIP_CM_WAVPACK 97
165 #define ZIP_CM_PPMD 98
166
167
168
169 #define ZIP_EM_NONE 0
170 #define ZIP_EM_TRAD_PKWARE 1
171 #if 0
172 #define ZIP_EM_DES 0x6601
173 #define ZIP_EM_RC2_OLD 0x6602
174 #define ZIP_EM_3DES_168 0x6603
175 #define ZIP_EM_3DES_112 0x6609
176 #define ZIP_EM_AES_128 0x660e
177 #define ZIP_EM_AES_192 0x660f
178 #define ZIP_EM_AES_256 0x6610
179 #define ZIP_EM_RC2 0x6702
180 #define ZIP_EM_RC4 0x6801
181 #endif
182 #define ZIP_EM_UNKNOWN 0xffff
183
184 #define ZIP_OPSYS_DOS 0x00u
185 #define ZIP_OPSYS_AMIGA 0x01u
186 #define ZIP_OPSYS_OPENVMS 0x02u
187 #define ZIP_OPSYS_UNIX 0x03u
188 #define ZIP_OPSYS_VM_CMS 0x04u
189 #define ZIP_OPSYS_ATARI_ST 0x05u
190 #define ZIP_OPSYS_OS_2 0x06u
191 #define ZIP_OPSYS_MACINTOSH 0x07u
192 #define ZIP_OPSYS_Z_SYSTEM 0x08u
193 #define ZIP_OPSYS_CPM 0x09u
194 #define ZIP_OPSYS_WINDOWS_NTFS 0x0au
195 #define ZIP_OPSYS_MVS 0x0bu
196 #define ZIP_OPSYS_VSE 0x0cu
197 #define ZIP_OPSYS_ACORN_RISC 0x0du
198 #define ZIP_OPSYS_VFAT 0x0eu
199 #define ZIP_OPSYS_ALTERNATE_MVS 0x0fu
200 #define ZIP_OPSYS_BEOS 0x10u
201 #define ZIP_OPSYS_TANDEM 0x11u
202 #define ZIP_OPSYS_OS_400 0x12u
203 #define ZIP_OPSYS_OS_X 0x13u
204
205 #define ZIP_OPSYS_DEFAULT ZIP_OPSYS_UNIX
206
207
208 enum zip_source_cmd {
209 ZIP_SOURCE_OPEN,
210 ZIP_SOURCE_READ,
211 ZIP_SOURCE_CLOSE,
212 ZIP_SOURCE_STAT,
213 ZIP_SOURCE_ERROR,
214 ZIP_SOURCE_FREE,
215 ZIP_SOURCE_SEEK,
216 ZIP_SOURCE_TELL,
217 ZIP_SOURCE_BEGIN_WRITE,
218 ZIP_SOURCE_COMMIT_WRITE,
219 ZIP_SOURCE_ROLLBACK_WRITE,
220 ZIP_SOURCE_WRITE,
221 ZIP_SOURCE_SEEK_WRITE,
222 ZIP_SOURCE_TELL_WRITE,
223 ZIP_SOURCE_SUPPORTS,
224 ZIP_SOURCE_REMOVE
225 };
226 typedef enum zip_source_cmd zip_source_cmd_t;
227
228 #define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd) (1<<(cmd))
229
230 #define ZIP_SOURCE_SUPPORTS_READABLE (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_OPEN) \
231 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_READ) \
232 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_CLOSE) \
233 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_STAT) \
234 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ERROR) \
235 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_FREE))
236
237 #define ZIP_SOURCE_SUPPORTS_SEEKABLE (ZIP_SOURCE_SUPPORTS_READABLE \
238 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK) \
239 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL) \
240 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS))
241
242 #define ZIP_SOURCE_SUPPORTS_WRITABLE (ZIP_SOURCE_SUPPORTS_SEEKABLE \
243 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE) \
244 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_COMMIT_WRITE) \
245 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ROLLBACK_WRITE) \
246 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_WRITE) \
247 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK_WRITE) \
248 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL_WRITE) \
249 | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_REMOVE))
250
251
252 struct zip_source_args_seek {
253 zip_int64_t offset;
254 int whence;
255 };
256
257 typedef struct zip_source_args_seek zip_source_args_seek_t;
258 #define ZIP_SOURCE_GET_ARGS(type, data, len, error) ((len) < sizeof(type) ? zip_error_set((error), ZIP_ER_INVAL, 0), (type *)NULL : (type *)(data))
259
260
261
262
263 struct zip_error {
264 int zip_err;
265 int sys_err;
266 char *str;
267 };
268
269 #define ZIP_STAT_NAME 0x0001u
270 #define ZIP_STAT_INDEX 0x0002u
271 #define ZIP_STAT_SIZE 0x0004u
272 #define ZIP_STAT_COMP_SIZE 0x0008u
273 #define ZIP_STAT_MTIME 0x0010u
274 #define ZIP_STAT_CRC 0x0020u
275 #define ZIP_STAT_COMP_METHOD 0x0040u
276 #define ZIP_STAT_ENCRYPTION_METHOD 0x0080u
277 #define ZIP_STAT_FLAGS 0x0100u
278
279 struct zip_stat {
280 zip_uint64_t valid;
281 const char *name;
282 zip_uint64_t index;
283 zip_uint64_t size;
284 zip_uint64_t comp_size;
285 time_t mtime;
286 zip_uint32_t crc;
287 zip_uint16_t comp_method;
288 zip_uint16_t encryption_method;
289 zip_uint32_t flags;
290 };
291
292 struct zip;
293 struct zip_file;
294 struct zip_source;
295
296 typedef struct zip zip_t;
297 typedef struct zip_error zip_error_t;
298 typedef struct zip_file zip_file_t;
299 typedef struct zip_source zip_source_t;
300 typedef struct zip_stat zip_stat_t;
301
302 typedef zip_uint32_t zip_flags_t;
303
304 typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t, zip_source_cmd_t);
305
306
307 #ifndef ZIP_DISABLE_DEPRECATED
308 ZIP_EXTERN zip_int64_t zip_add(zip_t *, const char *, zip_source_t *);
309 ZIP_EXTERN zip_int64_t zip_add_dir(zip_t *, const char *);
310 ZIP_EXTERN const char *zip_get_file_comment(zip_t *, zip_uint64_t, int *, int);
311 ZIP_EXTERN int zip_get_num_files(zip_t *);
312 ZIP_EXTERN int zip_rename(zip_t *, zip_uint64_t, const char *);
313 ZIP_EXTERN int zip_replace(zip_t *, zip_uint64_t, zip_source_t *);
314 ZIP_EXTERN int zip_set_file_comment(zip_t *, zip_uint64_t, const char *, int);
315 ZIP_EXTERN int zip_error_get_sys_type(int);
316 ZIP_EXTERN void zip_error_get(zip_t *, int *, int *);
317 ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int);
318 ZIP_EXTERN void zip_file_error_get(zip_file_t *, int *, int *);
319 #endif
320
321 ZIP_EXTERN int zip_archive_set_tempdir(zip_t *, const char *);
322 ZIP_EXTERN int zip_close(zip_t *);
323 ZIP_EXTERN int zip_delete(zip_t *, zip_uint64_t);
324 ZIP_EXTERN zip_int64_t zip_dir_add(zip_t *, const char *, zip_flags_t);
325 ZIP_EXTERN void zip_discard(zip_t *);
326
327 ZIP_EXTERN zip_error_t *zip_get_error(zip_t *);
328 ZIP_EXTERN void zip_error_clear(zip_t *);
329 ZIP_EXTERN int zip_error_code_zip(const zip_error_t *);
330 ZIP_EXTERN int zip_error_code_system(const zip_error_t *);
331 ZIP_EXTERN void zip_error_fini(zip_error_t *);
332 ZIP_EXTERN void zip_error_init(zip_error_t *);
333 ZIP_EXTERN void zip_error_init_with_code(zip_error_t *, int);
334 ZIP_EXTERN void zip_error_set(zip_error_t *, int, int);
335 ZIP_EXTERN const char *zip_error_strerror(zip_error_t *);
336 ZIP_EXTERN int zip_error_system_type(const zip_error_t *);
337 ZIP_EXTERN zip_int64_t zip_error_to_data(const zip_error_t *, void *, zip_uint64_t);
338
339 ZIP_EXTERN int zip_fclose(zip_file_t *);
340 ZIP_EXTERN zip_t *zip_fdopen(int, int, int *);
341 ZIP_EXTERN zip_int64_t zip_file_add(zip_t *, const char *, zip_source_t *, zip_flags_t);
342 ZIP_EXTERN void zip_file_error_clear(zip_file_t *);
343 ZIP_EXTERN int zip_file_extra_field_delete(zip_t *, zip_uint64_t, zip_uint16_t, zip_flags_t);
344 ZIP_EXTERN int zip_file_extra_field_delete_by_id(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t);
345 ZIP_EXTERN int zip_file_extra_field_set(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_uint16_t, zip_flags_t);
346 ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(zip_t *, zip_uint64_t, zip_flags_t);
347 ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(zip_t *, zip_uint64_t, zip_uint16_t, zip_flags_t);
348 ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t *, zip_uint16_t *, zip_flags_t);
349 ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get_by_id(zip_t *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *, zip_flags_t);
350 ZIP_EXTERN const char *zip_file_get_comment(zip_t *, zip_uint64_t, zip_uint32_t *, zip_flags_t);
351 ZIP_EXTERN zip_error_t *zip_file_get_error(zip_file_t *);
352 ZIP_EXTERN int zip_file_get_external_attributes(zip_t *, zip_uint64_t, zip_flags_t, zip_uint8_t *, zip_uint32_t *);
353 ZIP_EXTERN int zip_file_rename(zip_t *, zip_uint64_t, const char *, zip_flags_t);
354 ZIP_EXTERN int zip_file_replace(zip_t *, zip_uint64_t, zip_source_t *, zip_flags_t);
355 ZIP_EXTERN int zip_file_set_comment(zip_t *, zip_uint64_t, const char *, zip_uint16_t, zip_flags_t);
356 ZIP_EXTERN int zip_file_set_external_attributes(zip_t *, zip_uint64_t, zip_flags_t, zip_uint8_t, zip_uint32_t);
357 ZIP_EXTERN int zip_file_set_mtime(zip_t *, zip_uint64_t, time_t, zip_flags_t);
358 ZIP_EXTERN const char *zip_file_strerror(zip_file_t *);
359 ZIP_EXTERN zip_file_t *zip_fopen(zip_t *, const char *, zip_flags_t);
360 ZIP_EXTERN zip_file_t *zip_fopen_encrypted(zip_t *, const char *, zip_flags_t, const char *);
361 ZIP_EXTERN zip_file_t *zip_fopen_index(zip_t *, zip_uint64_t, zip_flags_t);
362 ZIP_EXTERN zip_file_t *zip_fopen_index_encrypted(zip_t *, zip_uint64_t, zip_flags_t, const char *);
363 ZIP_EXTERN zip_int64_t zip_fread(zip_file_t *, void *, zip_uint64_t);
364 ZIP_EXTERN const char *zip_get_archive_comment(zip_t *, int *, zip_flags_t);
365 ZIP_EXTERN int zip_get_archive_flag(zip_t *, zip_flags_t, zip_flags_t);
366 ZIP_EXTERN const char *zip_get_name(zip_t *, zip_uint64_t, zip_flags_t);
367 ZIP_EXTERN zip_int64_t zip_get_num_entries(zip_t *, zip_flags_t);
368 ZIP_EXTERN zip_int64_t zip_name_locate(zip_t *, const char *, zip_flags_t);
369 ZIP_EXTERN zip_t *zip_open(const char *, int, int *);
370 ZIP_EXTERN zip_t *zip_open_from_source(zip_source_t *, int, zip_error_t *);
371 ZIP_EXTERN int zip_set_archive_comment(zip_t *, const char *, zip_uint16_t);
372 ZIP_EXTERN int zip_set_archive_flag(zip_t *, zip_flags_t, int);
373 ZIP_EXTERN int zip_set_default_password(zip_t *, const char *);
374 ZIP_EXTERN int zip_set_file_compression(zip_t *, zip_uint64_t, zip_int32_t, zip_uint32_t);
375 ZIP_EXTERN int zip_source_begin_write(zip_source_t *);
376 ZIP_EXTERN zip_source_t *zip_source_buffer(zip_t *, const void *, zip_uint64_t, int);
377 ZIP_EXTERN zip_source_t *zip_source_buffer_create(const void *, zip_uint64_t, int, zip_error_t *);
378 ZIP_EXTERN int zip_source_close(zip_source_t *);
379 ZIP_EXTERN int zip_source_commit_write(zip_source_t *);
380 ZIP_EXTERN zip_error_t *zip_source_error(zip_source_t *src);
381 ZIP_EXTERN zip_source_t *zip_source_file(zip_t *, const char *, zip_uint64_t, zip_int64_t);
382 ZIP_EXTERN zip_source_t *zip_source_file_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *);
383 ZIP_EXTERN zip_source_t *zip_source_filep(zip_t *, FILE *, zip_uint64_t, zip_int64_t);
384 ZIP_EXTERN zip_source_t *zip_source_filep_create(FILE *, zip_uint64_t, zip_int64_t, zip_error_t *);
385 ZIP_EXTERN void zip_source_free(zip_source_t *);
386 ZIP_EXTERN zip_source_t *zip_source_function(zip_t *, zip_source_callback, void *);
387 ZIP_EXTERN zip_source_t *zip_source_function_create(zip_source_callback, void *, zip_error_t *);
388 ZIP_EXTERN int zip_source_is_deleted(zip_source_t *);
389 ZIP_EXTERN void zip_source_keep(zip_source_t *);
390 ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t, ...);
391 ZIP_EXTERN int zip_source_open(zip_source_t *);
392 ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t *, void *, zip_uint64_t);
393 ZIP_EXTERN void zip_source_rollback_write(zip_source_t *);
394 ZIP_EXTERN int zip_source_seek(zip_source_t *, zip_int64_t, int);
395 ZIP_EXTERN zip_int64_t zip_source_seek_compute_offset(zip_uint64_t, zip_uint64_t, void *, zip_uint64_t, zip_error_t *);
396 ZIP_EXTERN int zip_source_seek_write(zip_source_t *, zip_int64_t, int);
397 ZIP_EXTERN int zip_source_stat(zip_source_t *, zip_stat_t *);
398 ZIP_EXTERN zip_int64_t zip_source_tell(zip_source_t *);
399 ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t *);
400 #ifdef _WIN32
401 ZIP_EXTERN zip_source_t *zip_source_win32a(zip_t *, const char *, zip_uint64_t, zip_int64_t);
402 ZIP_EXTERN zip_source_t *zip_source_win32a_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *);
403 ZIP_EXTERN zip_source_t *zip_source_win32handle(zip_t *, void *, zip_uint64_t, zip_int64_t);
404 ZIP_EXTERN zip_source_t *zip_source_win32handle_create(void *, zip_uint64_t, zip_int64_t, zip_error_t *);
405 ZIP_EXTERN zip_source_t *zip_source_win32w(zip_t *, const wchar_t *, zip_uint64_t, zip_int64_t);
406 ZIP_EXTERN zip_source_t *zip_source_win32w_create(const wchar_t *, zip_uint64_t, zip_int64_t, zip_error_t *);
407 #endif
408 ZIP_EXTERN zip_int64_t zip_source_write(zip_source_t *, const void *, zip_uint64_t);
409 ZIP_EXTERN zip_source_t *zip_source_zip(zip_t *, zip_t *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t);
410 ZIP_EXTERN int zip_stat(zip_t *, const char *, zip_flags_t, zip_stat_t *);
411 ZIP_EXTERN int zip_stat_index(zip_t *, zip_uint64_t, zip_flags_t, zip_stat_t *);
412 ZIP_EXTERN void zip_stat_init(zip_stat_t *);
413 ZIP_EXTERN const char *zip_strerror(zip_t *);
414 ZIP_EXTERN int zip_unchange(zip_t *, zip_uint64_t);
415 ZIP_EXTERN int zip_unchange_all(zip_t *);
416 ZIP_EXTERN int zip_unchange_archive(zip_t *);
417
418 #ifdef __cplusplus
419 }
420 #endif
421
422 #endif