]>
Commit | Line | Data |
---|---|---|
1 | /*--------------------------------------------------------------------------- | |
2 | ||
3 | unzpriv.h | |
4 | ||
5 | This header file contains private (internal) macros, typedefs, prototypes | |
6 | and global-variable declarations used by all of the UnZip source files. | |
7 | In a prior life it was part of the main unzip.h header, but now it is only | |
8 | included by that header if UNZIP_INTERNAL is defined. | |
9 | ||
10 | ---------------------------------------------------------------------------*/ | |
11 | ||
12 | ||
13 | ||
14 | #ifndef __unzpriv_h /* prevent multiple inclusions */ | |
15 | #define __unzpriv_h | |
16 | ||
17 | /* First thing: Signal all following code that we compile UnZip utilities! */ | |
18 | #ifndef UNZIP | |
19 | # define UNZIP | |
20 | #endif | |
21 | ||
22 | /* GRR 960204: MORE defined here in preparation for removal altogether */ | |
23 | #ifndef MORE | |
24 | # define MORE | |
25 | #endif | |
26 | ||
27 | /* fUnZip should never need to be reentrant */ | |
28 | #ifdef FUNZIP | |
29 | # ifdef REENTRANT | |
30 | # undef REENTRANT | |
31 | # endif | |
32 | # ifdef DLL | |
33 | # undef DLL | |
34 | # endif | |
35 | #endif | |
36 | ||
37 | #if (defined(DLL) && !defined(REENTRANT)) | |
38 | # define REENTRANT | |
39 | #endif | |
40 | ||
41 | #if (!defined(DYNAMIC_CRC_TABLE) && !defined(FUNZIP)) | |
42 | # define DYNAMIC_CRC_TABLE | |
43 | #endif | |
44 | ||
45 | #if (defined(DYNAMIC_CRC_TABLE) && !defined(REENTRANT)) | |
46 | # ifndef DYNALLOC_CRCTAB | |
47 | # define DYNALLOC_CRCTAB | |
48 | # endif | |
49 | #endif | |
50 | ||
51 | /*--------------------------------------------------------------------------- | |
52 | OS-dependent configuration for UnZip internals | |
53 | ---------------------------------------------------------------------------*/ | |
54 | ||
55 | /* bad or (occasionally?) missing stddef.h: */ | |
56 | #if (defined(M_XENIX) || defined(DNIX)) | |
57 | # define NO_STDDEF_H | |
58 | #endif | |
59 | ||
60 | #if (defined(M_XENIX) && !defined(M_UNIX)) /* SCO Xenix only, not SCO Unix */ | |
61 | # define SCO_XENIX | |
62 | # define NO_LIMITS_H /* no limits.h, but MODERN defined */ | |
63 | # define NO_UID_GID /* no uid_t/gid_t */ | |
64 | # define size_t int | |
65 | #endif | |
66 | ||
67 | #ifdef realix /* Modcomp Real/IX, real-time SysV.3 variant */ | |
68 | # define SYSV | |
69 | # define NO_UID_GID /* no uid_t/gid_t */ | |
70 | #endif | |
71 | ||
72 | #if (defined(_AIX) && !defined(_ALL_SOURCE)) | |
73 | # define _ALL_SOURCE | |
74 | #endif | |
75 | ||
76 | #if defined(apollo) /* defines __STDC__ */ | |
77 | # define NO_STDLIB_H | |
78 | #endif | |
79 | ||
80 | #ifdef DNIX | |
81 | # define SYSV | |
82 | # define SHORT_NAMES /* 14-char limitation on path components */ | |
83 | /* # define FILENAME_MAX 14 */ | |
84 | # define FILENAME_MAX NAME_MAX /* GRR: experiment */ | |
85 | #endif | |
86 | ||
87 | #if (defined(SYSTEM_FIVE) || defined(__SYSTEM_FIVE)) | |
88 | # ifndef SYSV | |
89 | # define SYSV | |
90 | # endif | |
91 | #endif /* SYSTEM_FIVE || __SYSTEM_FIVE */ | |
92 | #if (defined(M_SYSV) || defined(M_SYS5)) | |
93 | # ifndef SYSV | |
94 | # define SYSV | |
95 | # endif | |
96 | #endif /* M_SYSV || M_SYS5 */ | |
97 | /* __SVR4 and __svr4__ catch Solaris on at least some combos of compiler+OS */ | |
98 | #if (defined(__SVR4) || defined(__svr4__) || defined(sgi) || defined(__hpux)) | |
99 | # ifndef SYSV | |
100 | # define SYSV | |
101 | # endif | |
102 | #endif /* __SVR4 || __svr4__ || sgi || __hpux */ | |
103 | #if (defined(LINUX) || defined(__QNX__)) | |
104 | # ifndef SYSV | |
105 | # define SYSV | |
106 | # endif | |
107 | #endif /* LINUX || __QNX__ */ | |
108 | ||
109 | #if (defined(ultrix) || defined(__ultrix) || defined(bsd4_2)) | |
110 | # if (!defined(BSD) && !defined(SYSV)) | |
111 | # define BSD | |
112 | # endif | |
113 | #endif /* ultrix || __ultrix || bsd4_2 */ | |
114 | #if (defined(sun) || defined(pyr) || defined(CONVEX)) | |
115 | # if (!defined(BSD) && !defined(SYSV)) | |
116 | # define BSD | |
117 | # endif | |
118 | #endif /* sun || pyr || CONVEX */ | |
119 | ||
120 | #ifdef pyr /* Pyramid: has BSD and AT&T "universes" */ | |
121 | # ifdef BSD | |
122 | # define pyr_bsd | |
123 | # define USE_STRINGS_H /* instead of more common string.h */ | |
124 | # define ZMEM /* ZMEM now uses bcopy/bzero: not in AT&T universe */ | |
125 | # endif /* (AT&T memcpy claimed to be very slow, though) */ | |
126 | # define DECLARE_ERRNO | |
127 | #endif /* pyr */ | |
128 | ||
129 | /* stat() bug for Borland, VAX C (also GNU?), and Atari ST MiNT on TOS | |
130 | * filesystems: returns 0 for wildcards! (returns 0xffffffff on Minix | |
131 | * filesystem or `U:' drive under Atari MiNT.) Watcom C was previously | |
132 | * included on this list; it would be good to know what version the problem | |
133 | * was fixed at, if it did exist. Watcom 10.6 has a separate stat() problem: | |
134 | * it fails on "." when the current directory is a root. This is covered by | |
135 | * giving it a separate definition of SSTAT in OS-specific header files. */ | |
136 | #if (defined(__TURBOC__) || defined(VMS) || defined(__MINT__)) | |
137 | # define WILD_STAT_BUG | |
138 | #endif | |
139 | ||
140 | #ifdef WILD_STAT_BUG | |
141 | # define SSTAT(path,pbuf) (iswild(path) || stat(path,pbuf)) | |
142 | #else | |
143 | # define SSTAT stat | |
144 | #endif | |
145 | ||
146 | #ifdef REGULUS /* returns the inode number on success(!)...argh argh argh */ | |
147 | # define stat(p,s) zstat((p),(s)) | |
148 | #endif | |
149 | ||
150 | #define STRNICMP zstrnicmp | |
151 | ||
152 | /*--------------------------------------------------------------------------- | |
153 | OS-dependent includes | |
154 | ---------------------------------------------------------------------------*/ | |
155 | ||
156 | #ifdef EFT | |
157 | # define LONGINT off_t /* Amdahl UTS nonsense ("extended file types") */ | |
158 | #else | |
159 | # define LONGINT long | |
160 | #endif | |
161 | ||
162 | #ifdef MODERN | |
163 | # ifndef NO_STDDEF_H | |
164 | # include <stddef.h> | |
165 | # endif | |
166 | # ifndef NO_STDLIB_H | |
167 | # include <stdlib.h> /* standard library prototypes, malloc(), etc. */ | |
168 | # endif | |
169 | typedef size_t extent; | |
170 | #else /* !MODERN */ | |
171 | # ifndef AOS_VS /* mostly modern? */ | |
172 | LONGINT lseek(); | |
173 | # ifdef VAXC /* not fully modern, but does have stdlib.h and void */ | |
174 | # include <stdlib.h> | |
175 | # else | |
176 | char *malloc(); | |
177 | # endif /* ?VAXC */ | |
178 | # endif /* !AOS_VS */ | |
179 | typedef unsigned int extent; | |
180 | #endif /* ?MODERN */ | |
181 | ||
182 | ||
183 | #ifndef MINIX /* Minix needs it after all the other includes (?) */ | |
184 | # include <stdio.h> | |
185 | #endif | |
186 | #include <ctype.h> /* skip for VMS, to use tolower() function? */ | |
187 | #include <errno.h> /* used in mapname() */ | |
188 | #ifdef USE_STRINGS_H | |
189 | # include <strings.h> /* strcpy, strcmp, memcpy, index/rindex, etc. */ | |
190 | #else | |
191 | # include <string.h> /* strcpy, strcmp, memcpy, strchr/strrchr, etc. */ | |
192 | #endif | |
193 | #if (defined(MODERN) && !defined(NO_LIMITS_H)) | |
194 | # include <limits.h> /* GRR: EXPERIMENTAL! (can be deleted) */ | |
195 | #endif | |
196 | ||
197 | /* this include must be down here for SysV.4, for some reason... */ | |
198 | #include <signal.h> /* used in unzip.c, fileio.c */ | |
199 | ||
200 | ||
201 | /*--------------------------------------------------------------------------- | |
202 | API (DLL) section: | |
203 | ---------------------------------------------------------------------------*/ | |
204 | ||
205 | #ifdef DLL | |
206 | # define MAIN UZ_EXP UzpMain /* was UzpUnzip */ | |
207 | # ifdef OS2DLL | |
208 | # undef Info | |
209 | # define REDIRECTC(c) varputchar(__G__ c) | |
210 | # define REDIRECTPRINT(buf,size) varmessage(__G__ buf, size) | |
211 | # define FINISH_REDIRECT() finish_REXX_redirect(__G) | |
212 | # else | |
213 | # define REDIRECTC(c) | |
214 | # define REDIRECTPRINT(buf,size) 0 | |
215 | # define FINISH_REDIRECT() close_redirect(__G) | |
216 | # endif | |
217 | #endif | |
218 | ||
219 | /*--------------------------------------------------------------------------- | |
220 | Acorn RISCOS section: | |
221 | ---------------------------------------------------------------------------*/ | |
222 | ||
223 | #ifdef RISCOS | |
224 | # include "acorn/riscos.h" | |
225 | #endif | |
226 | ||
227 | /*--------------------------------------------------------------------------- | |
228 | Amiga section: | |
229 | ---------------------------------------------------------------------------*/ | |
230 | ||
231 | #ifdef AMIGA | |
232 | # include "amiga/amiga.h" | |
233 | #endif | |
234 | ||
235 | /*--------------------------------------------------------------------------- | |
236 | AOS/VS section (somewhat similar to Unix, apparently): | |
237 | ---------------------------------------------------------------------------*/ | |
238 | ||
239 | #ifdef AOS_VS | |
240 | # ifdef FILEIO_C | |
241 | # include "aosvs/aosvs.h" | |
242 | # endif | |
243 | #endif | |
244 | ||
245 | /*--------------------------------------------------------------------------- | |
246 | Atari ST section: | |
247 | ---------------------------------------------------------------------------*/ | |
248 | ||
249 | #ifdef ATARI | |
250 | # include <time.h> | |
251 | # include <stat.h> | |
252 | # include <fcntl.h> | |
253 | # include <limits.h> | |
254 | # define SYMLINKS | |
255 | # define EXE_EXTENSION ".tos" | |
256 | # ifndef DATE_FORMAT | |
257 | # define DATE_FORMAT DF_DMY | |
258 | # endif | |
259 | # define DIR_END '/' | |
260 | # define INT_SPRINTF | |
261 | # define timezone _timezone | |
262 | # define lenEOL 2 | |
263 | # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} | |
264 | # undef SHORT_NAMES | |
265 | # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) | |
266 | # define TIMESTAMP | |
267 | # endif | |
268 | #endif | |
269 | ||
270 | /*--------------------------------------------------------------------------- | |
271 | BeOS section: | |
272 | ---------------------------------------------------------------------------*/ | |
273 | ||
274 | #ifdef __BEOS__ | |
275 | # include <sys/types.h> /* [cjh]: This is pretty much a generic */ | |
276 | # include <sys/stat.h> /* POSIX 1003.1 system; see beos/ for */ | |
277 | # include <fcntl.h> /* extra code to deal with our extra file */ | |
278 | # include <sys/param.h> /* attributes. */ | |
279 | # include <unistd.h> | |
280 | # include <utime.h> | |
281 | # define DIRENT | |
282 | # include <time.h> | |
283 | # ifndef DATE_FORMAT | |
284 | # define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */ | |
285 | # endif | |
286 | # define lenEOL 1 | |
287 | # define PutNativeEOL *q++ = native(LF); | |
288 | # define SCREENLINES screenlines() | |
289 | # define USE_EF_UT_TIME | |
290 | # define SET_DIR_ATTRIB | |
291 | # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) | |
292 | # define TIMESTAMP | |
293 | # endif | |
294 | # define RESTORE_UIDGID | |
295 | # define NO_GMTIME /* maybe DR10 will have timezones... */ | |
296 | # define INT_SPRINTF | |
297 | # define SYMLINKS | |
298 | # define MAIN main_stub /* now that we're using a wrapper... */ | |
299 | #endif | |
300 | ||
301 | /*--------------------------------------------------------------------------- | |
302 | Human68k/X68000 section: | |
303 | ---------------------------------------------------------------------------*/ | |
304 | ||
305 | #ifdef __human68k__ /* DO NOT DEFINE DOS_OS2 HERE! If Human68k is so much */ | |
306 | # include <time.h> /* like MS-DOS and/or OS/2, create DOS_H68_OS2 macro. */ | |
307 | # include <fcntl.h> | |
308 | # include <io.h> | |
309 | # include <conio.h> | |
310 | # include <jctype.h> | |
311 | # include <sys/stat.h> | |
312 | # ifndef DATE_FORMAT | |
313 | # define DATE_FORMAT DF_YMD /* Japanese standard */ | |
314 | # endif | |
315 | /* GRR: these EOL macros are guesses */ | |
316 | # define lenEOL 2 | |
317 | # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} | |
318 | # define EXE_EXTENSION ".exe" /* just a guess... */ | |
319 | #endif | |
320 | ||
321 | /*--------------------------------------------------------------------------- | |
322 | Mac section: | |
323 | ---------------------------------------------------------------------------*/ | |
324 | ||
325 | #ifdef MACOS | |
326 | # include "maccfg.h" | |
327 | #endif /* MACOS */ | |
328 | ||
329 | /*--------------------------------------------------------------------------- | |
330 | MS-DOS, OS/2, FLEXOS section: | |
331 | ---------------------------------------------------------------------------*/ | |
332 | ||
333 | #ifdef WINDLL | |
334 | # define MSWIN | |
335 | # ifdef MORE | |
336 | # undef MORE | |
337 | # endif | |
338 | # ifdef OS2_EAS | |
339 | # undef OS2_EAS | |
340 | # endif | |
341 | #endif | |
342 | ||
343 | #if (defined(_MSC_VER) || (defined(M_I86) && !defined(__WATCOMC__))) | |
344 | # ifndef MSC | |
345 | # define MSC /* This should work for older MSC, too! */ | |
346 | # endif | |
347 | #endif | |
348 | ||
349 | #if (defined(MSDOS) || defined(OS2) || defined(FLEXOS)) | |
350 | # include <sys/types.h> /* off_t, time_t, dev_t, ... */ | |
351 | # include <sys/stat.h> | |
352 | # include <io.h> /* lseek(), open(), setftime(), dup(), creat() */ | |
353 | # include <time.h> /* localtime() */ | |
354 | # include <fcntl.h> /* O_BINARY for open() w/o CR/LF translation */ | |
355 | ||
356 | # ifdef OS2 /* defined for all OS/2 compilers */ | |
357 | # include "os2/os2cfg.h" | |
358 | # else | |
359 | # ifdef FLEXOS | |
360 | # include "flexos/flxcfg.h" | |
361 | # else | |
362 | # include "msdos/doscfg.h" | |
363 | # endif | |
364 | # endif | |
365 | ||
366 | # if (defined(_MSC_VER) && (_MSC_VER == 700) && !defined(GRR)) | |
367 | /* | |
368 | * ARGH. MSC 7.0 libraries think times are based on 1899 Dec 31 00:00, not | |
369 | * 1970 Jan 1 00:00. So we have to diddle time_t's appropriately: add or | |
370 | * subtract 70 years' worth of seconds; i.e., number of days times 86400; | |
371 | * i.e., (70*365 regular days + 17 leap days + 1 1899 day) * 86400 == | |
372 | * (25550 + 17 + 1) * 86400 == 2209075200 seconds. We know time_t is an | |
373 | * unsigned long (ulg) on the only system with this bug. | |
374 | */ | |
375 | # define TIMET_TO_NATIVE(x) (x) += (ulg)2209075200L; | |
376 | # define NATIVE_TO_TIMET(x) (x) -= (ulg)2209075200L; | |
377 | # endif | |
378 | # if (defined(__BORLANDC__) && (__BORLANDC__ >= 0x0450)) | |
379 | # define timezone _timezone | |
380 | # endif | |
381 | # if (defined(__GO32__) || defined(FLEXOS)) | |
382 | # define DIR_END '/' | |
383 | # else | |
384 | # define DIR_END '\\' /* OS uses '\\' as directory separator */ | |
385 | # define DIR_END2 '/' /* also check for '/' (RTL may convert) */ | |
386 | # endif | |
387 | # ifndef WIN32 | |
388 | # ifdef DATE_FORMAT | |
389 | # undef DATE_FORMAT | |
390 | # endif | |
391 | # define DATE_FORMAT dateformat() | |
392 | # endif | |
393 | # define lenEOL 2 | |
394 | # define PutNativeEOL {*q++ = native(CR); *q++ = native(LF);} | |
395 | # define USE_EF_UT_TIME | |
396 | #endif /* MSDOS || OS2 || FLEXOS */ | |
397 | ||
398 | /*--------------------------------------------------------------------------- | |
399 | MTS section (piggybacks UNIX, I think): | |
400 | ---------------------------------------------------------------------------*/ | |
401 | ||
402 | #ifdef MTS | |
403 | # include <sys/types.h> /* off_t, time_t, dev_t, ... */ | |
404 | # include <sys/stat.h> | |
405 | # include <sys/file.h> /* MTS uses this instead of fcntl.h */ | |
406 | # include <timeb.h> | |
407 | # include <time.h> | |
408 | # include <unix.h> /* some important non-ANSI routines */ | |
409 | # define mkdir(s,n) (-1) /* no "make directory" capability */ | |
410 | # define EBCDIC /* set EBCDIC conversion on */ | |
411 | # define NO_STRNICMP /* unzip's is as good the one in MTS */ | |
412 | # define USE_FWRITE | |
413 | # define close_outfile() fclose(G.outfile) /* can't set time on files */ | |
414 | # define umask(n) /* don't have umask() on MTS */ | |
415 | # define FOPWT "w" /* open file for writing in TEXT mode */ | |
416 | # ifndef DATE_FORMAT | |
417 | # define DATE_FORMAT DF_MDY | |
418 | # endif | |
419 | # define lenEOL 1 | |
420 | # define PutNativeEOL *q++ = native(LF); | |
421 | #endif /* MTS */ | |
422 | ||
423 | /*--------------------------------------------------------------------------- | |
424 | QDOS section | |
425 | ---------------------------------------------------------------------------*/ | |
426 | ||
427 | #ifdef QDOS | |
428 | # define DIRENT | |
429 | # include <fcntl.h> | |
430 | # include <unistd.h> | |
431 | # include <sys/stat.h> | |
432 | # include <time.h> | |
433 | # include "qdos/izqdos.h" | |
434 | # ifndef DATE_FORMAT | |
435 | # define DATE_FORMAT DF_MDY | |
436 | # endif | |
437 | # define lenEOL 1 | |
438 | # define PutNativeEOL *q++ = native(LF); | |
439 | # define DIR_END '_' | |
440 | # define RETURN QReturn | |
441 | # undef PATH_MAX | |
442 | # define PATH_MAX 36 | |
443 | # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) | |
444 | # define TIMESTAMP | |
445 | # endif | |
446 | #endif | |
447 | ||
448 | /*--------------------------------------------------------------------------- | |
449 | Tandem NSK section: | |
450 | ---------------------------------------------------------------------------*/ | |
451 | ||
452 | #ifdef TANDEM | |
453 | # include "tandem.h" | |
454 | # include <fcntl.h> | |
455 | /* use a single LF delimiter so that writes to 101 text files work */ | |
456 | # define PutNativeEOL *q++ = native(LF); | |
457 | # define lenEOL 1 | |
458 | # ifndef DATE_FORMAT | |
459 | # define DATE_FORMAT DF_DMY | |
460 | # endif | |
461 | # define USE_EF_UT_TIME | |
462 | # define RESTORE_UIDGID | |
463 | #endif | |
464 | ||
465 | /*--------------------------------------------------------------------------- | |
466 | TOPS-20 section: | |
467 | ---------------------------------------------------------------------------*/ | |
468 | ||
469 | #ifdef TOPS20 | |
470 | # include <sys/types.h> /* off_t, time_t, dev_t, ... */ | |
471 | # include <sys/stat.h> | |
472 | # include <sys/param.h> | |
473 | # include <sys/time.h> | |
474 | # include <sys/timeb.h> | |
475 | # include <sys/file.h> | |
476 | # include <timex.h> | |
477 | # include <monsym.h> /* get amazing monsym() macro */ | |
478 | extern int open(), close(), read(); | |
479 | extern int stat(), unlink(), jsys(), fcntl(); | |
480 | extern long lseek(), dup(), creat(); | |
481 | # define strchr index /* GRR: necessary? */ | |
482 | # define strrchr rindex | |
483 | # define REALLY_SHORT_SYMS | |
484 | # define NO_MKDIR | |
485 | # define DIR_BEG '<' | |
486 | # define DIR_END '>' | |
487 | # define DIR_EXT ".directory" | |
488 | # ifndef DATE_FORMAT | |
489 | # define DATE_FORMAT DF_MDY | |
490 | # endif | |
491 | # define EXE_EXTENSION ".exe" /* just a guess... */ | |
492 | #endif /* TOPS20 */ | |
493 | ||
494 | /*--------------------------------------------------------------------------- | |
495 | Unix section: | |
496 | ---------------------------------------------------------------------------*/ | |
497 | ||
498 | #ifdef UNIX | |
499 | # include <sys/types.h> /* off_t, time_t, dev_t, ... */ | |
500 | # include <sys/stat.h> | |
501 | ||
502 | # ifndef COHERENT | |
503 | # include <fcntl.h> /* O_BINARY for open() w/o CR/LF translation */ | |
504 | # else /* COHERENT */ | |
505 | # ifdef _I386 | |
506 | # include <fcntl.h> /* Coherent 4.0.x, Mark Williams C */ | |
507 | # else | |
508 | # include <sys/fcntl.h> /* Coherent 3.10, Mark Williams C */ | |
509 | # endif | |
510 | # define SHORT_SYMS | |
511 | # ifndef __COHERENT__ /* Coherent 4.2 has tzset() */ | |
512 | # define tzset settz | |
513 | # endif | |
514 | # endif /* ?COHERENT */ | |
515 | ||
516 | # ifndef NO_PARAM_H | |
517 | # ifdef NGROUPS_MAX | |
518 | # undef NGROUPS_MAX /* SCO bug: defined again in <sys/param.h> */ | |
519 | # endif | |
520 | # ifdef BSD | |
521 | # define TEMP_BSD /* may be defined again in <sys/param.h> */ | |
522 | # undef BSD | |
523 | # endif | |
524 | # include <sys/param.h> /* conflict with <sys/types.h>, some systems? */ | |
525 | # ifdef TEMP_BSD | |
526 | # undef TEMP_BSD | |
527 | # ifndef BSD | |
528 | # define BSD | |
529 | # endif | |
530 | # endif | |
531 | # endif /* !NO_PARAM_H */ | |
532 | ||
533 | # ifdef __osf__ | |
534 | # define DIRENT | |
535 | # ifdef BSD | |
536 | # undef BSD | |
537 | # endif | |
538 | # endif /* __osf__ */ | |
539 | ||
540 | # ifdef BSD | |
541 | # include <sys/time.h> | |
542 | # include <sys/timeb.h> | |
543 | # ifdef _AIX | |
544 | # include <time.h> | |
545 | # endif | |
546 | # else | |
547 | # include <time.h> | |
548 | struct tm *gmtime(), *localtime(); | |
549 | # endif | |
550 | ||
551 | # if (defined(BSD4_4) || (defined(SYSV) && defined(MODERN))) | |
552 | # include <unistd.h> /* this includes utime.h on SGIs */ | |
553 | # if (defined(BSD4_4) || defined(linux)) | |
554 | # include <utime.h> | |
555 | # define GOT_UTIMBUF | |
556 | # endif | |
557 | # endif | |
558 | ||
559 | # if (defined(V7) || defined(pyr_bsd)) | |
560 | # define strchr index | |
561 | # define strrchr rindex | |
562 | # endif | |
563 | # ifdef V7 | |
564 | # define O_RDONLY 0 | |
565 | # define O_WRONLY 1 | |
566 | # define O_RDWR 2 | |
567 | # endif | |
568 | ||
569 | # ifdef MINIX | |
570 | # include <stdio.h> | |
571 | # endif | |
572 | # ifndef DATE_FORMAT | |
573 | # define DATE_FORMAT DF_MDY /* GRR: customize with locale.h somehow? */ | |
574 | # endif | |
575 | # define lenEOL 1 | |
576 | # ifdef EBCDIC | |
577 | # define PutNativeEOL *q++ = '\n'; | |
578 | # else | |
579 | # define PutNativeEOL *q++ = native(LF); | |
580 | # endif | |
581 | # define SCREENLINES screenlines() | |
582 | # define USE_EF_UT_TIME | |
583 | # define SET_DIR_ATTRIB | |
584 | # if (!defined(TIMESTAMP) && !defined(NOTIMESTAMP)) /* GRR 970513 */ | |
585 | # define TIMESTAMP | |
586 | # endif | |
587 | # define RESTORE_UIDGID | |
588 | #endif /* UNIX */ | |
589 | ||
590 | /*--------------------------------------------------------------------------- | |
591 | VM/CMS and MVS section: | |
592 | ---------------------------------------------------------------------------*/ | |
593 | ||
594 | #ifdef CMS_MVS | |
595 | # include "vmmvs.h" | |
596 | # define CLOSE_INFILE() close_infile(__G) | |
597 | #endif | |
598 | ||
599 | /*--------------------------------------------------------------------------- | |
600 | VMS section: | |
601 | ---------------------------------------------------------------------------*/ | |
602 | ||
603 | #ifdef VMS | |
604 | # include <types.h> /* GRR: experimenting... */ | |
605 | # include <stat.h> | |
606 | # include <time.h> /* the usual non-BSD time functions */ | |
607 | # include <file.h> /* same things as fcntl.h has */ | |
608 | # include <unixio.h> | |
609 | # include <rms.h> | |
610 | # define _MAX_PATH (NAM$C_MAXRSS+1) /* to define FILNAMSIZ below */ | |
611 | # ifdef RETURN_CODES /* VMS interprets standard PK return codes incorrectly */ | |
612 | # define RETURN(ret) return_VMS(__G__ (ret)) /* verbose version */ | |
613 | # define EXIT(ret) return_VMS(__G__ (ret)) | |
614 | # else | |
615 | # define RETURN return_VMS /* quiet version */ | |
616 | # define EXIT return_VMS | |
617 | # endif | |
618 | # ifdef VMSCLI | |
619 | # define USAGE(ret) VMSCLI_usage(__G__ (ret)) | |
620 | # endif | |
621 | # define DIR_BEG '[' | |
622 | # define DIR_END ']' | |
623 | # define DIR_EXT ".dir" | |
624 | # ifndef DATE_FORMAT | |
625 | # define DATE_FORMAT DF_MDY | |
626 | # endif | |
627 | # define lenEOL 1 | |
628 | # define PutNativeEOL *q++ = native(LF); | |
629 | # define SCREENLINES screenlines() | |
630 | # if (defined(__VMS_VERSION) && !defined(VMS_VERSION)) | |
631 | # define VMS_VERSION __VMS_VERSION | |
632 | # endif | |
633 | # if (defined(__VMS_VER) && !defined(__CRTL_VER)) | |
634 | # define __CRTL_VER __VMS_VER | |
635 | # endif | |
636 | # if ((!defined(__CRTL_VER)) || (__CRTL_VER < 70000000)) | |
637 | # define NO_GMTIME /* gmtime() of earlier VMS C RTLs is broken */ | |
638 | # else | |
639 | # if (!defined(NO_EF_UT_TIME) && !defined(USE_EF_UT_TIME)) | |
640 | # define USE_EF_UT_TIME | |
641 | # endif | |
642 | # endif | |
643 | # if (!defined(NOTIMESTAMP) && !defined(TIMESTAMP)) | |
644 | # define TIMESTAMP | |
645 | # endif | |
646 | # define RESTORE_UIDGID | |
647 | #endif /* VMS */ | |
648 | ||
649 | /*--------------------------------------------------------------------------- | |
650 | Win32 (Windows 95/NT) section: | |
651 | ---------------------------------------------------------------------------*/ | |
652 | ||
653 | #if (defined(WIN32) && !defined(POCKET_UNZIP)) | |
654 | # include "w32cfg.h" | |
655 | #endif | |
656 | ||
657 | ||
658 | ||
659 | ||
660 | ||
661 | /*************/ | |
662 | /* Defines */ | |
663 | /*************/ | |
664 | ||
665 | #define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */ | |
666 | #define VMS_UNZIP_VERSION 42 /* if OS-needed-to-extract is VMS: can do */ | |
667 | ||
668 | #if (defined(MSDOS) || defined(OS2)) | |
669 | # define DOS_OS2 | |
670 | #endif | |
671 | ||
672 | #if (defined(OS2) || defined(WIN32)) | |
673 | # define OS2_W32 | |
674 | #endif | |
675 | ||
676 | #if (defined(DOS_OS2) || defined(WIN32)) | |
677 | # define DOS_OS2_W32 | |
678 | # define DOS_W32_OS2 /* historical: don't use */ | |
679 | #endif | |
680 | ||
681 | #if (defined(DOS_OS2_W32) || defined(__human68k__)) | |
682 | # define DOS_H68_OS2_W32 | |
683 | #endif | |
684 | ||
685 | #if (defined(DOS_OS2) || defined(FLEXOS)) | |
686 | # define DOS_FLX_OS2 | |
687 | #endif | |
688 | ||
689 | #if (defined(DOS_OS2_W32) || defined(FLEXOS)) | |
690 | # define DOS_FLX_OS2_W32 | |
691 | #endif | |
692 | ||
693 | #if (defined(DOS_H68_OS2_W32) || defined(FLEXOS)) | |
694 | # define DOS_FLX_H68_OS2_W32 | |
695 | #endif | |
696 | ||
697 | #if (defined(TOPS20) || defined(VMS)) | |
698 | # define T20_VMS | |
699 | #endif | |
700 | ||
701 | #if (defined(MSDOS) || defined(T20_VMS)) | |
702 | # define DOS_T20_VMS | |
703 | #endif | |
704 | ||
705 | /* clean up with a few defaults */ | |
706 | #ifndef DIR_END | |
707 | # define DIR_END '/' /* last char before program name or filename */ | |
708 | #endif | |
709 | #ifndef DATE_FORMAT | |
710 | # define DATE_FORMAT DF_MDY /* defaults to US convention */ | |
711 | #endif | |
712 | #ifndef CLOSE_INFILE | |
713 | # define CLOSE_INFILE() close(G.zipfd) | |
714 | #endif | |
715 | #ifndef RETURN | |
716 | # define RETURN return /* only used in main() */ | |
717 | #endif | |
718 | #ifndef EXIT | |
719 | # define EXIT exit | |
720 | #endif | |
721 | #ifndef USAGE | |
722 | # define USAGE(ret) usage(__G__ (ret)) /* used in unzip.c, zipinfo.c */ | |
723 | #endif | |
724 | #ifndef TIMET_TO_NATIVE /* everybody but MSC 7.0 and Macintosh */ | |
725 | # define TIMET_TO_NATIVE(x) | |
726 | # define NATIVE_TO_TIMET(x) | |
727 | #endif | |
728 | ||
729 | #if (defined(DOS_FLX_OS2_W32) || defined(UNIX) || defined(RISCOS)) | |
730 | # ifndef HAVE_UNLINK | |
731 | # define HAVE_UNLINK | |
732 | # endif | |
733 | #endif | |
734 | #if (defined(AOS_VS) || defined(ATARI) || defined(__BEOS__)) /* GRR: others? */ | |
735 | # ifndef HAVE_UNLINK | |
736 | # define HAVE_UNLINK | |
737 | # endif | |
738 | #endif | |
739 | ||
740 | /* OS-specific exceptions to the "ANSI <--> INT_SPRINTF" rule */ | |
741 | ||
742 | #if (!defined(PCHAR_SPRINTF) && !defined(INT_SPRINTF)) | |
743 | # if (defined(SYSV) || defined(CONVEX) || defined(NeXT) || defined(BSD4_4)) | |
744 | # define INT_SPRINTF /* sprintf() returns int: SysVish/Posix */ | |
745 | # endif | |
746 | # if (defined(DOS_FLX_OS2_W32) || defined(VMS) || defined(AMIGA)) | |
747 | # define INT_SPRINTF /* sprintf() returns int: ANSI */ | |
748 | # endif | |
749 | # if (defined(ultrix) || defined(__ultrix)) /* Ultrix 4.3 and newer */ | |
750 | # if (defined(POSIX) || defined(__POSIX)) | |
751 | # define INT_SPRINTF /* sprintf() returns int: ANSI/Posix */ | |
752 | # endif | |
753 | # ifdef __GNUC__ | |
754 | # define PCHAR_SPRINTF /* undetermined actual return value */ | |
755 | # endif | |
756 | # endif | |
757 | # if (defined(__osf__) || defined(_AIX) || defined(CMS_MVS)) | |
758 | # define INT_SPRINTF /* sprintf() returns int: ANSI/Posix */ | |
759 | # endif | |
760 | # if defined(sun) | |
761 | # define PCHAR_SPRINTF /* sprintf() returns char *: SunOS cc *and* gcc */ | |
762 | # endif | |
763 | #endif | |
764 | ||
765 | /* defaults that we hope will take care of most machines in the future */ | |
766 | ||
767 | #if (!defined(PCHAR_SPRINTF) && !defined(INT_SPRINTF)) | |
768 | # ifdef __STDC__ | |
769 | # define INT_SPRINTF /* sprintf() returns int: ANSI */ | |
770 | # endif | |
771 | # ifndef INT_SPRINTF | |
772 | # define PCHAR_SPRINTF /* sprintf() returns char *: BSDish */ | |
773 | # endif | |
774 | #endif | |
775 | ||
776 | #define MSG_STDERR(f) (f & 1) /* bit 0: 0 = stdout, 1 = stderr */ | |
777 | #define MSG_INFO(f) ((f & 6) == 0) /* bits 1 and 2: 0 = info */ | |
778 | #define MSG_WARN(f) ((f & 6) == 2) /* bits 1 and 2: 1 = warning */ | |
779 | #define MSG_ERROR(f) ((f & 6) == 4) /* bits 1 and 2: 2 = error */ | |
780 | #define MSG_FATAL(f) ((f & 6) == 6) /* bits 1 and 2: (3 = fatal error) */ | |
781 | #define MSG_ZFN(f) (f & 0x0008) /* bit 3: 1 = print zipfile name */ | |
782 | #define MSG_FN(f) (f & 0x0010) /* bit 4: 1 = print filename */ | |
783 | #define MSG_LNEWLN(f) (f & 0x0020) /* bit 5: 1 = leading newline if !SOL */ | |
784 | #define MSG_TNEWLN(f) (f & 0x0040) /* bit 6: 1 = trailing newline if !SOL */ | |
785 | #define MSG_MNEWLN(f) (f & 0x0080) /* bit 7: 1 = trailing NL for prompts */ | |
786 | /* the following are subject to change */ | |
787 | #define MSG_NO_WGUI(f) (f & 0x0100) /* bit 8: 1 = skip if Windows GUI */ | |
788 | #define MSG_NO_AGUI(f) (f & 0x0200) /* bit 9: 1 = skip if Acorn GUI */ | |
789 | #define MSG_NO_DLL2(f) (f & 0x0400) /* bit 10: 1 = skip if OS/2 DLL */ | |
790 | #define MSG_NO_NDLL(f) (f & 0x0800) /* bit 11: 1 = skip if WIN32 DLL */ | |
791 | #define MSG_NO_WDLL(f) (f & 0x1000) /* bit 12: 1 = skip if Windows DLL */ | |
792 | ||
793 | #if (defined(MORE) && !defined(SCREENLINES)) | |
794 | # ifdef DOS_FLX_OS2_W32 | |
795 | # define SCREENLINES 25 /* can be (should be) a function instead */ | |
796 | # else | |
797 | # define SCREENLINES 24 /* VT-100s are assumed to be minimal hardware */ | |
798 | # endif | |
799 | #endif | |
800 | ||
801 | #define DIR_BLKSIZ 64 /* number of directory entries per block | |
802 | * (should fit in 4096 bytes, usually) */ | |
803 | #ifndef WSIZE | |
804 | # define WSIZE 0x8000 /* window size--must be a power of two, and */ | |
805 | #endif /* at least 32K for zip's deflate method */ | |
806 | ||
807 | #ifndef INBUFSIZ | |
808 | # if (defined(MED_MEM) || defined(SMALL_MEM)) | |
809 | # define INBUFSIZ 2048 /* works for MS-DOS small model */ | |
810 | # else | |
811 | # define INBUFSIZ 8192 /* larger buffers for real OSes */ | |
812 | # endif | |
813 | #endif | |
814 | ||
815 | #ifndef __16BIT__ | |
816 | # define nearmalloc malloc | |
817 | # define nearfree free | |
818 | # if (!defined(__IBMC__) || !defined(OS2)) | |
819 | # ifndef near | |
820 | # define near | |
821 | # endif | |
822 | # ifndef far | |
823 | # define far | |
824 | # endif | |
825 | # endif | |
826 | #endif | |
827 | ||
828 | #if (defined(DYNALLOC_CRCTAB) && !defined(DYNAMIC_CRC_TABLE)) | |
829 | # undef DYNALLOC_CRCTAB | |
830 | #endif | |
831 | ||
832 | #if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT)) | |
833 | # undef DYNALLOC_CRCTAB /* not safe with reentrant code */ | |
834 | #endif | |
835 | ||
836 | #if (defined(USE_ZLIB) && !defined(USE_OWN_CRCTAB)) | |
837 | # ifdef DYNALLOC_CRCTAB | |
838 | # undef DYNALLOC_CRCTAB | |
839 | # endif | |
840 | #endif | |
841 | ||
842 | #if (defined(USE_ZLIB) && defined(ASM_CRC)) | |
843 | # undef ASM_CRC | |
844 | #endif | |
845 | ||
846 | /* Logic for case of small memory, length of EOL > 1: if OUTBUFSIZ == 2048, | |
847 | * OUTBUFSIZ>>1 == 1024 and OUTBUFSIZ>>7 == 16; therefore rawbuf is 1008 bytes | |
848 | * and transbuf 1040 bytes. Have room for 32 extra EOL chars; 1008/32 == 31.5 | |
849 | * chars/line, smaller than estimated 35-70 characters per line for C source | |
850 | * and normal text. Hence difference is sufficient for most "average" files. | |
851 | * (Argument scales for larger OUTBUFSIZ.) | |
852 | */ | |
853 | #ifdef SMALL_MEM /* i.e., 16-bit OSes: MS-DOS, OS/2 1.x, etc. */ | |
854 | # define LoadFarString(x) fLoadFarString(__G__ (x)) | |
855 | # define LoadFarStringSmall(x) fLoadFarStringSmall(__G__ (x)) | |
856 | # define LoadFarStringSmall2(x) fLoadFarStringSmall2(__G__ (x)) | |
857 | # if (defined(_MSC_VER) && (_MSC_VER >= 600)) | |
858 | # define zfstrcpy(dest, src) _fstrcpy((dest), (src)) | |
859 | # endif | |
860 | # ifndef Far | |
861 | # define Far far /* __far only works for MSC 6.00, not 6.0a or Borland */ | |
862 | # endif | |
863 | # define OUTBUFSIZ INBUFSIZ | |
864 | # if (lenEOL == 1) | |
865 | # define RAWBUFSIZ (OUTBUFSIZ>>1) | |
866 | # else | |
867 | # define RAWBUFSIZ ((OUTBUFSIZ>>1) - (OUTBUFSIZ>>7)) | |
868 | # endif | |
869 | # define TRANSBUFSIZ (OUTBUFSIZ-RAWBUFSIZ) | |
870 | typedef short shrint; /* short/int or "shrink int" (unshrink) */ | |
871 | #else | |
872 | # define zfstrcpy(dest, src) strcpy((dest), (src)) | |
873 | # ifdef QDOS | |
874 | # define LoadFarString(x) Qstrfix(x) /* fix up _ for '.' */ | |
875 | # define LoadFarStringSmall(x) Qstrfix(x) | |
876 | # define LoadFarStringSmall2(x) Qstrfix(x) | |
877 | # else | |
878 | # define LoadFarString(x) x | |
879 | # define LoadFarStringSmall(x) x | |
880 | # define LoadFarStringSmall2(x) x | |
881 | # endif | |
882 | # ifdef MED_MEM | |
883 | # define OUTBUFSIZ 0xFF80 /* can't malloc arrays of 0xFFE8 or more */ | |
884 | # define TRANSBUFSIZ 0xFF80 | |
885 | typedef short shrint; | |
886 | # else | |
887 | # define OUTBUFSIZ (lenEOL*WSIZE) /* more efficient text conversion */ | |
888 | # define TRANSBUFSIZ (lenEOL*OUTBUFSIZ) | |
889 | # ifdef AMIGA | |
890 | typedef short shrint; | |
891 | # else | |
892 | typedef int shrint; /* for efficiency/speed, we hope... */ | |
893 | # endif | |
894 | # endif /* ?MED_MEM */ | |
895 | # define RAWBUFSIZ OUTBUFSIZ | |
896 | #endif /* ?SMALL_MEM */ | |
897 | ||
898 | #ifndef Far | |
899 | # define Far | |
900 | #endif | |
901 | ||
902 | #ifndef MAIN | |
903 | # define MAIN main | |
904 | #endif | |
905 | ||
906 | #ifdef SFX /* disable some unused features for SFX executables */ | |
907 | # ifndef NO_ZIPINFO | |
908 | # define NO_ZIPINFO | |
909 | # endif | |
910 | # ifdef TIMESTAMP | |
911 | # undef TIMESTAMP | |
912 | # endif | |
913 | #endif | |
914 | ||
915 | /* user may have defined both by accident... NOTIMESTAMP takes precedence */ | |
916 | #if (defined(TIMESTAMP) && defined(NOTIMESTAMP)) | |
917 | # undef TIMESTAMP | |
918 | #endif | |
919 | ||
920 | #if (!defined(COPYRIGHT_CLEAN) && !defined(USE_SMITH_CODE)) | |
921 | # define COPYRIGHT_CLEAN | |
922 | #endif | |
923 | ||
924 | #if (!defined(LZW_CLEAN) && !defined(USE_UNSHRINK)) | |
925 | # define LZW_CLEAN | |
926 | #endif | |
927 | ||
928 | #ifndef O_BINARY | |
929 | # define O_BINARY 0 | |
930 | #endif | |
931 | ||
932 | #ifndef PIPE_ERROR | |
933 | # define PIPE_ERROR (errno == EPIPE) | |
934 | #endif | |
935 | ||
936 | /* File operations--use "b" for binary if allowed or fixed length 512 on VMS */ | |
937 | #ifdef VMS | |
938 | # define FOPR "r","ctx=stm" | |
939 | # define FOPM "r+","ctx=stm","rfm=fix","mrs=512" | |
940 | # define FOPW "w","ctx=stm","rfm=fix","mrs=512" | |
941 | #endif /* VMS */ | |
942 | ||
943 | #ifdef CMS_MVS | |
944 | /* Binary files must be RECFM=F,LRECL=1 for ftell() to get correct pos */ | |
945 | /* ...unless byteseek is used. Let's try that for a while. */ | |
946 | # define FOPR "rb,byteseek" | |
947 | # define FOPM "r+b,byteseek" | |
948 | # define FOPW "wb,recfm=v,lrecl=32760" | |
949 | # ifdef MVS | |
950 | # define FOPWT "w,lrecl=133" | |
951 | # else | |
952 | # define FOPWT "w" | |
953 | # endif | |
954 | #endif /* CMS_MVS */ | |
955 | ||
956 | #ifdef TOPS20 /* TOPS-20 MODERN? You kidding? */ | |
957 | # define FOPW "w8" | |
958 | #endif /* TOPS20 */ | |
959 | ||
960 | /* Defaults when nothing special has been defined previously. */ | |
961 | #ifdef MODERN | |
962 | # ifndef FOPR | |
963 | # define FOPR "rb" | |
964 | # endif | |
965 | # ifndef FOPM | |
966 | # define FOPM "r+b" | |
967 | # endif | |
968 | # ifndef FOPW | |
969 | # define FOPW "wb" | |
970 | # endif | |
971 | # ifndef FOPWT | |
972 | # define FOPWT "wt" | |
973 | # endif | |
974 | #else /* !MODERN */ | |
975 | # ifndef FOPR | |
976 | # define FOPR "r" | |
977 | # endif | |
978 | # ifndef FOPM | |
979 | # define FOPM "r+" | |
980 | # endif | |
981 | # ifndef FOPW | |
982 | # define FOPW "w" | |
983 | # endif | |
984 | # ifndef FOPWT | |
985 | # define FOPWT "w" | |
986 | # endif | |
987 | #endif /* ?MODERN */ | |
988 | ||
989 | /* | |
990 | * If <limits.h> exists on most systems, should include that, since it may | |
991 | * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX, | |
992 | * _POSIX_PATH_MAX. | |
993 | */ | |
994 | #ifdef DOS_FLX_OS2 | |
995 | # include <limits.h> | |
996 | #endif | |
997 | ||
998 | #ifndef PATH_MAX | |
999 | # ifdef MAXPATHLEN | |
1000 | # define PATH_MAX MAXPATHLEN /* in <sys/param.h> on some systems */ | |
1001 | # else | |
1002 | # ifdef _MAX_PATH | |
1003 | # define PATH_MAX _MAX_PATH | |
1004 | # else | |
1005 | # if FILENAME_MAX > 255 | |
1006 | # define PATH_MAX FILENAME_MAX /* used like PATH_MAX on some systems */ | |
1007 | # else | |
1008 | # define PATH_MAX 1024 | |
1009 | # endif | |
1010 | # endif /* ?_MAX_PATH */ | |
1011 | # endif /* ?MAXPATHLEN */ | |
1012 | #endif /* !PATH_MAX */ | |
1013 | ||
1014 | #define FILNAMSIZ PATH_MAX | |
1015 | ||
1016 | #ifdef SHORT_SYMS /* Mark Williams C, ...? */ | |
1017 | # define extract_or_test_files xtr_or_tst_files | |
1018 | # define extract_or_test_member xtr_or_tst_member | |
1019 | #endif | |
1020 | ||
1021 | #ifdef REALLY_SHORT_SYMS /* TOPS-20 linker: first 6 chars */ | |
1022 | # define process_cdir_file_hdr XXpcdfh | |
1023 | # define process_local_file_hdr XXplfh | |
1024 | # define extract_or_test_files XXxotf /* necessary? */ | |
1025 | # define extract_or_test_member XXxotm /* necessary? */ | |
1026 | # define check_for_newer XXcfn | |
1027 | # define overwrite_all XXoa | |
1028 | # define process_all_files XXpaf | |
1029 | # define extra_field XXef | |
1030 | # define explode_lit8 XXel8 | |
1031 | # define explode_lit4 XXel4 | |
1032 | # define explode_nolit8 XXnl8 | |
1033 | # define explode_nolit4 XXnl4 | |
1034 | # define cpdist8 XXcpdist8 | |
1035 | # define inflate_codes XXic | |
1036 | # define inflate_stored XXis | |
1037 | # define inflate_fixed XXif | |
1038 | # define inflate_dynamic XXid | |
1039 | # define inflate_block XXib | |
1040 | # define maxcodemax XXmax | |
1041 | #endif | |
1042 | ||
1043 | #ifndef S_TIME_T_MAX /* max value of signed (>= 32-bit) time_t */ | |
1044 | # define S_TIME_T_MAX ((time_t)(ulg)0x7fffffffL) | |
1045 | #endif | |
1046 | #ifndef U_TIME_T_MAX /* max value of unsigned (>= 32-bit) time_t */ | |
1047 | # define U_TIME_T_MAX ((time_t)(ulg)0xffffffffL) | |
1048 | #endif | |
1049 | #ifdef DOSTIME_MINIMUM /* min DOSTIME value (1980-01-01) */ | |
1050 | # undef DOSTIME_MINIMUM | |
1051 | #endif | |
1052 | #define DOSTIME_MINIMUM ((ulg)0x00210000L) | |
1053 | #ifdef DOSTIME_2038_01_18 /* approximate DOSTIME equivalent of */ | |
1054 | # undef DOSTIME_2038_01_18 /* the signed-32-bit time_t limit */ | |
1055 | #endif | |
1056 | #define DOSTIME_2038_01_18 ((ulg)0x74320000L) | |
1057 | ||
1058 | #ifdef QDOS | |
1059 | # define ZSUFX "_zip" | |
1060 | # define ALT_ZSUFX ".zip" | |
1061 | #else | |
1062 | # ifdef RISCOS | |
1063 | # define ZSUFX "/zip" | |
1064 | # else | |
1065 | # define ZSUFX ".zip" | |
1066 | # endif | |
1067 | # define ALT_ZSUFX ".ZIP" /* Unix-only so far (only case-sensitive fs) */ | |
1068 | #endif | |
1069 | ||
1070 | #define CENTRAL_HDR_SIG "\001\002" /* the infamous "PK" signature bytes, */ | |
1071 | #define LOCAL_HDR_SIG "\003\004" /* sans "PK" (so unzip executable not */ | |
1072 | #define END_CENTRAL_SIG "\005\006" /* mistaken for zipfile itself) */ | |
1073 | #define EXTD_LOCAL_SIG "\007\010" /* [ASCII "\113" == EBCDIC "\080" ??] */ | |
1074 | ||
1075 | /* choice of activities for do_string() */ | |
1076 | #define SKIP 0 /* skip header block */ | |
1077 | #define DISPLAY 1 /* display archive comment (ASCII) */ | |
1078 | #define DISPL_8 5 /* display file comment (ext. ASCII) */ | |
1079 | #define DS_FN 2 /* read filename (ext. ASCII) */ | |
1080 | #define EXTRA_FIELD 3 /* copy extra field into buffer */ | |
1081 | #define DS_EF 3 | |
1082 | #ifdef AMIGA | |
1083 | # define FILENOTE 4 | |
1084 | #endif | |
1085 | ||
1086 | #define DOES_NOT_EXIST -1 /* return values for check_for_newer() */ | |
1087 | #define EXISTS_AND_OLDER 0 | |
1088 | #define EXISTS_AND_NEWER 1 | |
1089 | ||
1090 | #define ROOT 0 /* checkdir() extract-to path: called once */ | |
1091 | #define INIT 1 /* allocate buildpath: called once per member */ | |
1092 | #define APPEND_DIR 2 /* append a dir comp.: many times per member */ | |
1093 | #define APPEND_NAME 3 /* append actual filename: once per member */ | |
1094 | #define GETPATH 4 /* retrieve the complete path and free it */ | |
1095 | #define END 5 /* free root path prior to exiting program */ | |
1096 | ||
1097 | /* version_made_by codes (central dir): make sure these */ | |
1098 | /* are not defined on their respective systems!! */ | |
1099 | #define FS_FAT_ 0 /* filesystem used by MS-DOS, OS/2, Win32 */ | |
1100 | #define AMIGA_ 1 | |
1101 | #define VMS_ 2 | |
1102 | #define UNIX_ 3 | |
1103 | #define VM_CMS_ 4 | |
1104 | #define ATARI_ 5 /* what if it's a minix filesystem? [cjh] */ | |
1105 | #define FS_HPFS_ 6 /* filesystem used by OS/2 (and NT 3.x) */ | |
1106 | #define MAC_ 7 /* HFS filesystem used by MacOS */ | |
1107 | #define Z_SYSTEM_ 8 | |
1108 | #define CPM_ 9 | |
1109 | #define TOPS20_ 10 | |
1110 | #define FS_NTFS_ 11 /* filesystem used by Windows NT */ | |
1111 | #define QDOS_ 12 | |
1112 | #define ACORN_ 13 /* Archimedes Acorn RISC OS */ | |
1113 | #define FS_VFAT_ 14 /* filesystem used by Windows 95, NT */ | |
1114 | #define MVS_ 15 | |
1115 | #define BEOS_ 16 /* hybrid POSIX/database filesystem */ | |
1116 | #define TANDEM_ 17 /* Tandem/NSK */ | |
1117 | #define NUM_HOSTS 18 /* index of last system + 1 */ | |
1118 | ||
1119 | #define STORED 0 /* compression methods */ | |
1120 | #define SHRUNK 1 | |
1121 | #define REDUCED1 2 | |
1122 | #define REDUCED2 3 | |
1123 | #define REDUCED3 4 | |
1124 | #define REDUCED4 5 | |
1125 | #define IMPLODED 6 | |
1126 | #define TOKENIZED 7 | |
1127 | #define DEFLATED 8 | |
1128 | #define ENHDEFLATED 9 | |
1129 | #define DCLIMPLODED 10 | |
1130 | #define NUM_METHODS 11 /* index of last method + 1 */ | |
1131 | /* don't forget to update list_files(), extract.c and zipinfo.c appropriately | |
1132 | * if NUM_METHODS changes */ | |
1133 | ||
1134 | /* (the PK-class error codes are public and have been moved into unzip.h) */ | |
1135 | ||
1136 | #define DF_MDY 0 /* date format 10/26/91 (USA only) */ | |
1137 | #define DF_DMY 1 /* date format 26/10/91 (most of the world) */ | |
1138 | #define DF_YMD 2 /* date format 91/10/26 (a few countries) */ | |
1139 | ||
1140 | /*--------------------------------------------------------------------------- | |
1141 | Extra-field block ID values and offset info. | |
1142 | ---------------------------------------------------------------------------*/ | |
1143 | /* extra-field ID values, all little-endian: */ | |
1144 | #define EF_AV 0x0007 /* PKWARE's authenticity verification */ | |
1145 | #define EF_OS2 0x0009 /* OS/2 extended attributes */ | |
1146 | #define EF_PKW32 0x000a /* PKWARE's Win95/98/WinNT filetimes */ | |
1147 | #define EF_PKVMS 0x000c /* PKWARE's VMS */ | |
1148 | #define EF_PKUNIX 0x000d /* PKWARE's Unix */ | |
1149 | #define EF_IZVMS 0x4d49 /* Info-ZIP's VMS ("IM") */ | |
1150 | #define EF_IZUNIX 0x5855 /* Info-ZIP's old Unix[1] ("UX") */ | |
1151 | #define EF_IZUNIX2 0x7855 /* Info-ZIP's new Unix[2] ("Ux") */ | |
1152 | #define EF_TIME 0x5455 /* universal timestamp ("UT") */ | |
1153 | #define EF_MAC3 0x334d /* Info-ZIP's new Macintosh (= "M3") */ | |
1154 | #define EF_JLMAC 0x07c8 /* Johnny Lee's old Macintosh (= 1992) */ | |
1155 | #define EF_ZIPIT 0x2605 /* Thomas Brown's Macintosh (ZipIt) */ | |
1156 | #define EF_ZIPIT2 0x2705 /* T. Brown's Mac (ZipIt) v 1.3.8 and newer ? */ | |
1157 | #define EF_VMCMS 0x4704 /* Info-ZIP's VM/CMS ("\004G") */ | |
1158 | #define EF_MVS 0x470f /* Info-ZIP's MVS ("\017G") */ | |
1159 | #define EF_ACL 0x4c41 /* (OS/2) access control list ("AL") */ | |
1160 | #define EF_NTSD 0x4453 /* NT security descriptor ("SD") */ | |
1161 | #define EF_BEOS 0x6542 /* BeOS ("Be") */ | |
1162 | #define EF_QDOS 0xfb4a /* SMS/QDOS ("J\373") */ | |
1163 | #define EF_AOSVS 0x5356 /* AOS/VS ("VS") */ | |
1164 | #define EF_SPARK 0x4341 /* David Pilling's Acorn/SparkFS ("AC") */ | |
1165 | #define EF_MD5 0x4b46 /* Fred Kantor's MD5 ("FK") */ | |
1166 | #define EF_ASIUNIX 0x756e /* ASi's Unix ("nu") */ | |
1167 | ||
1168 | #define EB_HEADSIZE 4 /* length of extra field block header */ | |
1169 | #define EB_ID 0 /* offset of block ID in header */ | |
1170 | #define EB_LEN 2 /* offset of data length field in header */ | |
1171 | #define EB_UCSIZE_P 0 /* offset of ucsize field in compr. data */ | |
1172 | #define EB_CMPRHEADLEN 6 /* lenght of compression header */ | |
1173 | ||
1174 | #define EB_UX_MINLEN 8 /* minimal "UX" field contains atime, mtime */ | |
1175 | #define EB_UX_FULLSIZE 12 /* full "UX" field (atime, mtime, uid, gid) */ | |
1176 | #define EB_UX_ATIME 0 /* offset of atime in "UX" extra field data */ | |
1177 | #define EB_UX_MTIME 4 /* offset of mtime in "UX" extra field data */ | |
1178 | #define EB_UX_UID 8 /* byte offset of UID in "UX" field data */ | |
1179 | #define EB_UX_GID 10 /* byte offset of GID in "UX" field data */ | |
1180 | ||
1181 | #define EB_UX2_MINLEN 4 /* minimal "Ux" field contains UID/GID */ | |
1182 | #define EB_UX2_UID 0 /* byte offset of UID in "Ux" field data */ | |
1183 | #define EB_UX2_GID 2 /* byte offset of GID in "Ux" field data */ | |
1184 | #define EB_UX2_VALID (1 << 8) /* UID/GID present */ | |
1185 | ||
1186 | #define EB_UT_MINLEN 1 /* minimal UT field contains Flags byte */ | |
1187 | #define EB_UT_FLAGS 0 /* byte offset of Flags field */ | |
1188 | #define EB_UT_TIME1 1 /* byte offset of 1st time value */ | |
1189 | #define EB_UT_FL_MTIME (1 << 0) /* mtime present */ | |
1190 | #define EB_UT_FL_ATIME (1 << 1) /* atime present */ | |
1191 | #define EB_UT_FL_CTIME (1 << 2) /* ctime present */ | |
1192 | ||
1193 | #define EB_FLGS_OFFS 4 /* offset of flags area in generic compressed | |
1194 | extra field blocks (OS2, NT, and others) */ | |
1195 | #define EB_OS2_HLEN 4 /* size of OS2/ACL compressed data header */ | |
1196 | #define EB_BEOS_HLEN 5 /* length of BeOS e.f attribute header */ | |
1197 | #define EB_BE_FL_UNCMPR 0x01 /* "BeOS attributes uncompressed" bit flag */ | |
1198 | #define EB_MAC3_HLEN 14 /* length of Mac3 attribute block header */ | |
1199 | #define EB_M3_FL_DATFRK 0x01 /* "this entry is data fork" flag */ | |
1200 | #define EB_M3_FL_UNCMPR 0x04 /* "Mac3 attributes uncompressed" bit flag */ | |
1201 | #define EB_M3_FL_TIME64 0x08 /* "Mac3 time fields are 64 bit wide" flag */ | |
1202 | #define EB_M3_FL_NOUTC 0x10 /* "Mac3 timezone offset fields missing" flag */ | |
1203 | ||
1204 | #define EB_NTSD_C_LEN 4 /* length of central NT security data */ | |
1205 | #define EB_NTSD_L_LEN 5 /* length of minimal local NT security data */ | |
1206 | #define EB_NTSD_VERSION 4 /* offset of NTSD version byte */ | |
1207 | #define EB_NTSD_MAX_VER (0) /* maximum version # we know how to handle */ | |
1208 | ||
1209 | #define EB_ASI_CRC32 0 /* offset of ASI Unix field's crc32 checksum */ | |
1210 | #define EB_ASI_MODE 4 /* offset of ASI Unix permission mode field */ | |
1211 | ||
1212 | /*--------------------------------------------------------------------------- | |
1213 | True sizes of the various headers, as defined by PKWARE--so it is not | |
1214 | likely that these will ever change. But if they do, make sure both these | |
1215 | defines AND the typedefs below get updated accordingly. | |
1216 | ---------------------------------------------------------------------------*/ | |
1217 | #define LREC_SIZE 26 /* lengths of local file headers, central */ | |
1218 | #define CREC_SIZE 42 /* directory headers, and the end-of- */ | |
1219 | #define ECREC_SIZE 18 /* central-dir record, respectively */ | |
1220 | ||
1221 | #define MAX_BITS 13 /* used in unshrink() */ | |
1222 | #define HSIZE (1 << MAX_BITS) /* size of global work area */ | |
1223 | ||
1224 | #define LF 10 /* '\n' on ASCII machines; must be 10 due to EBCDIC */ | |
1225 | #define CR 13 /* '\r' on ASCII machines; must be 13 due to EBCDIC */ | |
1226 | #define CTRLZ 26 /* DOS & OS/2 EOF marker (used in fileio.c, vms.c) */ | |
1227 | ||
1228 | #ifdef EBCDIC | |
1229 | # define foreign(c) ascii[(uch)(c)] | |
1230 | # define native(c) ebcdic[(uch)(c)] | |
1231 | # define NATIVE "EBCDIC" | |
1232 | # define NOANSIFILT | |
1233 | #endif | |
1234 | ||
1235 | #if (defined(CRAY) && defined(ZMEM)) | |
1236 | # undef ZMEM | |
1237 | #endif | |
1238 | ||
1239 | #ifdef ZMEM | |
1240 | # undef ZMEM | |
1241 | # define memcmp(b1,b2,len) bcmp(b2,b1,len) | |
1242 | # define memcpy(dest,src,len) bcopy(src,dest,len) | |
1243 | # define memzero bzero | |
1244 | #else | |
1245 | # define memzero(dest,len) memset(dest,0,len) | |
1246 | #endif | |
1247 | ||
1248 | #ifdef VMS | |
1249 | # define ENV_UNZIP "UNZIP_OPTS" /* names of environment variables */ | |
1250 | # define ENV_ZIPINFO "ZIPINFO_OPTS" | |
1251 | #endif /* VMS */ | |
1252 | #ifdef RISCOS | |
1253 | # define ENV_UNZIP "Unzip$Options" | |
1254 | # define ENV_ZIPINFO "Zipinfo$Options" | |
1255 | # define ENV_UNZIPEXTS "Unzip$Exts" | |
1256 | #endif /* RISCOS */ | |
1257 | #ifndef ENV_UNZIP | |
1258 | # define ENV_UNZIP "UNZIP" /* the standard names */ | |
1259 | # define ENV_ZIPINFO "ZIPINFO" | |
1260 | #endif | |
1261 | #define ENV_UNZIP2 "UNZIPOPT" /* alternate names, for zip compat. */ | |
1262 | #define ENV_ZIPINFO2 "ZIPINFOOPT" | |
1263 | ||
1264 | #if (!defined(QQ) && !defined(NOQQ)) | |
1265 | # define QQ | |
1266 | #endif | |
1267 | ||
1268 | #ifdef QQ /* Newtware version: no file */ | |
1269 | # define QCOND (!uO.qflag) /* comments with -vq or -vqq */ | |
1270 | #else /* Bill Davidsen version: no way to */ | |
1271 | # define QCOND (longhdr) /* kill file comments when listing */ | |
1272 | #endif | |
1273 | ||
1274 | #ifdef OLD_QQ | |
1275 | # define QCOND2 (uO.qflag < 2) | |
1276 | #else | |
1277 | # define QCOND2 (!uO.qflag) | |
1278 | #endif | |
1279 | ||
1280 | #ifndef TRUE | |
1281 | # define TRUE 1 /* sort of obvious */ | |
1282 | #endif | |
1283 | #ifndef FALSE | |
1284 | # define FALSE 0 | |
1285 | #endif | |
1286 | ||
1287 | #ifndef SEEK_SET | |
1288 | # define SEEK_SET 0 | |
1289 | # define SEEK_CUR 1 | |
1290 | # define SEEK_END 2 | |
1291 | #endif | |
1292 | ||
1293 | #if (defined(UNIX) && defined(S_IFLNK) && !defined(MTS)) | |
1294 | # define SYMLINKS | |
1295 | # ifndef S_ISLNK | |
1296 | # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) | |
1297 | # endif | |
1298 | #endif /* UNIX && S_IFLNK && !MTS */ | |
1299 | ||
1300 | #ifndef S_ISDIR | |
1301 | # ifdef CMS_MVS | |
1302 | # define S_ISDIR(m) (FALSE) | |
1303 | # else | |
1304 | # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | |
1305 | # endif | |
1306 | #endif | |
1307 | ||
1308 | #ifndef IS_VOLID | |
1309 | # define IS_VOLID(m) ((m) & 0x08) | |
1310 | #endif | |
1311 | ||
1312 | ||
1313 | ||
1314 | ||
1315 | ||
1316 | /**************/ | |
1317 | /* Typedefs */ | |
1318 | /**************/ | |
1319 | ||
1320 | #ifdef NO_UID_GID | |
1321 | # ifdef UID_USHORT | |
1322 | typedef unsigned short uid_t; /* TI SysV.3 */ | |
1323 | typedef unsigned short gid_t; | |
1324 | # else | |
1325 | typedef unsigned int uid_t; /* SCO Xenix */ | |
1326 | typedef unsigned int gid_t; | |
1327 | # endif | |
1328 | #endif | |
1329 | ||
1330 | #if (defined(WIN32) || defined(sgi) || defined(GOT_UTIMBUF) || defined(ATARI)) | |
1331 | typedef struct utimbuf ztimbuf; | |
1332 | #else | |
1333 | typedef struct ztimbuf { | |
1334 | time_t actime; /* new access time */ | |
1335 | time_t modtime; /* new modification time */ | |
1336 | } ztimbuf; | |
1337 | #endif | |
1338 | ||
1339 | typedef struct iztimes { | |
1340 | time_t atime; /* new access time */ | |
1341 | time_t mtime; /* new modification time */ | |
1342 | time_t ctime; /* used for creation time; NOT same as st_ctime */ | |
1343 | } iztimes; | |
1344 | ||
1345 | #ifdef SET_DIR_ATTRIB | |
1346 | typedef struct dirtime { /* temporary struct for holding directory info */ | |
1347 | struct dirtime *next; /* until can be sorted and set at end */ | |
1348 | char *fn; /* filename of directory */ | |
1349 | union { | |
1350 | iztimes t3; /* mtime, atime, ctime */ | |
1351 | ztimbuf t2; /* modtime, actime */ | |
1352 | } u; | |
1353 | unsigned perms; /* same as min_info.file_attr */ | |
1354 | int have_uidgid; /* flag */ | |
1355 | ush uidgid[2]; | |
1356 | } dirtime; | |
1357 | #endif /* SET_DIR_ATTRIB */ | |
1358 | ||
1359 | typedef struct min_info { | |
1360 | long offset; | |
1361 | ulg crc; /* crc (needed if extended header) */ | |
1362 | ulg compr_size; /* compressed size (needed if extended header) */ | |
1363 | ulg uncompr_size; /* uncompressed size (needed if extended header) */ | |
1364 | int hostnum; | |
1365 | unsigned file_attr; /* local flavor, as used by creat(), chmod()... */ | |
1366 | unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing */ | |
1367 | unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */ | |
1368 | unsigned textfile : 1; /* file is text (according to zip) */ | |
1369 | unsigned textmode : 1; /* file is to be extracted as text */ | |
1370 | unsigned lcflag : 1; /* convert filename to lowercase */ | |
1371 | unsigned vollabel : 1; /* "file" is an MS-DOS volume (disk) label */ | |
1372 | } min_info; | |
1373 | ||
1374 | typedef struct VMStimbuf { | |
1375 | char *revdate; /* (both roughly correspond to Unix modtime/st_mtime) */ | |
1376 | char *credate; | |
1377 | } VMStimbuf; | |
1378 | ||
1379 | /*--------------------------------------------------------------------------- | |
1380 | Zipfile work area declarations. | |
1381 | ---------------------------------------------------------------------------*/ | |
1382 | ||
1383 | #ifdef MALLOC_WORK | |
1384 | union work { | |
1385 | struct { /* unshrink(): */ | |
1386 | shrint *Parent; /* (8193 * sizeof(shrint)) */ | |
1387 | uch *value; | |
1388 | uch *Stack; | |
1389 | } shrink; | |
1390 | uch *Slide; /* explode(), inflate(), unreduce() */ | |
1391 | }; | |
1392 | #else /* !MALLOC_WORK */ | |
1393 | union work { | |
1394 | struct { /* unshrink(): */ | |
1395 | shrint Parent[HSIZE]; /* (8192 * sizeof(shrint)) == 16KB minimum */ | |
1396 | uch value[HSIZE]; /* 8KB */ | |
1397 | uch Stack[HSIZE]; /* 8KB */ | |
1398 | } shrink; /* total = 32KB minimum; 80KB on Cray/Alpha */ | |
1399 | uch Slide[WSIZE]; /* explode(), inflate(), unreduce() */ | |
1400 | }; | |
1401 | #endif /* ?MALLOC_WORK */ | |
1402 | ||
1403 | #define slide G.area.Slide | |
1404 | ||
1405 | #if (defined(DLL) && !defined(NO_SLIDE_REDIR)) | |
1406 | # define redirSlide G.redirect_sldptr | |
1407 | #else | |
1408 | # define redirSlide G.area.Slide | |
1409 | #endif | |
1410 | ||
1411 | /*--------------------------------------------------------------------------- | |
1412 | Zipfile layout declarations. If these headers ever change, make sure the | |
1413 | xxREC_SIZE defines (above) change with them! | |
1414 | ---------------------------------------------------------------------------*/ | |
1415 | ||
1416 | typedef uch local_byte_hdr[ LREC_SIZE ]; | |
1417 | # define L_VERSION_NEEDED_TO_EXTRACT_0 0 | |
1418 | # define L_VERSION_NEEDED_TO_EXTRACT_1 1 | |
1419 | # define L_GENERAL_PURPOSE_BIT_FLAG 2 | |
1420 | # define L_COMPRESSION_METHOD 4 | |
1421 | # define L_LAST_MOD_DOS_DATETIME 6 | |
1422 | # define L_CRC32 10 | |
1423 | # define L_COMPRESSED_SIZE 14 | |
1424 | # define L_UNCOMPRESSED_SIZE 18 | |
1425 | # define L_FILENAME_LENGTH 22 | |
1426 | # define L_EXTRA_FIELD_LENGTH 24 | |
1427 | ||
1428 | typedef uch cdir_byte_hdr[ CREC_SIZE ]; | |
1429 | # define C_VERSION_MADE_BY_0 0 | |
1430 | # define C_VERSION_MADE_BY_1 1 | |
1431 | # define C_VERSION_NEEDED_TO_EXTRACT_0 2 | |
1432 | # define C_VERSION_NEEDED_TO_EXTRACT_1 3 | |
1433 | # define C_GENERAL_PURPOSE_BIT_FLAG 4 | |
1434 | # define C_COMPRESSION_METHOD 6 | |
1435 | # define C_LAST_MOD_DOS_DATETIME 8 | |
1436 | # define C_CRC32 12 | |
1437 | # define C_COMPRESSED_SIZE 16 | |
1438 | # define C_UNCOMPRESSED_SIZE 20 | |
1439 | # define C_FILENAME_LENGTH 24 | |
1440 | # define C_EXTRA_FIELD_LENGTH 26 | |
1441 | # define C_FILE_COMMENT_LENGTH 28 | |
1442 | # define C_DISK_NUMBER_START 30 | |
1443 | # define C_INTERNAL_FILE_ATTRIBUTES 32 | |
1444 | # define C_EXTERNAL_FILE_ATTRIBUTES 34 | |
1445 | # define C_RELATIVE_OFFSET_LOCAL_HEADER 38 | |
1446 | ||
1447 | typedef uch ec_byte_rec[ ECREC_SIZE+4 ]; | |
1448 | /* define SIGNATURE 0 space-holder only */ | |
1449 | # define NUMBER_THIS_DISK 4 | |
1450 | # define NUM_DISK_WITH_START_CENTRAL_DIR 6 | |
1451 | # define NUM_ENTRIES_CENTRL_DIR_THS_DISK 8 | |
1452 | # define TOTAL_ENTRIES_CENTRAL_DIR 10 | |
1453 | # define SIZE_CENTRAL_DIRECTORY 12 | |
1454 | # define OFFSET_START_CENTRAL_DIRECTORY 16 | |
1455 | # define ZIPFILE_COMMENT_LENGTH 20 | |
1456 | ||
1457 | ||
1458 | typedef struct local_file_header { /* LOCAL */ | |
1459 | uch version_needed_to_extract[2]; | |
1460 | ush general_purpose_bit_flag; | |
1461 | ush compression_method; | |
1462 | ulg last_mod_dos_datetime; | |
1463 | ulg crc32; | |
1464 | ulg csize; | |
1465 | ulg ucsize; | |
1466 | ush filename_length; | |
1467 | ush extra_field_length; | |
1468 | } local_file_hdr; | |
1469 | ||
1470 | #if 0 | |
1471 | typedef struct central_directory_file_header { /* CENTRAL */ | |
1472 | uch version_made_by[2]; | |
1473 | uch version_needed_to_extract[2]; | |
1474 | ush general_purpose_bit_flag; | |
1475 | ush compression_method; | |
1476 | ulg last_mod_dos_datetime; | |
1477 | ulg crc32; | |
1478 | ulg csize; | |
1479 | ulg ucsize; | |
1480 | ush filename_length; | |
1481 | ush extra_field_length; | |
1482 | ush file_comment_length; | |
1483 | ush disk_number_start; | |
1484 | ush internal_file_attributes; | |
1485 | ulg external_file_attributes; | |
1486 | ulg relative_offset_local_header; | |
1487 | } cdir_file_hdr; | |
1488 | #endif /* 0 */ | |
1489 | ||
1490 | typedef struct end_central_dir_record { /* END CENTRAL */ | |
1491 | ush number_this_disk; | |
1492 | ush num_disk_start_cdir; | |
1493 | ush num_entries_centrl_dir_ths_disk; | |
1494 | ush total_entries_central_dir; | |
1495 | ulg size_central_directory; | |
1496 | ulg offset_start_central_directory; | |
1497 | ush zipfile_comment_length; | |
1498 | } ecdir_rec; | |
1499 | ||
1500 | ||
1501 | /* Huffman code lookup table entry--this entry is four bytes for machines | |
1502 | that have 16-bit pointers (e.g. PC's in the small or medium model). | |
1503 | Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16 | |
1504 | means that v is a literal, 16 < e < 32 means that v is a pointer to | |
1505 | the next table, which codes e - 16 bits, and lastly e == 99 indicates | |
1506 | an unused code. If a code with e == 99 is looked up, this implies an | |
1507 | error in the data. */ | |
1508 | ||
1509 | struct huft { | |
1510 | uch e; /* number of extra bits or operation */ | |
1511 | uch b; /* number of bits in this code or subcode */ | |
1512 | union { | |
1513 | ush n; /* literal, length base, or distance base */ | |
1514 | struct huft *t; /* pointer to next level of table */ | |
1515 | } v; | |
1516 | }; | |
1517 | ||
1518 | ||
1519 | typedef struct _APIDocStruct { | |
1520 | char *compare; | |
1521 | char *function; | |
1522 | char *syntax; | |
1523 | char *purpose; | |
1524 | } APIDocStruct; | |
1525 | ||
1526 | ||
1527 | ||
1528 | ||
1529 | /*************/ | |
1530 | /* Globals */ | |
1531 | /*************/ | |
1532 | ||
1533 | #if (defined(OS2) && !defined(FUNZIP)) | |
1534 | # include "os2/os2data.h" | |
1535 | #endif | |
1536 | ||
1537 | #include "globals.h" | |
1538 | ||
1539 | ||
1540 | ||
1541 | /*************************/ | |
1542 | /* Function Prototypes */ | |
1543 | /*************************/ | |
1544 | ||
1545 | /*--------------------------------------------------------------------------- | |
1546 | Functions in unzip.c (initialization routines): | |
1547 | ---------------------------------------------------------------------------*/ | |
1548 | ||
1549 | #ifndef WINDLL | |
1550 | int MAIN OF((int argc, char **argv)); | |
1551 | int unzip OF((__GPRO__ int argc, char **argv)); | |
1552 | int uz_opts OF((__GPRO__ int *pargc, char ***pargv)); | |
1553 | int usage OF((__GPRO__ int error)); | |
1554 | #endif /* !WINDLL */ | |
1555 | ||
1556 | /*--------------------------------------------------------------------------- | |
1557 | Functions in process.c (main driver routines): | |
1558 | ---------------------------------------------------------------------------*/ | |
1559 | ||
1560 | int process_zipfiles OF((__GPRO)); | |
1561 | void free_G_buffers OF((__GPRO)); | |
1562 | /* static int do_seekable OF((__GPRO__ int lastchance)); */ | |
1563 | /* static int find_ecrec OF((__GPRO__ long searchlen)); */ | |
1564 | int uz_end_central OF((__GPRO)); | |
1565 | int process_cdir_file_hdr OF((__GPRO)); | |
1566 | int get_cdir_ent OF((__GPRO)); | |
1567 | int process_local_file_hdr OF((__GPRO)); | |
1568 | unsigned ef_scan_for_izux OF((uch *ef_buf, unsigned ef_len, int ef_is_c, | |
1569 | ulg dos_mdatetime, | |
1570 | iztimes *z_utim, ush *z_uidgid)); | |
1571 | ||
1572 | #ifndef SFX | |
1573 | ||
1574 | /*--------------------------------------------------------------------------- | |
1575 | Functions in zipinfo.c (`zipinfo-style' listing routines): | |
1576 | ---------------------------------------------------------------------------*/ | |
1577 | ||
1578 | #ifndef NO_ZIPINFO | |
1579 | #ifndef WINDLL | |
1580 | int zi_opts OF((__GPRO__ int *pargc, char ***pargv)); | |
1581 | #endif | |
1582 | int zi_end_central OF((__GPRO)); | |
1583 | int zipinfo OF((__GPRO)); | |
1584 | /* static int zi_long OF((__GPRO__ ulg *pEndprev)); */ | |
1585 | /* static int zi_short OF((__GPRO)); */ | |
1586 | /* static char *zi_time OF((__GPRO__ ZCONST ulg *datetimez, | |
1587 | ZCONST time_t *modtimez, char *d_t_str));*/ | |
1588 | #endif /* !NO_ZIPINFO */ | |
1589 | ||
1590 | /*--------------------------------------------------------------------------- | |
1591 | Functions in list.c (generic zipfile-listing routines): | |
1592 | ---------------------------------------------------------------------------*/ | |
1593 | ||
1594 | int list_files OF((__GPRO)); | |
1595 | #ifdef TIMESTAMP | |
1596 | int get_time_stamp OF((__GPRO__ time_t *last_modtime, | |
1597 | unsigned *nmember)); | |
1598 | #endif | |
1599 | int ratio OF((ulg uc, ulg c)); | |
1600 | void fnprint OF((__GPRO)); | |
1601 | ||
1602 | #endif /* !SFX */ | |
1603 | ||
1604 | /*--------------------------------------------------------------------------- | |
1605 | Functions in fileio.c: | |
1606 | ---------------------------------------------------------------------------*/ | |
1607 | ||
1608 | int open_input_file OF((__GPRO)); | |
1609 | int open_outfile OF((__GPRO)); /* also vms.c */ | |
1610 | void undefer_input OF((__GPRO)); | |
1611 | void defer_leftover_input OF((__GPRO)); | |
1612 | unsigned readbuf OF((__GPRO__ char *buf, register unsigned len)); | |
1613 | int readbyte OF((__GPRO)); | |
1614 | int fillinbuf OF((__GPRO)); | |
1615 | #ifdef FUNZIP | |
1616 | int flush OF((__GPRO__ ulg size)); /* actually funzip.c */ | |
1617 | #else | |
1618 | int flush OF((__GPRO__ uch *buf, ulg size, int unshrink)); | |
1619 | #endif | |
1620 | /* static int disk_error OF((__GPRO)); */ | |
1621 | void handler OF((int signal)); | |
1622 | time_t dos_to_unix_time OF((ulg dos_datetime)); | |
1623 | int check_for_newer OF((__GPRO__ char *filename)); /* os2,vmcms,vms */ | |
1624 | int do_string OF((__GPRO__ unsigned int len, int option)); | |
1625 | ush makeword OF((ZCONST uch *b)); | |
1626 | ulg makelong OF((ZCONST uch *sig)); | |
1627 | #if (!defined(STR_TO_ISO) || defined(NEED_STR2ISO)) | |
1628 | char *str2iso OF((char *dst, ZCONST char *src)); | |
1629 | #endif | |
1630 | #if (!defined(STR_TO_OEM) || defined(NEED_STR2OEM)) | |
1631 | char *str2oem OF((char *dst, ZCONST char *src)); | |
1632 | #endif | |
1633 | int zstrnicmp OF((register ZCONST char *s1, | |
1634 | register ZCONST char *s2, | |
1635 | register unsigned n)); | |
1636 | #ifdef REGULUS | |
1637 | int zstat OF((char *p, struct stat *s)); | |
1638 | #endif | |
1639 | #ifdef ZMEM /* MUST be ifdef'd because of conflicts with the standard def. */ | |
1640 | zvoid *memset OF((register zvoid *, register int, register unsigned int)); | |
1641 | int memcmp OF((register ZCONST zvoid*, register ZCONST zvoid *, | |
1642 | register unsigned int)); | |
1643 | zvoid *memcpy OF((register zvoid *, register ZCONST zvoid *, | |
1644 | register unsigned int)); | |
1645 | #endif | |
1646 | #ifdef SMALL_MEM | |
1647 | char *fLoadFarString OF((__GPRO__ const char Far *sz)); | |
1648 | char *fLoadFarStringSmall OF((__GPRO__ const char Far *sz)); | |
1649 | char *fLoadFarStringSmall2 OF((__GPRO__ const char Far *sz)); | |
1650 | #ifndef zfstrcpy | |
1651 | char Far * Far zfstrcpy OF((char Far *s1, const char Far *s2)); | |
1652 | #endif | |
1653 | #endif | |
1654 | ||
1655 | ||
1656 | /*--------------------------------------------------------------------------- | |
1657 | Functions in extract.c: | |
1658 | ---------------------------------------------------------------------------*/ | |
1659 | ||
1660 | int extract_or_test_files OF((__GPRO)); | |
1661 | /* static int store_info OF((void)); */ | |
1662 | /* static int extract_or_test_member OF((__GPRO)); */ | |
1663 | /* static int TestExtraField OF((__GPRO__ uch *ef, unsigned ef_len)); */ | |
1664 | /* static int test_OS2 OF((__GPRO__ uch *eb, unsigned eb_size)); */ | |
1665 | /* static int test_NT OF((__GPRO__ uch *eb, unsigned eb_size)); */ | |
1666 | int memextract OF((__GPRO__ uch *tgt, ulg tgtsize, | |
1667 | uch *src, ulg srcsize)); | |
1668 | int memflush OF((__GPRO__ uch *rawbuf, ulg size)); | |
1669 | char *fnfilter OF((ZCONST char *raw, uch *space)); | |
1670 | ||
1671 | /*--------------------------------------------------------------------------- | |
1672 | Decompression functions: | |
1673 | ---------------------------------------------------------------------------*/ | |
1674 | ||
1675 | #if (!defined(SFX) && !defined(FUNZIP)) | |
1676 | int explode OF((__GPRO)); /* explode.c */ | |
1677 | #endif | |
1678 | int huft_free OF((struct huft *t)); /* inflate.c */ | |
1679 | int huft_build OF((__GPRO__ ZCONST unsigned *b, unsigned n, | |
1680 | unsigned s, ZCONST ush *d, ZCONST ush *e, | |
1681 | struct huft **t, int *m)); | |
1682 | #ifdef USE_ZLIB | |
1683 | int UZinflate OF((__GPRO)); /* inflate.c */ | |
1684 | # define inflate_free(x) inflateEnd(&((Uz_Globs *)(&G))->dstrm) | |
1685 | #else | |
1686 | int inflate OF((__GPRO)); /* inflate.c */ | |
1687 | int inflate_free OF((__GPRO)); /* inflate.c */ | |
1688 | #endif /* ?USE_ZLIB */ | |
1689 | #if (!defined(SFX) && !defined(FUNZIP)) | |
1690 | void unreduce OF((__GPRO)); /* unreduce.c */ | |
1691 | /* static void LoadFollowers OF((__GPRO__ f_array *follower, uch *Slen)); | |
1692 | * unreduce.c */ | |
1693 | int unshrink OF((__GPRO)); /* unshrink.c */ | |
1694 | /* static void partial_clear OF((__GPRO)); * unshrink.c */ | |
1695 | #endif /* !SFX && !FUNZIP */ | |
1696 | ||
1697 | /*--------------------------------------------------------------------------- | |
1698 | Internal API functions (only included in DLL versions): | |
1699 | ---------------------------------------------------------------------------*/ | |
1700 | ||
1701 | #ifdef DLL | |
1702 | void setFileNotFound OF((__GPRO)); /* api.c */ | |
1703 | int unzipToMemory OF((__GPRO__ char *zip, char *file, | |
1704 | UzpBuffer *retstr)); /* api.c */ | |
1705 | int redirect_outfile OF((__GPRO)); /* api.c */ | |
1706 | int writeToMemory OF((__GPRO__ uch *rawbuf, ulg size)); | |
1707 | int close_redirect OF((__GPRO)); /* api.c */ | |
1708 | /* this obsolescent entry point kept for compatibility: */ | |
1709 | int UzpUnzip OF((int argc, char **argv));/* use UzpMain */ | |
1710 | #ifdef OS2DLL | |
1711 | int varmessage OF((__GPRO__ uch *buf, ulg size)); | |
1712 | int varputchar OF((__GPRO__ int c)); /* rexxapi.c */ | |
1713 | int finish_REXX_redirect OF((__GPRO)); /* rexxapi.c */ | |
1714 | #endif | |
1715 | #ifdef API_DOC | |
1716 | void APIhelp OF((__GPRO__ int argc, char **argv)); | |
1717 | #endif /* apihelp.c */ | |
1718 | #endif /* DLL */ | |
1719 | ||
1720 | /*--------------------------------------------------------------------------- | |
1721 | Acorn RISC OS-only functions: | |
1722 | ---------------------------------------------------------------------------*/ | |
1723 | ||
1724 | #ifdef RISCOS | |
1725 | int isRISCOSexfield OF((void *extra_field)); /* acorn.c */ | |
1726 | void setRISCOSexfield OF((char *path, void *extra_field)); /* acorn.c */ | |
1727 | void printRISCOSexfield OF((int isdir, void *extra_field)); /* acorn.c */ | |
1728 | #endif | |
1729 | ||
1730 | /*--------------------------------------------------------------------------- | |
1731 | Human68K-only functions: | |
1732 | ---------------------------------------------------------------------------*/ | |
1733 | ||
1734 | #ifdef __human68k__ | |
1735 | void InitTwentyOne OF((void)); | |
1736 | #endif | |
1737 | ||
1738 | /*--------------------------------------------------------------------------- | |
1739 | Macintosh-only functions: | |
1740 | ---------------------------------------------------------------------------*/ | |
1741 | ||
1742 | #ifdef MACOS | |
1743 | void screenOpen OF((char *)); /* macscreen.c */ | |
1744 | void screenControl OF((char *, int)); /* macscreen.c */ | |
1745 | void screenDump OF((char *, long)); /* macscreen.c */ | |
1746 | void screenUpdate OF((WindowPtr)); /* macscreen.c */ | |
1747 | void screenClose OF((void)); /* macscreen.c */ | |
1748 | int macgetch OF((void)); /* macscreen.c */ | |
1749 | ||
1750 | int macmkdir OF((char *)); /* mac.c */ | |
1751 | short macopen OF((char *, short)); /* mac.c */ | |
1752 | short maccreat OF((char *)); /* mac.c */ | |
1753 | short macread OF((short, char *, unsigned)); /* mac.c */ | |
1754 | long macwrite OF((short, char *, unsigned)); /* mac.c */ | |
1755 | short macclose OF((short)); /* mac.c */ | |
1756 | long maclseek OF((short, long, short)); /* mac.c */ | |
1757 | char *macfgets OF((char *, int, FILE *)); /* mac.c */ | |
1758 | int macfprintf OF((FILE *, char *, ...)); /* mac.c */ | |
1759 | int macprintf OF((char *, ...)); /* mac.c */ | |
1760 | #endif | |
1761 | ||
1762 | /*--------------------------------------------------------------------------- | |
1763 | MSDOS-only functions: | |
1764 | ---------------------------------------------------------------------------*/ | |
1765 | ||
1766 | #if (defined(MSDOS) && (defined(__GO32__) || defined(__EMX__))) | |
1767 | unsigned _dos_getcountryinfo(void *); /* msdos.c */ | |
1768 | #if (!defined(__DJGPP__) || (__DJGPP__ < 2)) | |
1769 | unsigned _dos_setftime(int, unsigned short, unsigned short); /* msdos.c */ | |
1770 | unsigned _dos_setfileattr(char *, unsigned); /* msdos.c */ | |
1771 | unsigned _dos_creat(char *, unsigned, int *); /* msdos.c */ | |
1772 | void _dos_getdrive(unsigned *); /* msdos.c */ | |
1773 | unsigned _dos_close(int); /* msdos.c */ | |
1774 | #endif /* !__DJGPP__ || (__DJGPP__ < 2) */ | |
1775 | #endif | |
1776 | ||
1777 | /*--------------------------------------------------------------------------- | |
1778 | OS/2-only functions: | |
1779 | ---------------------------------------------------------------------------*/ | |
1780 | ||
1781 | #ifdef OS2 /* GetFileTime conflicts with something in Win32 header files */ | |
1782 | #if (defined(REENTRANT) && defined(USETHREADID)) | |
1783 | ulg GetThreadId OF((void)); | |
1784 | #endif | |
1785 | int GetCountryInfo OF((void)); /* os2.c */ | |
1786 | long GetFileTime OF((ZCONST char *name)); /* os2.c */ | |
1787 | /* static void SetPathAttrTimes OF((__GPRO__ int flags, int dir)); os2.c */ | |
1788 | /* static int SetEAs OF((__GPRO__ const char *path, | |
1789 | void *eablock)); os2.c */ | |
1790 | /* static int SetACL OF((__GPRO__ const char *path, | |
1791 | void *eablock)); os2.c */ | |
1792 | /* static int IsFileNameValid OF((const char *name)); os2.c */ | |
1793 | /* static void map2fat OF((char *pathcomp, char **pEndFAT)); os2.c */ | |
1794 | /* static int SetLongNameEA OF((char *name, char *longname)); os2.c */ | |
1795 | /* static void InitNLS OF((void)); os2.c */ | |
1796 | int IsUpperNLS OF((int nChr)); /* os2.c */ | |
1797 | int ToLowerNLS OF((int nChr)); /* os2.c */ | |
1798 | void DebugMalloc OF((void)); /* os2.c */ | |
1799 | #endif | |
1800 | ||
1801 | /*--------------------------------------------------------------------------- | |
1802 | QDOS-only functions: | |
1803 | ---------------------------------------------------------------------------*/ | |
1804 | ||
1805 | #ifdef QDOS | |
1806 | int QMatch (uch, uch); | |
1807 | void QFilename (__GPRO__ char *); | |
1808 | char *Qstrfix (char *); | |
1809 | int QReturn (int zip_error); | |
1810 | #endif | |
1811 | ||
1812 | /*--------------------------------------------------------------------------- | |
1813 | TOPS20-only functions: | |
1814 | ---------------------------------------------------------------------------*/ | |
1815 | ||
1816 | #ifdef TOPS20 | |
1817 | int upper OF((char *s)); /* tops20.c */ | |
1818 | int enquote OF((char *s)); /* tops20.c */ | |
1819 | int dequote OF((char *s)); /* tops20.c */ | |
1820 | int fnlegal OF(()); /* error if prototyped? */ /* tops20.c */ | |
1821 | #endif | |
1822 | ||
1823 | /*--------------------------------------------------------------------------- | |
1824 | VM/CMS- and MVS-only functions: | |
1825 | ---------------------------------------------------------------------------*/ | |
1826 | ||
1827 | #ifdef CMS_MVS | |
1828 | extent getVMMVSexfield OF((char *type, uch *ef_block, unsigned datalen)); | |
1829 | FILE *vmmvs_open_infile OF((__GPRO)); /* vmmvs.c */ | |
1830 | void close_infile OF((__GPRO)); /* vmmvs.c */ | |
1831 | #endif | |
1832 | ||
1833 | /*--------------------------------------------------------------------------- | |
1834 | VMS-only functions: | |
1835 | ---------------------------------------------------------------------------*/ | |
1836 | ||
1837 | #ifdef VMS | |
1838 | int check_format OF((__GPRO)); /* vms.c */ | |
1839 | /* int open_outfile OF((__GPRO)); * (see fileio.c) vms.c */ | |
1840 | /* int flush OF((__GPRO__ uch *rawbuf, unsigned size, | |
1841 | int final_flag)); * (see fileio.c) vms.c */ | |
1842 | #ifdef RETURN_CODES | |
1843 | void return_VMS OF((__GPRO__ int zip_error)); /* vms.c */ | |
1844 | #else | |
1845 | void return_VMS OF((int zip_error)); /* vms.c */ | |
1846 | #endif | |
1847 | #ifdef VMSCLI | |
1848 | ulg vms_unzip_cmdline OF((int *, char ***)); /* cmdline.c */ | |
1849 | int VMSCLI_usage OF((__GPRO__ int error)); /* cmdline.c */ | |
1850 | #endif | |
1851 | #endif | |
1852 | ||
1853 | /*--------------------------------------------------------------------------- | |
1854 | WIN32-only functions: | |
1855 | ---------------------------------------------------------------------------*/ | |
1856 | ||
1857 | #ifdef WIN32 | |
1858 | int IsWinNT OF((void)); /* win32.c */ | |
1859 | #ifdef NTSD_EAS | |
1860 | void process_defer_NT OF((__GPRO)); /* win32.c */ | |
1861 | int test_NTSD OF((__GPRO__ uch *eb, unsigned eb_size, | |
1862 | uch *eb_ucptr, ulg eb_ucsize)); /* win32.c */ | |
1863 | # define TEST_NTSD test_NTSD | |
1864 | #endif | |
1865 | #ifdef W32_STAT_BANDAID | |
1866 | int zstat_win32 OF((__W32STAT_GLOBALS__ | |
1867 | const char *path, struct stat *buf)); /* win32.c */ | |
1868 | #endif | |
1869 | #endif | |
1870 | ||
1871 | /*--------------------------------------------------------------------------- | |
1872 | Miscellaneous/shared functions: | |
1873 | ---------------------------------------------------------------------------*/ | |
1874 | ||
1875 | Uz_Globs *globalsCtor OF((void)); /* globals.c */ | |
1876 | ||
1877 | void envargs OF((__GPRO__ int *Pargc, char ***Pargv, | |
1878 | ZCONST char *envstr, ZCONST char *envstr2)); | |
1879 | /* envargs.c */ | |
1880 | void mksargs OF((int *argcp, char ***argvp)); /* envargs.c */ | |
1881 | ||
1882 | int match OF((ZCONST char *s, ZCONST char *p, | |
1883 | int ic)); /* match.c */ | |
1884 | int iswild OF((ZCONST char *p)); /* match.c */ | |
1885 | ||
1886 | #ifdef DYNALLOC_CRCTAB | |
1887 | void free_crc_table OF((void)); /* crctab.c */ | |
1888 | #endif | |
1889 | #ifndef USE_ZLIB | |
1890 | ZCONST ulg near *get_crc_table OF((void)); /* funzip.c, crctab.c */ | |
1891 | ulg crc32 OF((ulg crc, ZCONST uch *buf, extent len)); | |
1892 | #endif /* !USE_ZLIB */ /* assembler source or crc32.c */ | |
1893 | ||
1894 | int dateformat OF((void)); /* currently, only msdos.c */ | |
1895 | #ifndef WINDLL | |
1896 | void version OF((__GPRO)); /* local */ | |
1897 | #endif | |
1898 | int mapattr OF((__GPRO)); /* local */ | |
1899 | int mapname OF((__GPRO__ int renamed)); /* local */ | |
1900 | int checkdir OF((__GPRO__ char *pathcomp, int flag)); /* local */ | |
1901 | char *do_wild OF((__GPRO__ char *wildzipfn)); /* local */ | |
1902 | char *GetLoadPath OF((__GPRO)); /* local */ | |
1903 | #if (defined(MORE) && (defined(UNIX) || defined(VMS) || defined(__BEOS__))) | |
1904 | int screenlines OF((void)); /* local */ | |
1905 | #endif | |
1906 | #ifndef MTS /* macro in MTS */ | |
1907 | void close_outfile OF((__GPRO)); /* local */ | |
1908 | #endif | |
1909 | #ifdef SET_DIR_ATTRIB | |
1910 | int set_direc_attribs OF((__GPRO__ dirtime *d)); /* local */ | |
1911 | #endif | |
1912 | #ifdef TIMESTAMP | |
1913 | # ifdef WIN32 | |
1914 | int stamp_file OF((__GPRO__ | |
1915 | ZCONST char *fname, time_t modtime)); /* local */ | |
1916 | # else | |
1917 | int stamp_file OF((ZCONST char *fname, time_t modtime)); /* local */ | |
1918 | # endif | |
1919 | #endif | |
1920 | #ifdef SYSTEM_SPECIFIC_CTOR | |
1921 | void SYSTEM_SPECIFIC_CTOR OF((__GPRO)); /* local */ | |
1922 | #endif | |
1923 | ||
1924 | ||
1925 | ||
1926 | ||
1927 | ||
1928 | /************/ | |
1929 | /* Macros */ | |
1930 | /************/ | |
1931 | ||
1932 | #ifndef MAX | |
1933 | # define MAX(a,b) ((a) > (b) ? (a) : (b)) | |
1934 | #endif | |
1935 | #ifndef MIN | |
1936 | # define MIN(a,b) ((a) < (b) ? (a) : (b)) | |
1937 | #endif | |
1938 | ||
1939 | #ifdef DEBUG | |
1940 | # define Trace(x) fprintf x | |
1941 | #else | |
1942 | # define Trace(x) | |
1943 | #endif | |
1944 | ||
1945 | #ifdef DEBUG_TIME | |
1946 | # define TTrace(x) fprintf x | |
1947 | #else | |
1948 | # define TTrace(x) | |
1949 | #endif | |
1950 | ||
1951 | #ifdef NO_DEBUG_IN_MACROS | |
1952 | # define MTrace(x) | |
1953 | #else | |
1954 | # define MTrace(x) Trace(x) | |
1955 | #endif | |
1956 | ||
1957 | #if (defined(UNIX) || defined(T20_VMS)) /* generally old systems */ | |
1958 | # define ToLower(x) ((char)(isupper((int)x)? tolower((int)x) : x)) | |
1959 | #else | |
1960 | # define ToLower tolower /* assumed "smart"; used in match() */ | |
1961 | #endif | |
1962 | ||
1963 | #ifdef USE_STRM_INPUT | |
1964 | /* ``Replace'' the unbuffered UNIX style I/O function with similar | |
1965 | * standard C functions from <stdio.h>. | |
1966 | */ | |
1967 | # define read(fd,buf,n) fread((buf),1,(n),(FILE *)(fd)) | |
1968 | # define lseek(fd,o,w) fseek((FILE *)(fd),(o),(w)) | |
1969 | # define close(fd) fclose((FILE *)(fd)) | |
1970 | #endif /* USE_STRM_INPUT */ | |
1971 | ||
1972 | /* The return value of the Info() "macro function" is never checked in | |
1973 | * UnZip. Otherwise, to get the same behaviour as for (*G.message)(), the | |
1974 | * Info() definition for "FUNZIP" would have to be corrected: | |
1975 | * #define Info(buf,flag,sprf_arg) \ | |
1976 | * (fprintf((flag)&1? stderr : stdout, \ | |
1977 | * (char *)(sprintf sprf_arg, (buf))) == EOF) | |
1978 | */ | |
1979 | #ifndef Info /* may already have been defined for redirection */ | |
1980 | # ifdef FUNZIP | |
1981 | # define Info(buf,flag,sprf_arg) \ | |
1982 | fprintf((flag)&1? stderr : stdout, (char *)(sprintf sprf_arg, (buf))) | |
1983 | # else | |
1984 | # ifdef INT_SPRINTF /* optimized version for "int sprintf()" flavour */ | |
1985 | # define Info(buf,flag,sprf_arg) \ | |
1986 | (*G.message)((zvoid *)&G, (uch *)(buf), (ulg)sprintf sprf_arg, (flag)) | |
1987 | # else /* generic version, does not use sprintf() return value */ | |
1988 | # define Info(buf,flag,sprf_arg) \ | |
1989 | (*G.message)((zvoid *)&G, (uch *)(buf), \ | |
1990 | (ulg)(sprintf sprf_arg, strlen((char *)(buf))), (flag)) | |
1991 | # endif | |
1992 | # endif | |
1993 | #endif /* !Info */ | |
1994 | ||
1995 | #undef Info | |
1996 | #define Info(buf,flag,sprf_arg) (0) | |
1997 | ||
1998 | /* The following macros wrappers around the fnfilter function are used many | |
1999 | * times to prepare archive entry names or name components for displaying | |
2000 | * listings and (warning/error) messages. They use sections in the upper half | |
2001 | * of 'slide' as buffer, since their output is normally fed through the | |
2002 | * Info() macro with 'slide' (the start of this area) as message buffer. | |
2003 | */ | |
2004 | #define FnFilter1(fname) fnfilter((fname), slide + (WSIZE>>1)) | |
2005 | #define FnFilter2(fname) fnfilter((fname), slide + ((WSIZE>>1) + (WSIZE>>2))) | |
2006 | ||
2007 | #ifndef FUNZIP /* used only in inflate.c */ | |
2008 | # define MESSAGE(str,len,flag) (*G.message)((zvoid *)&G,(str),(len),(flag)) | |
2009 | #endif | |
2010 | ||
2011 | #if 0 /* Optimization: use the (const) result of crc32(0L,NULL,0) */ | |
2012 | # define CRCVAL_INITIAL crc32(0L, NULL, 0) | |
2013 | #else | |
2014 | # define CRCVAL_INITIAL 0L | |
2015 | #endif | |
2016 | ||
2017 | #ifndef TEST_NTSD /* "NTSD valid?" checking function */ | |
2018 | # define TEST_NTSD NULL /* ... is not available */ | |
2019 | #endif | |
2020 | ||
2021 | /* | |
2022 | * Seek to the block boundary of the block which includes abs_offset, | |
2023 | * then read block into input buffer and set pointers appropriately. | |
2024 | * If block is already in the buffer, just set the pointers. This macro | |
2025 | * is used by uz_end_central (process.c), zi_end_central (zipinfo.c) and | |
2026 | * do_string (fileio.c). A slightly modified version is embedded within | |
2027 | * extract_or_test_files (extract.c). readbyte() and readbuf() (fileio.c) | |
2028 | * are compatible. NOTE THAT abs_offset is intended to be the "proper off- | |
2029 | * set" (i.e., if there were no extra bytes prepended); cur_zipfile_bufstart | |
2030 | * contains the corrected offset. | |
2031 | * | |
2032 | * Since ZLSEEK is never used during decompression, it is safe to use the | |
2033 | * slide[] buffer for the error message. | |
2034 | * | |
2035 | * The awkward "%cbs_offset" construct is provided for the obnoxious Solaris | |
2036 | * compiler, which wants to do macro substitution inside strings. | |
2037 | */ | |
2038 | ||
2039 | #ifndef ZLSEEK | |
2040 | # ifdef USE_STRM_INPUT | |
2041 | # define _ZLS_RELOAD(abs_offset) {\ | |
2042 | MTrace((stderr, "ZLSEEK: %cbs_offset = %ld, G.extra_bytes = %ld\n",\ | |
2043 | 'a', (abs_offset), G.extra_bytes));\ | |
2044 | fseek(G.zipfd,(LONGINT)bufstart,SEEK_SET);\ | |
2045 | G.cur_zipfile_bufstart = ftell(G.zipfd);\ | |
2046 | MTrace((stderr,\ | |
2047 | " request = %ld, (abs+extra) = %ld, inbuf_offset = %ld\n",\ | |
2048 | request, ((abs_offset)+G.extra_bytes), inbuf_offset));\ | |
2049 | MTrace((stderr, " bufstart = %ld, cur_zipfile_bufstart = %ld\n",\ | |
2050 | bufstart, G.cur_zipfile_bufstart));\ | |
2051 | if ((G.incnt = fread((char *)G.inbuf,1,INBUFSIZ,G.zipfd)) <= 0)\ | |
2052 | return(PK_EOF);\ | |
2053 | G.inptr = G.inbuf + (int)inbuf_offset;\ | |
2054 | G.incnt -= (int)inbuf_offset;\ | |
2055 | } | |
2056 | # else /* !USE_STRM_INPUT */ | |
2057 | # define _ZLS_RELOAD(abs_offset) {\ | |
2058 | MTrace((stderr, "ZLSEEK: %cbs_offset = %ld, G.extra_bytes = %ld\n",\ | |
2059 | 'a', (abs_offset), G.extra_bytes));\ | |
2060 | G.cur_zipfile_bufstart = lseek(G.zipfd,(LONGINT)bufstart,SEEK_SET);\ | |
2061 | MTrace((stderr,\ | |
2062 | " request = %ld, (abs+extra) = %ld, inbuf_offset = %ld\n",\ | |
2063 | request, ((abs_offset)+G.extra_bytes), inbuf_offset));\ | |
2064 | MTrace((stderr, " bufstart = %ld, cur_zipfile_bufstart = %ld\n",\ | |
2065 | bufstart, G.cur_zipfile_bufstart));\ | |
2066 | if ((G.incnt = read(G.zipfd,(char *)G.inbuf,INBUFSIZ)) <= 0)\ | |
2067 | return(PK_EOF);\ | |
2068 | G.inptr = G.inbuf + (int)inbuf_offset;\ | |
2069 | G.incnt -= (int)inbuf_offset;\ | |
2070 | } | |
2071 | # endif /* ?USE_STRM_INPUT */ | |
2072 | ||
2073 | # define ZLSEEK(abs_offset) {\ | |
2074 | LONGINT request = (abs_offset) + G.extra_bytes;\ | |
2075 | LONGINT inbuf_offset = request % INBUFSIZ;\ | |
2076 | LONGINT bufstart = request - inbuf_offset;\ | |
2077 | \ | |
2078 | if (request < 0) {\ | |
2079 | Info(slide, 1, ((char *)slide, LoadFarStringSmall(SeekMsg),\ | |
2080 | G.zipfn, LoadFarString(ReportMsg)));\ | |
2081 | return(PK_BADERR);\ | |
2082 | } else if (bufstart != G.cur_zipfile_bufstart)\ | |
2083 | _ZLS_RELOAD(abs_offset)\ | |
2084 | else {\ | |
2085 | G.incnt += (G.inptr-G.inbuf) - (int)inbuf_offset;\ | |
2086 | G.inptr = G.inbuf + (int)inbuf_offset;\ | |
2087 | }\ | |
2088 | } | |
2089 | #endif /* !ZLSEEK */ | |
2090 | ||
2091 | #define SKIP_(length) if(length&&((error=do_string(__G__ length,SKIP))!=0))\ | |
2092 | {error_in_archive=error; if(error>1) return error;} | |
2093 | ||
2094 | /* | |
2095 | * Skip a variable-length field, and report any errors. Used in zipinfo.c | |
2096 | * and unzip.c in several functions. | |
2097 | * | |
2098 | * macro SKIP_(length) | |
2099 | * ush length; | |
2100 | * { | |
2101 | * if (length && ((error = do_string(length, SKIP)) != 0)) { | |
2102 | * error_in_archive = error; /-* might be warning *-/ | |
2103 | * if (error > 1) /-* fatal *-/ | |
2104 | * return (error); | |
2105 | * } | |
2106 | * } | |
2107 | * | |
2108 | */ | |
2109 | ||
2110 | ||
2111 | #ifdef FUNZIP | |
2112 | # define FLUSH(w) flush(__G__ (ulg)(w)) | |
2113 | # define NEXTBYTE getc(G.in) /* redefined in crypt.h if full version */ | |
2114 | #else | |
2115 | # define FLUSH(w) if (G.mem_mode) memflush(__G__ redirSlide,(ulg)(w)); \ | |
2116 | else flush(__G__ redirSlide,(ulg)(w),0) | |
2117 | # define NEXTBYTE (--G.incnt >= 0 ? (int)(*G.inptr++) : readbyte(__G)) | |
2118 | #endif | |
2119 | ||
2120 | ||
2121 | #define READBITS(nbits,zdest) {if(nbits>G.bits_left) {int temp; G.zipeof=1;\ | |
2122 | while (G.bits_left<=8*(int)(sizeof(G.bitbuf)-1) && (temp=NEXTBYTE)!=EOF) {\ | |
2123 | G.bitbuf|=(ulg)temp<<G.bits_left; G.bits_left+=8; G.zipeof=0;}}\ | |
2124 | zdest=(shrint)((ush)G.bitbuf&mask_bits[nbits]);G.bitbuf>>=nbits;\ | |
2125 | G.bits_left-=nbits;} | |
2126 | ||
2127 | /* | |
2128 | * macro READBITS(nbits,zdest) * only used by unreduce and unshrink * | |
2129 | * { | |
2130 | * if (nbits > G.bits_left) { * fill G.bitbuf, 8*sizeof(ulg) bits * | |
2131 | * int temp; | |
2132 | * | |
2133 | * G.zipeof = 1; | |
2134 | * while (G.bits_left <= 8*(int)(sizeof(G.bitbuf)-1) && | |
2135 | * (temp = NEXTBYTE) != EOF) { | |
2136 | * G.bitbuf |= (ulg)temp << G.bits_left; | |
2137 | * G.bits_left += 8; | |
2138 | * G.zipeof = 0; | |
2139 | * } | |
2140 | * } | |
2141 | * zdest = (shrint)((ush)G.bitbuf & mask_bits[nbits]); | |
2142 | * G.bitbuf >>= nbits; | |
2143 | * G.bits_left -= nbits; | |
2144 | * } | |
2145 | * | |
2146 | */ | |
2147 | ||
2148 | ||
2149 | /* GRR: should change name to STRLOWER and use StringLower if possible */ | |
2150 | ||
2151 | /* | |
2152 | * Copy the zero-terminated string in str1 into str2, converting any | |
2153 | * uppercase letters to lowercase as we go. str2 gets zero-terminated | |
2154 | * as well, of course. str1 and str2 may be the same character array. | |
2155 | */ | |
2156 | #ifdef __human68k__ | |
2157 | # define TOLOWER(str1, str2) \ | |
2158 | { \ | |
2159 | char *p=(str1), *q=(str2); \ | |
2160 | uch c; \ | |
2161 | while ((c = *p++) != '\0') { \ | |
2162 | if (iskanji(c)) { \ | |
2163 | if (*p == '\0') \ | |
2164 | break; \ | |
2165 | *q++ = c; \ | |
2166 | *q++ = *p++; \ | |
2167 | } else \ | |
2168 | *q++ = isupper(c) ? tolower(c) : c; \ | |
2169 | } \ | |
2170 | *q = '\0'; \ | |
2171 | } | |
2172 | #else | |
2173 | # define TOLOWER(str1, str2) \ | |
2174 | { \ | |
2175 | char *p, *q; \ | |
2176 | p = (str1) - 1; \ | |
2177 | q = (str2); \ | |
2178 | while (*++p) \ | |
2179 | *q++ = (char)(isupper((int)(*p))? tolower((int)(*p)) : *p); \ | |
2180 | *q = '\0'; \ | |
2181 | } | |
2182 | #endif | |
2183 | /* | |
2184 | * NOTES: This macro makes no assumptions about the characteristics of | |
2185 | * the tolower() function or macro (beyond its existence), nor does it | |
2186 | * make assumptions about the structure of the character set (i.e., it | |
2187 | * should work on EBCDIC machines, too). The fact that either or both | |
2188 | * of isupper() and tolower() may be macros has been taken into account; | |
2189 | * watch out for "side effects" (in the C sense) when modifying this | |
2190 | * macro. | |
2191 | */ | |
2192 | ||
2193 | #ifndef foreign | |
2194 | # define foreign(c) (c) | |
2195 | #endif | |
2196 | ||
2197 | #ifndef native | |
2198 | # define native(c) (c) | |
2199 | # define A_TO_N(str1) | |
2200 | #else | |
2201 | # ifndef NATIVE | |
2202 | # define NATIVE "native chars" | |
2203 | # endif | |
2204 | # define A_TO_N(str1) {register uch *p;\ | |
2205 | for (p=(uch *)(str1); *p; p++) *p=native(*p);} | |
2206 | #endif | |
2207 | /* | |
2208 | * Translate the zero-terminated string in str1 from ASCII to the native | |
2209 | * character set. The translation is performed in-place and uses the | |
2210 | * "native" macro to translate each character. | |
2211 | * | |
2212 | * NOTE: Using the "native" macro means that is it the only part of unzip | |
2213 | * which knows which translation table (if any) is actually in use to | |
2214 | * produce the native character set. This makes adding new character set | |
2215 | * translation tables easy, insofar as all that is needed is an appropriate | |
2216 | * "native" macro definition and the translation table itself. Currently, | |
2217 | * the only non-ASCII native character set implemented is EBCDIC, but this | |
2218 | * may not always be so. | |
2219 | */ | |
2220 | ||
2221 | ||
2222 | /* default setup for internal codepage: assume ISO 8859-1 compatibility!! */ | |
2223 | #if (!defined(NATIVE) && !defined(CRTL_CP_IS_ISO) && !defined(CRTL_CP_IS_OEM)) | |
2224 | # define CRTL_CP_IS_ISO | |
2225 | #endif | |
2226 | ||
2227 | ||
2228 | /* Translate "extended ASCII" chars (OEM coding for DOS and OS/2; else | |
2229 | * ISO-8859-1 [ISO Latin 1, Win Ansi,...]) into the internal "native" | |
2230 | * code page. As with A_TO_N(), conversion is done in place. | |
2231 | */ | |
2232 | #ifndef _ISO_INTERN | |
2233 | # ifdef CRTL_CP_IS_OEM | |
2234 | # ifndef IZ_ISO2OEM_ARRAY | |
2235 | # define IZ_ISO2OEM_ARRAY | |
2236 | # endif | |
2237 | # define _ISO_INTERN(str1) {register uch *p;\ | |
2238 | for (p=(uch *)(str1); *p; p++)\ | |
2239 | *p = native((*p & 0x80) ? iso2oem[*p & 0x7f] : *p);} | |
2240 | # else | |
2241 | # define _ISO_INTERN(str1) A_TO_N(str1) | |
2242 | # endif | |
2243 | #endif | |
2244 | ||
2245 | #ifndef _OEM_INTERN | |
2246 | # ifdef CRTL_CP_IS_OEM | |
2247 | # define _OEM_INTERN(str1) A_TO_N(str1) | |
2248 | # else | |
2249 | # ifndef IZ_OEM2ISO_ARRAY | |
2250 | # define IZ_OEM2ISO_ARRAY | |
2251 | # endif | |
2252 | # define _OEM_INTERN(str1) {register uch *p;\ | |
2253 | for (p=(uch *)(str1); *p; p++)\ | |
2254 | *p = native((*p & 0x80) ? oem2iso[*p & 0x7f] : *p);} | |
2255 | # endif | |
2256 | #endif | |
2257 | ||
2258 | #ifndef STR_TO_ISO | |
2259 | # ifdef CRTL_CP_IS_ISO | |
2260 | # define STR_TO_ISO strcpy | |
2261 | # else | |
2262 | # define STR_TO_ISO str2iso | |
2263 | # define NEED_STR2ISO | |
2264 | # endif | |
2265 | #endif | |
2266 | ||
2267 | #ifndef STR_TO_OEM | |
2268 | # ifdef CRTL_CP_IS_OEM | |
2269 | # define STR_TO_OEM strcpy | |
2270 | # else | |
2271 | # define STR_TO_OEM str2oem | |
2272 | # define NEED_STR2OEM | |
2273 | # endif | |
2274 | #endif | |
2275 | ||
2276 | #if (!defined(INTERN_TO_ISO) && !defined(ASCII2ISO)) | |
2277 | # ifdef CRTL_CP_IS_OEM | |
2278 | /* know: "ASCII" is "OEM" */ | |
2279 | # define ASCII2ISO(c) (((c) & 0x80) ? oem2iso[(c) & 0x7f] : (c)) | |
2280 | # if (defined(NEED_STR2ISO) && !defined(CRYP_USES_OEM2ISO)) | |
2281 | # define CRYP_USES_OEM2ISO | |
2282 | # endif | |
2283 | # else | |
2284 | /* assume: "ASCII" is "ISO-ANSI" */ | |
2285 | # define ASCII2ISO(c) (c) | |
2286 | # endif | |
2287 | #endif | |
2288 | ||
2289 | #if (!defined(INTERN_TO_OEM) && !defined(ASCII2OEM)) | |
2290 | # ifdef CRTL_CP_IS_OEM | |
2291 | /* know: "ASCII" is "OEM" */ | |
2292 | # define ASCII2OEM(c) (c) | |
2293 | # else | |
2294 | /* assume: "ASCII" is "ISO-ANSI" */ | |
2295 | # define ASCII2OEM(c) (((c) & 0x80) ? iso2oem[(c) & 0x7f] : (c)) | |
2296 | # if (defined(NEED_STR2OEM) && !defined(CRYP_USES_ISO2OEM)) | |
2297 | # define CRYP_USES_ISO2OEM | |
2298 | # endif | |
2299 | # endif | |
2300 | #endif | |
2301 | ||
2302 | /* codepage conversion setup for testp() in crypt.c */ | |
2303 | #ifdef CRTL_CP_IS_ISO | |
2304 | # ifndef STR_TO_CP2 | |
2305 | # define STR_TO_CP2 STR_TO_OEM | |
2306 | # endif | |
2307 | #else | |
2308 | # ifdef CRTL_CP_IS_OEM | |
2309 | # ifndef STR_TO_CP2 | |
2310 | # define STR_TO_CP2 STR_TO_ISO | |
2311 | # endif | |
2312 | # else /* native internal CP is neither ISO nor OEM */ | |
2313 | # ifndef STR_TO_CP1 | |
2314 | # define STR_TO_CP1 STR_TO_ISO | |
2315 | # endif | |
2316 | # ifndef STR_TO_CP2 | |
2317 | # define STR_TO_CP2 STR_TO_OEM | |
2318 | # endif | |
2319 | # endif | |
2320 | #endif | |
2321 | ||
2322 | ||
2323 | /* Convert filename (and file comment string) into "internal" charset. | |
2324 | * This macro assumes that Zip entry filenames are coded in OEM (IBM DOS) | |
2325 | * codepage when made on | |
2326 | * -> DOS (this includes 16-bit Windows 3.1) (FS_FAT_) | |
2327 | * -> OS/2 (FS_HPFS_) | |
2328 | * -> Win95/WinNT with Nico Mak's WinZip (FS_NTFS_ && hostver == "5.0") | |
2329 | * | |
2330 | * All other ports are assumed to code zip entry filenames in ISO 8859-1. | |
2331 | */ | |
2332 | #ifndef Ext_ASCII_TO_Native | |
2333 | # define Ext_ASCII_TO_Native(string, hostnum, hostver) \ | |
2334 | if ((hostnum) == FS_FAT_ || (hostnum) == FS_HPFS_ || \ | |
2335 | ((hostnum) == FS_NTFS_ && (hostver) == 50)) { \ | |
2336 | _OEM_INTERN((string)); \ | |
2337 | } else { \ | |
2338 | _ISO_INTERN((string)); \ | |
2339 | } | |
2340 | #endif | |
2341 | ||
2342 | ||
2343 | ||
2344 | /**********************/ | |
2345 | /* Global constants */ | |
2346 | /**********************/ | |
2347 | ||
2348 | extern ZCONST ush near mask_bits[]; | |
2349 | extern ZCONST char *fnames[2]; | |
2350 | ||
2351 | #ifdef EBCDIC | |
2352 | extern ZCONST uch ebcdic[]; | |
2353 | #endif | |
2354 | #ifdef IZ_ISO2OEM_ARRAY | |
2355 | extern ZCONST uch Far iso2oem[]; | |
2356 | #endif | |
2357 | #ifdef IZ_OEM2ISO_ARRAY | |
2358 | extern ZCONST uch Far oem2iso[]; | |
2359 | #endif | |
2360 | ||
2361 | extern ZCONST char Far VersionDate[]; | |
2362 | extern ZCONST char Far CentSigMsg[]; | |
2363 | extern ZCONST char Far EndSigMsg[]; | |
2364 | extern ZCONST char Far SeekMsg[]; | |
2365 | extern ZCONST char Far FilenameNotMatched[]; | |
2366 | extern ZCONST char Far ExclFilenameNotMatched[]; | |
2367 | extern ZCONST char Far ReportMsg[]; | |
2368 | ||
2369 | #ifndef SFX | |
2370 | extern ZCONST char Far CompiledWith[]; | |
2371 | #endif /* !SFX */ | |
2372 | ||
2373 | ||
2374 | ||
2375 | /***********************************/ | |
2376 | /* Global (shared?) RTL variables */ | |
2377 | /***********************************/ | |
2378 | ||
2379 | #ifdef DECLARE_ERRNO | |
2380 | extern int errno; | |
2381 | #endif | |
2382 | ||
2383 | ||
2384 | #endif /* !__unzpriv_h */ |