|
|
1.1 root 1: /*---------------------------------------------------------------------------
2:
3: unzip.h
4:
5: This header file is used by all of the unzip source files. Its contents
6: are divided into seven more-or-less separate sections: predefined macros,
7: OS-dependent includes, (mostly) OS-independent defines, typedefs, function
8: prototypes (or "prototypes," in the case of non-ANSI compilers), macros,
9: and global-variable declarations.
10:
11: ---------------------------------------------------------------------------*/
12:
13:
14:
15: /*****************************************/
16: /* Predefined, Machine-specific Macros */
17: /*****************************************/
18:
19: #if (defined(__GO32__) && defined(unix)) /* DOS extender */
20: # undef unix
21: #endif
22:
23: #if defined(unix) || defined(__convexc__) || defined(M_XENIX)
24: # ifndef UNIX
25: # define UNIX
26: # endif /* !UNIX */
27: #endif /* unix || __convexc__ || M_XENIX */
28:
29: /* Much of the following is swiped from zip's tailor.h: */
30:
31: /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
32: #ifdef __POWERC
33: # define __TURBOC__
34: # define MSDOS
35: #endif /* __POWERC */
36: #if (defined(__TURBOC__) && defined(__MSDOS__) && !defined(MSDOS))
37: # define MSDOS
38: #endif
39:
40: /* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C,
41: * or Silicon Graphics, or Convex, or IBM C Set/2, or GNU gcc under emx, or
42: * or Watcom C, or Macintosh, or Windows NT.
43: */
44: #if (__STDC__ || defined(MSDOS) || defined(sgi) || defined(CONVEX))
45: # ifndef PROTO
46: # define PROTO
47: # endif
48: # define MODERN
49: #endif
50: #if (defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__))
51: # ifndef PROTO
52: # define PROTO
53: # endif
54: # define MODERN
55: #endif
56: #if (defined(THINK_C) || defined(MPW) || defined(WIN32))
57: # ifndef PROTO
58: # define PROTO
59: # endif
60: # define MODERN
61: #endif
62:
63: /* turn off prototypes if requested */
64: #if (defined(NOPROTO) && defined(PROTO))
65: # undef PROTO
66: #endif
67:
68: /* used to remove arguments in function prototypes for non-ANSI C */
69: #ifdef PROTO
70: # define OF(a) a
71: #else /* !PROTO */
72: # define OF(a) ()
73: #endif /* ?PROTO */
74:
75: #if (defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr))
76: # if (!defined(BSD) && !defined(__SYSTEM_FIVE) && !defined(SYSV))
77: # define BSD
78: # endif /* !BSD && !__SYSTEM_FIVE && !SYSV */
79: #endif /* ultrix || bsd4_2 || sun || pyr */
80:
81: #if (defined(CONVEX) || defined(CRAY) || defined(__SYSTEM_FIVE))
82: # ifndef TERMIO
83: # define TERMIO
84: # endif /* !TERMIO */
85: #endif /* CONVEX || CRAY || __SYSTEM_FIVE */
86:
87: #ifdef pyr /* Pyramid */
88: # ifndef ZMEM
89: # define ZMEM
90: # endif /* !ZMEM */
91: #endif /* pyr */
92:
93: #ifdef CRAY
94: # ifdef ZMEM
95: # undef ZMEM
96: # endif /* ZMEM */
97: #endif /* CRAY */
98:
99: /* the i386 test below is to catch SCO Unix (which has redefinition
100: * warnings if param.h is included), but it probably doesn't hurt if
101: * other 386 Unixes get nailed, too...except now that 386BSD and BSDI
102: * exist. Sigh. <sys/param.h> is mostly included for "BSD", I think.
103: * [An alternate fix for SCO Unix is below.]
104: */
105: #if (defined(MINIX) || (defined(i386) && defined(unix)))
106: # define NO_PARAM_H
107: #endif /* MINIX || (i386 && unix) */
108:
109:
110:
111:
112:
113: /***************************/
114: /* OS-Dependent Includes */
115: /***************************/
116:
117: #ifndef MINIX /* Minix needs it after all the other includes (?) */
118: # include <stdio.h>
119: #endif
120: #include <ctype.h> /* skip for VMS, to use tolower() function? */
121: #include <errno.h> /* used in mapname() */
122: #ifndef NO_ERRNO
123: # define DECLARE_ERRNO /* everybody except MSC 6.0, SCO cc, Watcom C/386 */
124: #endif /* !NO_ERRNO */
125: #ifdef VMS
126: # include <types.h> /* (placed up here instead of in VMS section below */
127: # include <stat.h> /* because types.h is used in some other headers) */
128: #else /* !VMS */
129: # if !defined(THINK_C) && !defined(MPW)
130: # include <sys/types.h> /* off_t, time_t, dev_t, ... */
131: # include <sys/stat.h>
132: # endif /* !THINK_C && !MPW */
133: #endif /* ?VMS */
134:
135: #ifdef MODERN
136: # if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun)))
137: # include <stddef.h>
138: # endif
139: # if (!defined(__GNUC__) && !defined(apollo)) /* both define __STDC__ */
140: # include <stdlib.h> /* standard library prototypes, malloc(), etc. */
141: # else
142: # ifdef __EMX__
143: # include <stdlib.h> /* emx IS gcc but has stdlib.h */
144: # endif
145: # endif
146: # include <string.h> /* defines strcpy, strcmp, memcpy, etc. */
147: typedef size_t extent;
148: typedef void voidp;
149: #else /* !MODERN */
150: char *malloc();
151: char *strchr(), *strrchr();
152: long lseek();
153: typedef unsigned int extent;
154: # define void int
155: typedef char voidp;
156: #endif /* ?MODERN */
157:
158: /* this include must be down here for SysV.4, for some reason... */
159: #include <signal.h> /* used in unzip.c, file_io.c */
160:
161:
162:
163: /*---------------------------------------------------------------------------
164: Next, a word from our Unix (mostly) sponsors:
165: ---------------------------------------------------------------------------*/
166:
167: #ifdef UNIX
168: # ifdef AMIGA
169: # include <libraries/dos.h>
170: # else /* !AMIGA */
171: # ifndef NO_PARAM_H
172: #if 0 /* [GRR: this is an alternate fix for SCO's redefinition bug] */
173: # ifdef NGROUPS_MAX
174: # undef NGROUPS_MAX /* SCO bug: defined again in <param.h> */
175: # endif /* NGROUPS_MAX */
176: #endif /* 0 */
177: # include <sys/param.h> /* conflict with <sys/types.h>, some systems? */
178: # endif /* !NO_PARAM_H */
179: # endif /* ?AMIGA */
180:
181: # ifndef BSIZE
182: # ifdef MINIX
183: # define BSIZE 1024
184: # else /* !MINIX */
185: # define BSIZE DEV_BSIZE /* assume common for all Unix systems */
186: # endif /* ?MINIX */
187: # endif
188:
189: # ifndef BSD
190: # if (!defined(AMIGA) && !defined(MINIX))
191: # define NO_MKDIR /* for mapname() */
192: # endif /* !AMIGA && !MINIX */
193: # include <time.h>
194: struct tm *gmtime(), *localtime();
195: # else /* BSD */
196: # include <sys/time.h>
197: # include <sys/timeb.h>
198: # ifdef _AIX
199: # include <time.h>
200: # endif
201: # endif
202:
203: #else /* !UNIX */
204: # define BSIZE 512 /* disk block size */
205: #endif /* ?UNIX */
206:
207: #if (defined(V7) || defined(BSD))
208: # define strchr index
209: # define strrchr rindex
210: #endif
211:
212: /*---------------------------------------------------------------------------
213: And now, our MS-DOS and OS/2 corner:
214: ---------------------------------------------------------------------------*/
215:
216: #ifdef __TURBOC__
217: # define DOS_OS2
218: # include <sys/timeb.h> /* for structure ftime */
219: # ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */
220: # include <mem.h> /* MEM.H related to __STDC__ and far poin- */
221: # endif /* ters. (dpk) [mem.h included for memcpy] */
222: # include <dos.h> /* for REGS macro (at least for Turbo C 2.0) */
223: #else /* NOT Turbo C (or Power C)... */
224: # ifdef MSDOS /* but still MS-DOS, so we'll assume it's */
225: # ifndef MSC /* Microsoft's compiler and fake the ID, if */
226: # define MSC /* necessary (it is in 5.0; apparently not */
227: # endif /* in 5.1 and 6.0) */
228: # include <dos.h> /* for _dos_setftime() */
229: # endif
230: #endif
231:
232: #if (defined(__IBMC__) && defined(__OS2__))
233: # define DOS_OS2
234: # define S_IFMT 0xF000
235: # define timezone _timezone
236: #endif
237:
238: #ifdef __WATCOMC__
239: # define DOS_OS2
240: # define __32BIT__
241: # ifdef DECLARE_ERRNO
242: # undef DECLARE_ERRNO
243: # endif
244: # undef far
245: # define far
246: #endif
247:
248: #ifdef __EMX__
249: # define DOS_OS2
250: # define __32BIT__
251: # define far
252: #endif /* __EMX__ */
253:
254: #ifdef MSC /* defined for all versions of MSC now */
255: # define DOS_OS2 /* Turbo C under DOS, MSC under DOS or OS/2 */
256: # if (defined(_MSC_VER) && (_MSC_VER >= 600)) /* new with 5.1 or 6.0 ... */
257: # undef DECLARE_ERRNO /* errno is now a function in a dynamic link */
258: # endif /* library (or something)--incompatible with */
259: #endif /* the usual "extern int errno" declaration */
260:
261: #ifdef DOS_OS2 /* defined for all MS-DOS and OS/2 compilers */
262: # include <io.h> /* lseek(), open(), setftime(), dup(), creat() */
263: # include <time.h> /* localtime() */
264: #endif
265:
266: #ifdef OS2 /* defined for all OS/2 compilers */
267: # ifdef isupper
268: # undef isupper
269: # endif
270: # ifdef tolower
271: # undef tolower
272: # endif
273: # define isupper(x) IsUpperNLS((unsigned char)(x))
274: # define tolower(x) ToLowerNLS((unsigned char)(x))
275: #endif
276:
277: #ifdef WIN32
278: # include <io.h> /* read(), open(), etc. */
279: # include <time.h>
280: # include <memory.h>
281: # include <direct.h> /* mkdir() */
282: # ifdef FILE_IO_C
283: # include <fcntl.h>
284: # include <conio.h>
285: # include <sys\types.h>
286: # include <sys\utime.h>
287: # include <windows.h>
288: # define DOS_OS2
289: # define getch() getchar()
290: # endif
291: #endif
292:
293: /*---------------------------------------------------------------------------
294: Followed by some VMS (mostly) stuff:
295: ---------------------------------------------------------------------------*/
296:
297: #ifdef VMS
298: # include <time.h> /* the usual non-BSD time functions */
299: # include <file.h> /* same things as fcntl.h has */
300: # include <rms.h>
301: # define _MAX_PATH NAM$C_MAXRSS /* to define FILNAMSIZ below */
302: # define UNIX /* can share most of same code from now on */
303: # define RETURN return_VMS /* VMS interprets return codes incorrectly */
304: #else /* !VMS */
305: # ifndef THINK_C
306: # define RETURN return /* only used in main() */
307: # else
308: # define RETURN(v) { int n;\
309: n = (v);\
310: fprintf(stderr, "\npress <return> to continue ");\
311: while (getc(stdin) != '\n');\
312: putc('\n', stderr);\
313: InitCursor();\
314: goto start;\
315: }
316: # endif
317: # ifdef V7
318: # define O_RDONLY 0
319: # define O_WRONLY 1
320: # define O_RDWR 2
321: # else /* !V7 */
322: # ifdef MTS
323: # include <sys/file.h> /* MTS uses this instead of fcntl.h */
324: # include <timeb.h>
325: # include <time.h>
326: # else /* !MTS */
327: # ifdef COHERENT /* Coherent 3.10/Mark Williams C */
328: # include <fcntl.h>
329: # include <time.h>
330: # define O_BINARY 0
331: # define SHORT_NAMES
332: # define tzset settz
333: # else /* !COHERENT */
334: # include <fcntl.h> /* O_BINARY for open() w/o CR/LF translation */
335: # endif /* ?COHERENT */
336: # endif /* ?MTS */
337: # endif /* ?V7 */
338: #endif /* ?VMS */
339:
340: #if (defined(MSDOS) || defined(VMS))
341: # define DOS_VMS
342: #endif
343:
344: /*---------------------------------------------------------------------------
345: And some Mac stuff for good measure:
346: ---------------------------------------------------------------------------*/
347:
348: #ifdef THINK_C
349: # define MACOS
350: # ifndef __STDC__ /* if Think C hasn't defined __STDC__ ... */
351: # define __STDC__ 1 /* make sure it's defined: it needs it */
352: # else /* __STDC__ defined */
353: # if !__STDC__ /* sometimes __STDC__ is defined as 0; */
354: # undef __STDC__ /* it needs to be 1 or required header */
355: # define __STDC__ 1 /* files are not properly included. */
356: # endif /* !__STDC__ */
357: # endif /* ?defined(__STDC__) */
358: #endif /* THINK_C */
359:
360: #ifdef MPW
361: # define MACOS
362: # include <Errors.h>
363: # include <Files.h>
364: # include <Memory.h>
365: # include <Quickdraw.h>
366: # include <ToolUtils.h>
367: # define CtoPstr c2pstr
368: # define PtoCstr p2cstr
369: # ifdef CR
370: # undef CR
371: # endif
372: #endif /* MPW */
373:
374: #ifdef MACOS
375: # define open(x,y) macopen(x,y, gnVRefNum, glDirID)
376: # define close macclose
377: # define read macread
378: # define write macwrite
379: # define lseek maclseek
380: # define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType)
381: # define stat(x,y) macstat(x,y,gnVRefNum, glDirID)
382:
383: # ifndef isascii
384: # define isascii(c) ((unsigned char)(c) <= 0x3F)
385: # endif
386:
387: # include "macstat.h"
388:
389: typedef struct _ZipExtraHdr {
390: unsigned short header; /* 2 bytes */
391: unsigned short data; /* 2 bytes */
392: } ZIP_EXTRA_HEADER;
393:
394: typedef struct _MacInfoMin {
395: unsigned short header; /* 2 bytes */
396: unsigned short data; /* 2 bytes */
397: unsigned long signature; /* 4 bytes */
398: FInfo finfo; /* 16 bytes */
399: unsigned long lCrDat; /* 4 bytes */
400: unsigned long lMdDat; /* 4 bytes */
401: unsigned long flags ; /* 4 bytes */
402: unsigned long lDirID; /* 4 bytes */
403: /*------------*/
404: } MACINFOMIN; /* = 40 bytes for size of data */
405:
406: typedef struct _MacInfo {
407: unsigned short header; /* 2 bytes */
408: unsigned short data; /* 2 bytes */
409: unsigned long signature; /* 4 bytes */
410: FInfo finfo; /* 16 bytes */
411: unsigned long lCrDat; /* 4 bytes */
412: unsigned long lMdDat; /* 4 bytes */
413: unsigned long flags ; /* 4 bytes */
414: unsigned long lDirID; /* 4 bytes */
415: char rguchVolName[28]; /* 28 bytes */
416: /*------------*/
417: } MACINFO; /* = 68 bytes for size of data */
418: #endif /* MACOS */
419:
420: /*---------------------------------------------------------------------------
421: And finally, some random extra stuff:
422: ---------------------------------------------------------------------------*/
423:
424: #ifdef MINIX
425: # include <stdio.h>
426: #endif
427:
428: #ifdef SHORT_NAMES /* Mark Williams C, ...? */
429: # define extract_or_test_files xtr_or_tst_files
430: # define extract_or_test_member xtr_or_tst_member
431: #endif
432:
433: #ifdef MTS
434: # include <unix.h> /* Some important non-ANSI routines */
435: # define mkdir(s,n) (-1) /* No "make directory" capability */
436: # define EBCDIC /* Set EBCDIC conversion on */
437: #endif
438:
439:
440:
441:
442:
443: /*************/
444: /* Defines */
445: /*************/
446:
447: #ifndef WSIZE
448: # define WSIZE 0x8000 /* window size--must be a power of two, and */
449: #endif /* !WSIZE */ /* at least 32K for zip's deflate method */
450:
451: #define DIR_BLKSIZ 64 /* number of directory entries per block
452: * (should fit in 4096 bytes, usually) */
453: #ifndef INBUFSIZ
454: # define INBUFSIZ 2048 /* works for MS-DOS small model */
455: #endif /* !INBUFSIZ */
456:
457: /*
458: * If <limits.h> exists on most systems, should include that, since it may
459: * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX,
460: * _POSIX_PATH_MAX.
461: */
462: #ifdef DOS_OS2
463: # include <limits.h>
464: #endif /* DOS_OS2 */
465:
466: #ifdef _MAX_PATH
467: # define FILNAMSIZ (_MAX_PATH)
468: #else /* !_MAX_PATH */
469: # define FILNAMSIZ 1025
470: #endif /* ?_MAX_PATH */
471:
472: #ifndef PATH_MAX
473: # ifdef MAXPATHLEN /* defined in <sys/param.h> some systems */
474: # define PATH_MAX MAXPATHLEN
475: # else
476: # if FILENAME_MAX > 255 /* used like PATH_MAX on some systems */
477: # define PATH_MAX FILENAME_MAX
478: # else
479: # define PATH_MAX (FILNAMSIZ - 1)
480: # endif
481: # endif /* ?MAXPATHLEN */
482: #endif /* !PATH_MAX */
483:
484: #define OUTBUFSIZ INBUFSIZ
485:
486: #define ZSUFX ".zip"
487: #define CENTRAL_HDR_SIG "\113\001\002" /* the infamous "PK" signature */
488: #define LOCAL_HDR_SIG "\113\003\004" /* bytes, sans "P" (so unzip */
489: #define END_CENTRAL_SIG "\113\005\006" /* executable not mistaken for */
490: #define EXTD_LOCAL_SIG "\113\007\010" /* zipfile itself) */
491:
492: #define SKIP 0 /* choice of activities for do_string() */
493: #define DISPLAY 1
494: #define FILENAME 2
495: #define EXTRA_FIELD 3
496:
497: #define DOES_NOT_EXIST -1 /* return values for check_for_newer() */
498: #define EXISTS_AND_OLDER 0
499: #define EXISTS_AND_NEWER 1
500:
501: #define DOS_OS2_FAT_ 0 /* version_made_by codes (central dir) */
502: #define AMIGA_ 1
503: #define VMS_ 2 /* make sure these are not defined on */
504: #define UNIX_ 3 /* the respective systems!! (like, for */
505: #define VM_CMS_ 4 /* instance, "VMS", or "UNIX": CFLAGS = */
506: #define ATARI_ 5 /* -O -DUNIX) */
507: #define OS2_HPFS_ 6
508: #define MAC_ 7
509: #define Z_SYSTEM_ 8
510: #define CPM_ 9
511: /* #define TOPS20_ 10? (TOPS20_ is to be defined in PKZIP 2.0...) */
512: #define NUM_HOSTS 10 /* index of last system + 1 */
513:
514: #define STORED 0 /* compression methods */
515: #define SHRUNK 1
516: #define REDUCED1 2
517: #define REDUCED2 3
518: #define REDUCED3 4
519: #define REDUCED4 5
520: #define IMPLODED 6
521: #define TOKENIZED 7
522: #define DEFLATED 8
523: #define NUM_METHODS 9 /* index of last method + 1 */
524: /* don't forget to update list_files() appropriately if NUM_METHODS changes */
525:
526: #define DF_MDY 0 /* date format 10/26/91 (USA only) */
527: #define DF_DMY 1 /* date format 26/10/91 (most of the world) */
528: #define DF_YMD 2 /* date format 91/10/26 (a few countries) */
529:
530: #define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */
531: #define VMS_VERSION 42 /* if OS-needed-to-extract is VMS: can do */
532:
533: /*---------------------------------------------------------------------------
534: True sizes of the various headers, as defined by PKWare--so it is not
535: likely that these will ever change. But if they do, make sure both these
536: defines AND the typedefs below get updated accordingly.
537: ---------------------------------------------------------------------------*/
538: #define LREC_SIZE 26 /* lengths of local file headers, central */
539: #define CREC_SIZE 42 /* directory headers, and the end-of- */
540: #define ECREC_SIZE 18 /* central-dir record, respectively */
541:
542: #define MAX_BITS 13 /* used in unShrink() */
543: #define HSIZE (1 << MAX_BITS) /* size of global work area */
544:
545: #define LF 10 /* '\n' on ASCII machines. Must be 10 due to EBCDIC */
546: #define CR 13 /* '\r' on ASCII machines. Must be 13 due to EBCDIC */
547: #define CTRLZ 26 /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */
548:
549: #ifdef EBCDIC
550: # define ascii_to_native(c) ebcdic[(c)]
551: # define NATIVE "EBCDIC"
552: #endif
553:
554: #if MPW
555: # define FFLUSH putc('\n',stderr);
556: #else /* !MPW */
557: # define FFLUSH fflush(stderr);
558: #endif /* ?MPW */
559:
560: #ifdef VMS
561: # define ENV_UNZIP "UNZIP_OPTS" /* name of environment variable */
562: # define ENV_ZIPINFO "ZIPINFO_OPTS"
563: #else /* !VMS */
564: # define ENV_UNZIP "UNZIP"
565: # define ENV_ZIPINFO "ZIPINFO"
566: #endif /* ?VMS */
567:
568: #ifdef CRYPT
569: # define PWLEN 80
570: # define DECRYPT(b) (update_keys(t=((b)&0xff)^decrypt_byte()),t)
571: #endif /* CRYPT */
572:
573: #ifdef QQ /* Newtware version */
574: # define QCOND (!quietflg) /* for no file comments with -vq or -vqq */
575: #else /* (original) Bill Davidsen version */
576: # define QCOND (which_hdr) /* no way to kill file comments with -v, -l */
577: #endif
578:
579: #ifndef TRUE
580: # define TRUE 1 /* sort of obvious */
581: #endif
582: #ifndef FALSE
583: # define FALSE 0
584: #endif
585:
586: #ifndef SEEK_SET /* These should all be declared in stdio.h! But */
587: # define SEEK_SET 0 /* since they're not (in many cases), do so here. */
588: # define SEEK_CUR 1
589: # define SEEK_END 2
590: #endif
591:
592: #ifndef S_IRUSR
593: # define S_IRWXU 00700 /* read, write, execute: owner */
594: # define S_IRUSR 00400 /* read permission: owner */
595: # define S_IWUSR 00200 /* write permission: owner */
596: # define S_IXUSR 00100 /* execute permission: owner */
597: # define S_IRWXG 00070 /* read, write, execute: group */
598: # define S_IRGRP 00040 /* read permission: group */
599: # define S_IWGRP 00020 /* write permission: group */
600: # define S_IXGRP 00010 /* execute permission: group */
601: # define S_IRWXO 00007 /* read, write, execute: other */
602: # define S_IROTH 00004 /* read permission: other */
603: # define S_IWOTH 00002 /* write permission: other */
604: # define S_IXOTH 00001 /* execute permission: other */
605: #endif /* !S_IRUSR */
606:
607: #ifdef ZIPINFO /* these are individually checked because SysV doesn't */
608: # ifndef S_IFBLK /* have some of them, Microsoft C others, etc. */
609: # define S_IFBLK 0060000 /* block special */
610: # endif
611: # ifndef S_IFIFO /* in Borland C, not MSC */
612: # define S_IFIFO 0010000 /* fifo */
613: # endif
614: # ifndef S_IFLNK /* in BSD, not SysV */
615: # define S_IFLNK 0120000 /* symbolic link */
616: # endif
617: # ifndef S_IFSOCK /* in BSD, not SysV */
618: # define S_IFSOCK 0140000 /* socket */
619: # endif
620: # ifndef S_ISUID
621: # define S_ISUID 04000 /* set user id on execution */
622: # endif
623: # ifndef S_ISGID
624: # define S_ISGID 02000 /* set group id on execution */
625: # endif
626: # ifndef S_ISVTX
627: # define S_ISVTX 01000 /* directory permissions control */
628: # endif
629: # ifndef S_ENFMT
630: # define S_ENFMT S_ISGID /* record locking enforcement flag */
631: # endif
632: #endif /* ZIPINFO */
633:
634:
635:
636:
637:
638: /**************/
639: /* Typedefs */
640: /**************/
641:
642: #ifndef _BULL_SOURCE /* Bull has it defined somewhere already */
643: typedef unsigned char byte; /* code assumes UNSIGNED bytes */
644: #endif /* !_BULL_SOURCE */
645:
646: typedef char boolean;
647: typedef long longint;
648: typedef unsigned short UWORD;
649: typedef unsigned long ULONG;
650: typedef unsigned char uch;
651: typedef unsigned short ush;
652: typedef unsigned long ulg;
653:
654: typedef struct min_info {
655: unsigned unix_attr;
656: unsigned dos_attr;
657: int hostnum;
658: longint offset;
659: ULONG compr_size; /* compressed size (needed if extended header) */
660: ULONG crc; /* crc (needed if extended header) */
661: unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing */
662: unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */
663: unsigned text : 1; /* file is text or binary */
664: unsigned lcflag : 1; /* convert filename to lowercase */
665: } min_info;
666:
667: typedef struct VMStimbuf {
668: char *revdate; /* (both correspond to Unix modtime/st_mtime) */
669: char *credate;
670: } VMStimbuf;
671:
672: /*---------------------------------------------------------------------------
673: Zipfile layout declarations. If these headers ever change, make sure the
674: xxREC_SIZE defines (above) change with them!
675: ---------------------------------------------------------------------------*/
676:
677: typedef byte local_byte_hdr[ LREC_SIZE ];
678: # define L_VERSION_NEEDED_TO_EXTRACT_0 0
679: # define L_VERSION_NEEDED_TO_EXTRACT_1 1
680: # define L_GENERAL_PURPOSE_BIT_FLAG 2
681: # define L_COMPRESSION_METHOD 4
682: # define L_LAST_MOD_FILE_TIME 6
683: # define L_LAST_MOD_FILE_DATE 8
684: # define L_CRC32 10
685: # define L_COMPRESSED_SIZE 14
686: # define L_UNCOMPRESSED_SIZE 18
687: # define L_FILENAME_LENGTH 22
688: # define L_EXTRA_FIELD_LENGTH 24
689:
690: typedef byte cdir_byte_hdr[ CREC_SIZE ];
691: # define C_VERSION_MADE_BY_0 0
692: # define C_VERSION_MADE_BY_1 1
693: # define C_VERSION_NEEDED_TO_EXTRACT_0 2
694: # define C_VERSION_NEEDED_TO_EXTRACT_1 3
695: # define C_GENERAL_PURPOSE_BIT_FLAG 4
696: # define C_COMPRESSION_METHOD 6
697: # define C_LAST_MOD_FILE_TIME 8
698: # define C_LAST_MOD_FILE_DATE 10
699: # define C_CRC32 12
700: # define C_COMPRESSED_SIZE 16
701: # define C_UNCOMPRESSED_SIZE 20
702: # define C_FILENAME_LENGTH 24
703: # define C_EXTRA_FIELD_LENGTH 26
704: # define C_FILE_COMMENT_LENGTH 28
705: # define C_DISK_NUMBER_START 30
706: # define C_INTERNAL_FILE_ATTRIBUTES 32
707: # define C_EXTERNAL_FILE_ATTRIBUTES 34
708: # define C_RELATIVE_OFFSET_LOCAL_HEADER 38
709:
710: typedef byte ec_byte_rec[ ECREC_SIZE+4 ];
711: /* define SIGNATURE 0 space-holder only */
712: # define NUMBER_THIS_DISK 4
713: # define NUM_DISK_WITH_START_CENTRAL_DIR 6
714: # define NUM_ENTRIES_CENTRL_DIR_THS_DISK 8
715: # define TOTAL_ENTRIES_CENTRAL_DIR 10
716: # define SIZE_CENTRAL_DIRECTORY 12
717: # define OFFSET_START_CENTRAL_DIRECTORY 16
718: # define ZIPFILE_COMMENT_LENGTH 20
719:
720:
721: typedef struct local_file_header { /* LOCAL */
722: byte version_needed_to_extract[2];
723: UWORD general_purpose_bit_flag;
724: UWORD compression_method;
725: UWORD last_mod_file_time;
726: UWORD last_mod_file_date;
727: ULONG crc32;
728: ULONG compressed_size;
729: ULONG uncompressed_size;
730: UWORD filename_length;
731: UWORD extra_field_length;
732: } local_file_hdr;
733:
734: typedef struct central_directory_file_header { /* CENTRAL */
735: byte version_made_by[2];
736: byte version_needed_to_extract[2];
737: UWORD general_purpose_bit_flag;
738: UWORD compression_method;
739: UWORD last_mod_file_time;
740: UWORD last_mod_file_date;
741: ULONG crc32;
742: ULONG compressed_size;
743: ULONG uncompressed_size;
744: UWORD filename_length;
745: UWORD extra_field_length;
746: UWORD file_comment_length;
747: UWORD disk_number_start;
748: UWORD internal_file_attributes;
749: ULONG external_file_attributes;
750: ULONG relative_offset_local_header;
751: } cdir_file_hdr;
752:
753: typedef struct end_central_dir_record { /* END CENTRAL */
754: UWORD number_this_disk;
755: UWORD num_disk_with_start_central_dir;
756: UWORD num_entries_centrl_dir_ths_disk;
757: UWORD total_entries_central_dir;
758: ULONG size_central_directory;
759: ULONG offset_start_central_directory;
760: UWORD zipfile_comment_length;
761: } ecdir_rec;
762:
763:
764:
765:
766:
767: /*************************/
768: /* Function Prototypes */
769: /*************************/
770:
771: #ifndef __
772: # define __ OF
773: #endif
774:
775: /*---------------------------------------------------------------------------
776: Functions in unzip.c and/or zipinfo.c:
777: ---------------------------------------------------------------------------*/
778:
779: int usage __((int error));
780: int process_zipfile __((void));
781: int find_end_central_dir __((void));
782: int process_end_central_dir __((void));
783: int list_files __((void)); /* unzip.c */
784: int process_cdir_file_hdr __((void)); /* unzip.c */
785: int process_local_file_hdr __((void)); /* unzip.c */
786: int process_central_dir __((void));
787: int long_info __((void)); /* zipinfo.c */
788: int short_info __((void)); /* zipinfo.c */
789: char *zipinfo_time __((UWORD *datez, UWORD *timez));
790:
791: /*---------------------------------------------------------------------------
792: Functions in extract.c:
793: ---------------------------------------------------------------------------*/
794:
795: int extract_or_test_files __((void));
796: /* static int store_info __((void)); */
797: /* static int extract_or_test_member __((void)); */
798: int memextract __((byte *, ULONG, byte *, ULONG));
799: int FlushMemory __((void));
800: int ReadMemoryByte __((UWORD *x));
801:
802: /*---------------------------------------------------------------------------
803: Decompression functions:
804: ---------------------------------------------------------------------------*/
805:
806: int explode __((void)); /* explode.c */
807:
808: int inflate __((void)); /* inflate.c */
809:
810: void unReduce __((void)); /* unreduce.c */
811: /* static void LoadFollowers __((void)); * unreduce.c */
812:
813: void unShrink __((void)); /* unshrink.c */
814: /* static void partial_clear __((void)); * unshrink.c */
815:
816: /*---------------------------------------------------------------------------
817: Functions in file_io.c and crypt.c:
818: ---------------------------------------------------------------------------*/
819:
820: int open_input_file __((void)); /* file_io.c */
821: int readbuf __((char *buf, register unsigned len));
822: int create_output_file __((void)); /* file_io.c, vms.c */
823: int FillBitBuffer __((void)); /* file_io.c */
824: int ReadByte __((UWORD *x)); /* file_io.c */
825: int FlushOutput __((void)); /* file_io.c, vms.c */
826: /* static int dos2unix __((unsigned char *, int)); * file_io.c */
827: void set_file_time_and_close __((void)); /* file_io.c */
828: void handler __((int signal)); /* file_io.c */
829: int echo __((int opt)); /* file_io.c */
830: void echoff __((int f)); /* file_io.c */
831: void echon __((void)); /* file_io.c */
832: char *getp __((char *, char *, int)); /* file_io.c */
833:
834: int decrypt_byte __((void)); /* crypt.c */
835: void update_keys __((int)); /* crypt.c */
836: void init_keys __((char *)); /* crypt.c */
837:
838: /*---------------------------------------------------------------------------
839: Macintosh file_io functions:
840: ---------------------------------------------------------------------------*/
841:
842: #ifdef MACOS
843: /* static int IsHFSDisk __((int)); */
844: void macfstest __((int));
845: int macmkdir __((char *, short, long));
846: void ResolveMacVol __((short, short *, long *, StringPtr));
847: short macopen __((char *, short, short, long));
848: short maccreat __((char *, short, long, OSType, OSType));
849: short macread __((short, char *, unsigned));
850: short macwrite __((short, char *, unsigned));
851: short macclose __((short));
852: long maclseek __((short, long, short));
853: #endif
854:
855: /*---------------------------------------------------------------------------
856: OS/2 file_io functions:
857: ---------------------------------------------------------------------------*/
858:
859: void ChangeNameForFAT __((char *name)); /* os2unzip.c */
860: int IsFileNameValid __((char *name)); /* os2unzip.c */
861: int GetCountryInfo __((void)); /* os2unzip.c */
862: long GetFileTime __((char *name)); /* os2unzip.c */
863: void SetPathInfo __((char *path, UWORD moddate, UWORD modtime, int flags));
864: int SetLongNameEA __((char *name, char *longname)); /* os2unzip.c */
865: int IsEA __((void *extra_field)); /* os2unzip.c */
866: ULONG SizeOfEAs __((void *extra_field)); /* os2unzip.c */
867: void SetEAs __((char *path, void *eablock)); /* os2unzip.c */
868: int IsUpperNLS __((int nChr)); /* os2unzip.c */
869: int ToLowerNLS __((int nChr)); /* os2unzip.c */
870:
871: /*---------------------------------------------------------------------------
872: VMS file_io functions:
873: ---------------------------------------------------------------------------*/
874:
875: int check_format __((void)); /* vms.c */
876: int find_vms_attrs __((void)); /* vms.c */
877: int CloseOutputFile __((void)); /* vms.c */
878: /* static byte *extract_block __((struct extra_block *, int *, byte *, int));*/
879: /* static int _flush_blocks __((int final_flag)); * vms.c */
880: /* static int _flush_records __((int final_flag)); * vms.c */
881: /* static int WriteBuffer __((unsigned char *buf, int len)); * vms.c */
882: /* static int WriteRecord __((unsigned char *rec, int len)); * vms.c */
883: /* static void message __((int string, char *status)); * vms.c */
884:
885: int VMSmunch __((char *, int, char *)); /* VMSmunch.c */
886:
887: /*---------------------------------------------------------------------------
888: Functions in match.c, mapname.c, misc.c, etc.:
889: ---------------------------------------------------------------------------*/
890:
891: int match __((char *string, char *pattern)); /* match.c */
892:
893: int mapname __((int create_dirs)); /* mapname.c */
894:
895: void UpdateCRC __((register unsigned char *s, register int len));
896: int do_string __((unsigned int len, int option)); /* misc.c */
897: time_t dos_to_unix_time __((unsigned ddate, unsigned dtime)); /* misc.c */
898: int check_for_newer __((char *filename)); /* misc.c */
899: int dateformat __((void)); /* misc.c */
900: UWORD makeword __((byte *b)); /* misc.c */
901: ULONG makelong __((byte *sig)); /* misc.c */
902: void return_VMS __((int zip_error)); /* misc.c */
903:
904: void envargs __((int *, char ***, char *)); /* envargs.c */
905:
906: #ifdef AMIGA
907: int utime __((char *file, time_t timep[])); /* utime.c */
908: #endif /* AMIGA */
909:
910: #ifdef ZMEM /* these MUST be ifdef'd because of conflicts with the std def */
911: char *memset __((register char *buf, register char init,
912: register unsigned int len)); /* misc.c */
913: char *memcpy __((register char *dst, register char *src,
914: register unsigned int len)); /* misc.c */
915: #endif /* ZMEM */
916:
917:
918:
919:
920:
921: /************/
922: /* Macros */
923: /************/
924:
925: #ifndef MAX
926: # define MAX(a,b) ((a) > (b) ? (a) : (b))
927: #endif
928:
929: #ifndef MIN
930: # define MIN(a,b) ((a) < (b) ? (a) : (b))
931: #endif
932:
933:
934: #define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\
935: inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\
936: if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\
937: else if(bufstart!=cur_zipfile_bufstart)\
938: {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\
939: if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\
940: inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\
941: {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}}
942:
943: /*
944: * Seek to the block boundary of the block which includes abs_offset,
945: * then read block into input buffer and set pointers appropriately.
946: * If block is already in the buffer, just set the pointers. This macro
947: * is used by process_end_central_dir (unzip.c) and do_string (misc.c).
948: * A slightly modified version is embedded within extract_or_test_files
949: * (unzip.c). ReadByte and readbuf (file_io.c) are compatible.
950: *
951: * macro LSEEK(abs_offset)
952: * ULONG abs_offset;
953: * {
954: * longint request = abs_offset + extra_bytes;
955: * longint inbuf_offset = request % INBUFSIZ;
956: * longint bufstart = request - inbuf_offset;
957: *
958: * if (request < 0) {
959: * fprintf(stderr, SeekMsg, ReportMsg);
960: * return(3); /-* 3: severe error in zipfile *-/
961: * } else if (bufstart != cur_zipfile_bufstart) {
962: * cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET);
963: * if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0)
964: * return(51); /-* 51: unexpected EOF *-/
965: * inptr = inbuf + (int)inbuf_offset;
966: * incnt -= (int)inbuf_offset;
967: * } else {
968: * incnt += (inptr-inbuf) - (int)inbuf_offset;
969: * inptr = inbuf + (int)inbuf_offset;
970: * }
971: * }
972: *
973: */
974:
975:
976: #define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\
977: {error_in_archive=error; if(error>1) return error;}
978:
979: /*
980: * Skip a variable-length field, and report any errors. Used in zipinfo.c
981: * and unzip.c in several functions.
982: *
983: * macro SKIP_(length)
984: * UWORD length;
985: * {
986: * if (length && ((error = do_string(length, SKIP)) != 0)) {
987: * error_in_archive = error; /-* might be warning *-/
988: * if (error > 1) /-* fatal *-/
989: * return (error);
990: * }
991: * }
992: *
993: */
994:
995:
996: #define OUTB(intc) {*outptr++=(byte)(intc); if (++outcnt==OUTBUFSIZ)\
997: FlushOutput();}
998:
999: /*
1000: * macro OUTB(intc)
1001: * {
1002: * *outptr++ = (byte)(intc);
1003: * if (++outcnt == OUTBUFSIZ)
1004: * FlushOutput();
1005: * }
1006: *
1007: */
1008:
1009:
1010: #define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\
1011: zdest=(int)((UWORD)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;}
1012:
1013: /*
1014: * macro READBIT(nbits,zdest)
1015: * {
1016: * if (nbits > bits_left)
1017: * FillBitBuffer();
1018: * zdest = (int)((UWORD)bitbuf & mask_bits[nbits]);
1019: * bitbuf >>= nbits;
1020: * bits_left -= nbits;
1021: * }
1022: *
1023: */
1024:
1025:
1026: #define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\
1027: (UWORD)bitbuf & mask_bits[nbits]) : (UWORD)bitbuf & mask_bits[nbits])
1028:
1029:
1030: #define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j<len;\
1031: (buf)[i++]=(buf)[j++]) if ((buf)[j]=='\r') ++j; len=i;}
1032:
1033: /*
1034: * Remove all the ASCII carriage returns from buffer buf (length len),
1035: * shortening as necessary (note that len gets modified in the process,
1036: * so it CANNOT be an expression). This macro is intended to be used
1037: * BEFORE A_TO_N(); hence the check for CR instead of '\r'. NOTE: The
1038: * if-test gets performed one time too many, but it doesn't matter.
1039: *
1040: * macro NUKE_CRs(buf,len)
1041: * {
1042: * register int i, j;
1043: *
1044: * for (i = j = 0; j < len; (buf)[i++] = (buf)[j++])
1045: * if ((buf)[j] == CR)
1046: * ++j;
1047: * len = i;
1048: * }
1049: *
1050: */
1051:
1052:
1053: #define TOLOWER(str1,str2) {char *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
1054: while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1);\
1055: *ps2='\0';}
1056:
1057: /*
1058: * Copy the zero-terminated string in str1 into str2, converting any
1059: * uppercase letters to lowercase as we go. str2 gets zero-terminated
1060: * as well, of course. str1 and str2 may be the same character array.
1061: *
1062: * macro TOLOWER( str1, str2 )
1063: * {
1064: * char *ps1, *ps2;
1065: *
1066: * ps1 = (str1) - 1;
1067: * ps2 = (str2);
1068: * while (*++ps1)
1069: * *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps1);
1070: * *ps2='\0';
1071: * }
1072: *
1073: * NOTES: This macro makes no assumptions about the characteristics of
1074: * the tolower() function or macro (beyond its existence), nor does it
1075: * make assumptions about the structure of the character set (i.e., it
1076: * should work on EBCDIC machines, too). The fact that either or both
1077: * of isupper() and tolower() may be macros has been taken into account;
1078: * watch out for "side effects" (in the C sense) when modifying this
1079: * macro.
1080: */
1081:
1082:
1083: #ifndef ascii_to_native
1084: # define ascii_to_native(c) (c)
1085: # define A_TO_N(str1)
1086: #else
1087: # ifndef NATIVE
1088: # define NATIVE "native chars"
1089: # endif
1090: # define A_TO_N(str1) {register unsigned char *ps1;\
1091: for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);}
1092: #endif
1093:
1094: /*
1095: * Translate the zero-terminated string in str1 from ASCII to the native
1096: * character set. The translation is performed in-place and uses the
1097: * ascii_to_native macro to translate each character.
1098: *
1099: * macro A_TO_N( str1 )
1100: * {
1101: * register unsigned char *ps1;
1102: *
1103: * for (ps1 = str1; *ps1; ++ps1)
1104: * *ps1 = ascii_to_native(*ps1);
1105: * }
1106: *
1107: * NOTE: Using the ascii_to_native macro means that is it the only part of
1108: * unzip which knows which translation table (if any) is actually in use
1109: * to produce the native character set. This makes adding new character
1110: * set translation tables easy, insofar as all that is needed is an
1111: * appropriate ascii_to_native macro definition and the translation
1112: * table itself. Currently, the only non-ASCII native character set
1113: * implemented is EBCDIC, but this may not always be so.
1114: */
1115:
1116:
1117:
1118:
1119:
1120: /*************/
1121: /* Globals */
1122: /*************/
1123:
1124: extern int aflag;
1125: /* extern int bflag; reserved */
1126: extern int cflag;
1127: extern int fflag;
1128: extern int jflag;
1129: extern int overwrite_none;
1130: extern int overwrite_all;
1131: extern int force_flag;
1132: extern int quietflg;
1133: #ifdef DOS_OS2
1134: extern int sflag;
1135: #endif
1136: extern int tflag;
1137: extern int uflag;
1138: extern int V_flag;
1139: #ifdef VMS
1140: extern int secinf;
1141: #endif
1142: #ifdef MACOS
1143: extern int hfsflag;
1144: #endif
1145: extern int process_all_files;
1146: extern longint csize;
1147: extern longint ucsize;
1148: extern char *fnames[];
1149: extern char **fnv;
1150: extern char sig[];
1151: extern char answerbuf[];
1152: extern min_info *pInfo;
1153: extern char *key;
1154: extern ULONG keys[];
1155:
1156: #ifdef MACOS
1157: union work {
1158: struct {
1159: short *Prefix_of; /* (8193 * sizeof(short)) */
1160: byte *Suffix_of;
1161: byte *Stack;
1162: } shrink;
1163: byte *Slide;
1164: };
1165: #else
1166: union work {
1167: struct {
1168: short Prefix_of[HSIZE + 2]; /* (8194 * sizeof(short)) */
1169: byte Suffix_of[HSIZE + 2]; /* also s-f length_nodes (smaller) */
1170: byte Stack[HSIZE + 2]; /* also s-f distance_nodes (smaller) */
1171: } shrink;
1172: byte Slide[WSIZE];
1173: };
1174: #endif
1175: extern union work area;
1176:
1177: # define prefix_of area.shrink.Prefix_of
1178: # define suffix_of area.shrink.Suffix_of
1179: # define stack area.shrink.Stack
1180: # define slide area.Slide
1181:
1182: extern ULONG crc32val;
1183: extern UWORD mask_bits[];
1184:
1185: extern byte *inbuf;
1186: extern byte *inptr;
1187: extern int incnt;
1188: extern ULONG bitbuf;
1189: extern int bits_left;
1190: extern boolean zipeof;
1191: extern int zipfd;
1192: #ifdef MSWIN
1193: extern char *zipfn;
1194: #else
1195: extern char zipfn[];
1196: #endif
1197: extern longint extra_bytes;
1198: extern longint cur_zipfile_bufstart;
1199: extern byte *extra_field;
1200: extern char local_hdr_sig[];
1201: extern char central_hdr_sig[];
1202: extern char end_central_sig[];
1203: extern local_file_hdr lrec;
1204: extern cdir_file_hdr crec;
1205: extern ecdir_rec ecrec;
1206: extern struct stat statbuf;
1207:
1208: extern byte *outbuf;
1209: extern byte *outptr;
1210: #ifdef MSWIN
1211: extern byte __far *outout;
1212: extern char *filename;
1213: #else
1214: extern byte *outout;
1215: extern char filename[];
1216: #endif
1217: extern longint outpos;
1218: extern int outcnt;
1219: extern int outfd;
1220: extern int mem_mode;
1221: extern int disk_full;
1222:
1223: extern char *EndSigMsg;
1224: extern char *CentSigMsg;
1225: extern char *SeekMsg;
1226: extern char *ReportMsg;
1227:
1228: #ifdef DECLARE_ERRNO
1229: extern int errno;
1230: #endif
1231:
1232: #ifdef EBCDIC
1233: extern byte ebcdic[];
1234: #endif
1235:
1236: #ifdef MACOS
1237: extern short gnVRefNum;
1238: extern long glDirID;
1239: extern OSType gostCreator;
1240: extern OSType gostType;
1241: extern boolean fMacZipped;
1242: extern boolean macflag;
1243: extern short giCursor;
1244: extern CursHandle rghCursor[];
1245: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.