LMMS
Loading...
Searching...
No Matches
globals.h
Go to the documentation of this file.
1/*
2 Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
3
4 See the accompanying file LICENSE, version 2009-Jan-02 or later
5 (the contents of which are also included in unzip.h) for terms of use.
6 If, for some reason, all these files are missing, the Info-ZIP license
7 also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
8*/
9/*---------------------------------------------------------------------------
10
11 globals.h
12
13 There is usually no need to include this file since unzip.h includes it.
14
15 This header file is used by all of the UnZip source files. It contains
16 a struct definition that is used to "house" all of the global variables.
17 This is done to allow for multithreaded environments (OS/2, NT, Win95,
18 Unix) to call UnZip through an API without a semaphore. REENTRANT should
19 be defined for all platforms that require this.
20
21 GLOBAL CONSTRUCTOR AND DESTRUCTOR (API WRITERS READ THIS!!!)
22 ------------------------------------------------------------
23
24 No, it's not C++, but it's as close as we can get with K&R.
25
26 The main() of each process that uses these globals must include the
27 CONSTRUCTGLOBALS; statement. This will malloc enough memory for the
28 structure and initialize any variables that require it. This must
29 also be done by any API function that jumps into the middle of the
30 code.
31
32 The DESTROYGLOBALS(); statement should be inserted before EVERY "EXIT(n)".
33 Naturally, it also needs to be put before any API returns as well.
34 In fact, it's much more important in API functions since the process
35 will NOT end, and therefore the memory WON'T automatically be freed
36 by the operating system.
37
38 USING VARIABLES FROM THE STRUCTURE
39 ----------------------------------
40
41 All global variables must now be prefixed with `G.' which is either a
42 global struct (in which case it should be the only global variable) or
43 a macro for the value of a local pointer variable that is passed from
44 function to function. Yes, this is a pain. But it's the only way to
45 allow full reentrancy.
46
47 ADDING VARIABLES TO THE STRUCTURE
48 ---------------------------------
49
50 If you make the inclusion of any variables conditional, be sure to only
51 check macros that are GUARANTEED to be included in every module.
52 For instance, newzip and pwdarg are needed only if CRYPT is TRUE,
53 but this is defined after unzip.h has been read. If you are not careful,
54 some modules will expect your variable to be part of this struct while
55 others won't. This will cause BIG problems. (Inexplicable crashes at
56 strange times, car fires, etc.) When in doubt, always include it!
57
58 Note also that UnZipSFX needs a few variables that UnZip doesn't. However,
59 it also includes some object files from UnZip. If we were to conditionally
60 include the extra variables that UnZipSFX needs, the object files from
61 UnZip would not mesh with the UnZipSFX object files. Result: we just
62 include the UnZipSFX variables every time. (It's only an extra 4 bytes
63 so who cares!)
64
65 ADDING FUNCTIONS
66 ----------------
67
68 To support this new global struct, all functions must now conditionally
69 pass the globals pointer (pG) to each other. This is supported by 5 macros:
70 __GPRO, __GPRO__, __G, __G__ and __GDEF. A function that needs no other
71 parameters would look like this:
72
73 int extract_or_test_files(__G)
74 __GDEF
75 {
76 ... stuff ...
77 }
78
79 A function with other parameters would look like:
80
81 int memextract(__G__ tgt, tgtsize, src, srcsize)
82 __GDEF
83 uch *tgt, *src;
84 ulg tgtsize, srcsize;
85 {
86 ... stuff ...
87 }
88
89 In the Function Prototypes section of unzpriv.h, you should use __GPRO and
90 __GPRO__ instead:
91
92 int uz_opts OF((__GPRO__ int *pargc, char ***pargv));
93 int process_zipfiles OF((__GPRO));
94
95 Note that there is NO comma after __G__ or __GPRO__ and no semi-colon after
96 __GDEF. I wish there was another way but I don't think there is.
97
98
99 TESTING THE CODE
100 -----------------
101
102 Whether your platform requires reentrancy or not, you should always try
103 building with REENTRANT defined if any functions have been added. It is
104 pretty easy to forget a __G__ or a __GDEF and this mistake will only show
105 up if REENTRANT is defined. All platforms should run with REENTRANT
106 defined. Platforms that can't take advantage of it will just be paying
107 a performance penalty needlessly.
108
109 SIGNAL MADNESS
110 --------------
111
112 This whole pointer passing scheme falls apart when it comes to SIGNALs.
113 I handle this situation 2 ways right now. If you define USETHREADID,
114 UnZip will include a 64-entry table. Each entry can hold a global
115 pointer and thread ID for one thread. This should allow up to 64
116 threads to access UnZip simultaneously. Calling DESTROYGLOBALS()
117 will free the global struct and zero the table entry. If somebody
118 forgets to call DESTROYGLOBALS(), this table will eventually fill up
119 and UnZip will exit with an error message. A good way to test your
120 code to make sure you didn't forget a DESTROYGLOBALS() is to change
121 THREADID_ENTRIES to 3 or 4 in globals.c, making the table real small.
122 Then make a small test program that calls your API a dozen times.
123
124 Those platforms that don't have threads still need to be able to compile
125 with REENTRANT defined to test and see if new code is correctly written
126 to work either way. For these platforms, I simply keep a global pointer
127 called GG that points to the Globals structure. Good enough for testing.
128
129 I believe that NT has thread level storage. This could probably be used
130 to store a global pointer for the sake of the signal handler more cleanly
131 than my table approach.
132
133 ---------------------------------------------------------------------------*/
134
135#ifndef __globals_h
136#define __globals_h
137
138#ifdef USE_ZLIB
139# include "zlib.h"
140# ifdef zlib_version /* This name is used internally in unzip */
141# undef zlib_version /* and must not be defined as a macro. */
142# endif
143#endif
144
145#ifdef USE_BZIP2
146# include "bzlib.h"
147#endif
148
149
150/*************/
151/* Globals */
152/*************/
153
154typedef struct Globals {
155#ifdef DLL
156 zvoid *callerglobs; /* pointer to structure of pass-through global vars */
157#endif
158
159 /* command options of general use */
160 UzpOpts UzO; /* command options of general use */
161
162#ifndef FUNZIP
163 /* command options specific to the high level command line interface */
164#ifdef MORE
165 int M_flag; /* -M: built-in "more" function */
166#endif
167
168 /* internal flags and general globals */
169#ifdef MORE
170 int height; /* check for SIGWINCH, etc., eventually... */
171 int lines; /* count of lines displayed on current screen */
172# if (defined(SCREENWIDTH) && defined(SCREENLWRAP))
173 int width;
174 int chars; /* count of screen characters in current line */
175# endif
176#endif /* MORE */
177#if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME))
178 int tz_is_valid; /* indicates that timezone info can be used */
179#endif
180 int noargs; /* did true command line have *any* arguments? */
181 unsigned filespecs; /* number of real file specifications to be matched */
182 unsigned xfilespecs; /* number of excluded filespecs to be matched */
184 int overwrite_mode; /* 0 - query, 1 - always, 2 - never */
185 int create_dirs; /* used by main(), mapname(), checkdir() */
187 int newzip; /* reset in extract.c; used in crypt.c */
190 zoff_t csize; /* used by decompr. (NEXTBYTE): must be signed */
191 zoff_t used_csize; /* used by extract_or_test_member(), explode() */
192
193#ifdef DLL
194 int fValidate; /* true if only validating an archive */
195 int filenotfound;
196 int redirect_data; /* redirect data to memory buffer */
197 int redirect_text; /* redirect text output to buffer */
198# ifndef NO_SLIDE_REDIR
199 int redirect_slide; /* redirect decompression area to mem buffer */
200# if (defined(USE_DEFLATE64) && defined(INT_16BIT))
201 ulg _wsize; /* size of sliding window exceeds "unsigned" range */
202# else
203 unsigned _wsize; /* sliding window size can be hold in unsigned */
204# endif
205# endif
206 ulg redirect_size; /* size of redirected output buffer */
207 uch *redirect_buffer; /* pointer to head of allocated buffer */
208 uch *redirect_pointer; /* pointer past end of written data */
209# ifndef NO_SLIDE_REDIR
210 uch *redirect_sldptr; /* head of decompression slide buffer */
211# endif
212# ifdef OS2DLL
213 cbList(processExternally); /* call-back list */
214# endif
215#endif /* DLL */
216
217 char **pfnames;
218 char **pxnames;
219 char sig[4];
220 char answerbuf[10];
223#endif /* !FUNZIP */
224 union work area; /* see unzpriv.h for definition of work */
225
226#if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
228#else
230#endif
231 ulg crc32val; /* CRC shift reg. (was static in funzip) */
232
233#ifdef FUNZIP
234 FILE *in; /* file descriptor of compressed stream */
235#endif
236 uch *inbuf; /* input buffer (any size is OK) */
237 uch *inptr; /* pointer into input buffer */
238 int incnt;
239
240#ifndef FUNZIP
242 int bits_left; /* unreduce and unshrink only */
244 char *argv0; /* used for NT and EXE_EXTENSION */
246 char *zipfn; /* GRR: WINDLL: must nuke any malloc'd zipfn... */
247#ifdef USE_STRM_INPUT
248 FILE *zipfd; /* zipfile file descriptor */
249#else
250 int zipfd; /* zipfile file handle */
251#endif
253 zoff_t cur_zipfile_bufstart; /* extract_or_test, readbuf, ReadByte */
254 zoff_t extra_bytes; /* used in unzip.c, misc.c */
255 uch *extra_field; /* Unix, VMS, Mac, OS/2, Acorn, ... */
257
258 local_file_hdr lrec; /* used in unzip.c, extract.c */
259 cdir_file_hdr crec; /* used in unzip.c, extract.c, misc.c */
260 ecdir_rec ecrec; /* used in unzip.c, extract.c */
261 z_stat statbuf; /* used by main, mapname, check_for_newer */
262
264 uch *outbufptr; /* extract.c static */
265 ulg outsize; /* extract.c static */
266 int reported_backslash; /* extract.c static */
269
270 int didCRlast; /* fileio static */
271 ulg numlines; /* fileio static: number of lines printed */
272 int sol; /* fileio static: at start of line */
273 int no_ecrec; /* process static */
274#ifdef SYMLINKS
275 int symlnk;
276 slinkentry *slink_head; /* pointer to head of symlinks list */
277 slinkentry *slink_last; /* pointer to last entry in symlinks list */
278#endif
279#ifdef NOVELL_BUG_FAILSAFE
280 int dne; /* true if stat() says file doesn't exist */
281#endif
282
283 FILE *outfile;
286
287#ifndef VMS /* if SMALL_MEM, outbuf2 is initialized in */
288 uch *outbuf2; /* process_zipfiles() (never changes); */
289#endif /* else malloc'd ONLY if unshrink and -a */
290#endif /* !FUNZIP */
292 ulg outcnt; /* number of chars stored in outbuf */
293#ifndef FUNZIP
294 char filename[FILNAMSIZ]; /* also used by NT for temporary SFX path */
295#ifdef UNICODE_SUPPORT
296 char *filename_full; /* the full path so Unicode checks work */
297 extent fnfull_bufsize; /* size of allocated filename buffer */
298 int unicode_escape_all;
299 int unicode_mismatch;
300#ifdef UTF8_MAYBE_NATIVE
301 int native_is_utf8; /* bool, TRUE => native charset == UTF-8 */
302#endif
303
304 int unipath_version; /* version of Unicode field */
305 ulg unipath_checksum; /* Unicode field checksum */
306 char *unipath_filename; /* UTF-8 path */
307#endif /* UNICODE_SUPPORT */
308
309#ifdef CMS_MVS
310 char *tempfn; /* temp file used; erase on close */
311#endif
312
313 char *key; /* crypt static: decryption password or NULL */
314 int nopwd; /* crypt static */
315#endif /* !FUNZIP */
316 z_uint4 keys[3]; /* crypt static: keys defining pseudo-random sequence */
317
318#if (!defined(DOS_FLX_H68_NLM_OS2_W32) && !defined(AMIGA) && !defined(RISCOS))
319#if (!defined(MACOS) && !defined(ATARI) && !defined(VMS))
320 int echofd; /* ttyio static: file descriptor whose echo is off */
321#endif /* !(MACOS || ATARI || VMS) */
322#endif /* !(DOS_FLX_H68_NLM_OS2_W32 || AMIGA || RISCOS) */
323
324 unsigned hufts; /* track memory usage */
325
326#ifdef USE_ZLIB
327 int inflInit; /* inflate static: zlib inflate() initialized */
328 z_stream dstrm; /* inflate global: decompression stream */
329#else
330 struct huft *fixed_tl; /* inflate static */
331 struct huft *fixed_td; /* inflate static */
332 unsigned fixed_bl, fixed_bd; /* inflate static */
333#ifdef USE_DEFLATE64
334 struct huft *fixed_tl64; /* inflate static */
335 struct huft *fixed_td64; /* inflate static */
336 unsigned fixed_bl64, fixed_bd64; /* inflate static */
337 struct huft *fixed_tl32; /* inflate static */
338 struct huft *fixed_td32; /* inflate static */
339 unsigned fixed_bl32, fixed_bd32; /* inflate static */
340 ZCONST ush *cplens; /* inflate static */
341 ZCONST uch *cplext; /* inflate static */
342 ZCONST uch *cpdext; /* inflate static */
343#endif
344 unsigned wp; /* inflate static: current position in slide */
345 ulg bb; /* inflate static: bit buffer */
346 unsigned bk; /* inflate static: bits count in bit buffer */
347#endif /* ?USE_ZLIB */
348
349#ifndef FUNZIP
350 /* cylindric buffer space for formatting zoff_t values (fileio static) */
353
354#ifdef SMALL_MEM
355 char rgchBigBuffer[512];
356 char rgchSmallBuffer[96];
357 char rgchSmallBuffer2[160]; /* boosted to 160 for local3[] in unzip.c */
358#endif
359
360 MsgFn *message;
361 InputFn *input;
362 PauseFn *mpause;
363 PasswdFn *decr_passwd;
364 StatCBFn *statreportcb;
365#ifdef WINDLL
366 LPUSERFUNCTIONS lpUserFunctions;
367#endif
368
369 int incnt_leftover; /* so improved NEXTBYTE does not waste input */
371
372#ifdef VMS_TEXT_CONV
373 unsigned VMS_line_length; /* so native VMS variable-length text files */
374 int VMS_line_state; /* are readable on other platforms */
375 int VMS_line_pad;
376#endif
377
378#if (defined(SFX) && defined(CHEAP_SFX_AUTORUN))
379 char autorun_command[FILNAMSIZ];
380#endif
381#endif /* !FUNZIP */
382
383#ifdef SYSTEM_SPECIFIC_GLOBALS
385#endif
386
387} Uz_Globs; /* end of struct Globals */
388
389
390/***************************************************************************/
391
392
393#define CRC_32_TAB G.crc_32_tab
394
395
396Uz_Globs *globalsCtor OF((void));
397
398/* pseudo constant sigs; they are initialized at runtime so unzip executable
399 * won't look like a zipfile
400 */
401extern char local_hdr_sig[4];
402extern char central_hdr_sig[4];
403extern char end_central_sig[4];
404extern char end_central32_sig[4];
405extern char end_central64_sig[4];
406extern char end_centloc64_sig[4];
407/* extern char extd_local_sig[4]; NOT USED YET */
408
409#ifdef REENTRANT
410# define G (*(Uz_Globs *)pG)
411# define __G pG
412# define __G__ pG,
413# define __GPRO Uz_Globs *pG
414# define __GPRO__ Uz_Globs *pG,
415# define __GDEF Uz_Globs *pG;
416# ifdef USETHREADID
417 extern int lastScan;
418 void deregisterGlobalPointer OF((__GPRO));
419 Uz_Globs *getGlobalPointer OF((void));
420# define GETGLOBALS() Uz_Globs *pG = getGlobalPointer()
421# define DESTROYGLOBALS() do {free_G_buffers(pG); \
422 deregisterGlobalPointer(pG);} while (0)
423# else
424 extern Uz_Globs *GG;
425# define GETGLOBALS() Uz_Globs *pG = GG
426# define DESTROYGLOBALS() do {free_G_buffers(pG); free(pG);} while (0)
427# endif /* ?USETHREADID */
428# define CONSTRUCTGLOBALS() Uz_Globs *pG = globalsCtor()
429#else /* !REENTRANT */
430 extern Uz_Globs G;
431# define __G
432# define __G__
433# define __GPRO void
434# define __GPRO__
435# define __GDEF
436# define GETGLOBALS()
437# define CONSTRUCTGLOBALS() globalsCtor()
438# define DESTROYGLOBALS()
439#endif /* ?REENTRANT */
440
441#define uO G.UzO
442
443#endif /* __globals_h */
char end_central32_sig[4]
struct Globals Uz_Globs
#define ZCONST
Definition crc32.h:25
#define OF(a)
Definition crc32.h:22
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
float in
Definition lilv_test.c:1460
Definition globals.h:154
uch * inptr_leftover
Definition globals.h:370
char ** pxnames
Definition globals.h:218
uch * outbuf
Definition globals.h:284
zoff_t extra_bytes
Definition globals.h:254
zoff_t cur_zipfile_bufstart
Definition globals.h:253
z_stat statbuf
Definition globals.h:261
zoff_t ziplen
Definition globals.h:252
z_uint4 keys[3]
Definition globals.h:316
ulg bitbuf
Definition globals.h:241
int extract_flag
Definition globals.h:186
char * key
Definition globals.h:313
int echofd
Definition globals.h:320
zoff_t real_ecrec_offset
Definition globals.h:188
ecdir_rec ecrec
Definition globals.h:260
unsigned fixed_bl
Definition globals.h:332
ulg numlines
Definition globals.h:271
uch * outbuf2
Definition globals.h:288
int no_ecrec
Definition globals.h:273
char * wildzipfn
Definition globals.h:245
unsigned bk
Definition globals.h:346
int mem_mode
Definition globals.h:263
int didCRlast
Definition globals.h:270
union work area
Definition globals.h:224
char ** pfnames
Definition globals.h:217
PauseFn * mpause
Definition globals.h:362
int bits_left
Definition globals.h:242
uch * hold
Definition globals.h:256
min_info info[DIR_BLKSIZ]
Definition globals.h:221
uch * inbuf
Definition globals.h:236
uch * outbufptr
Definition globals.h:264
char * zipfn
Definition globals.h:246
char answerbuf[10]
Definition globals.h:220
struct huft * fixed_td
Definition globals.h:331
int fzofft_index
Definition globals.h:352
cdir_file_hdr crec
Definition globals.h:259
InputFn * input
Definition globals.h:361
zoff_t used_csize
Definition globals.h:191
char * argv0
Definition globals.h:244
int zipeof
Definition globals.h:243
local_file_hdr lrec
Definition globals.h:258
int incnt
Definition globals.h:238
uch * outptr
Definition globals.h:291
UzpOpts UzO
Definition globals.h:160
unsigned filespecs
Definition globals.h:181
int reported_backslash
Definition globals.h:266
int disk_full
Definition globals.h:267
unsigned fixed_bd
Definition globals.h:332
struct huft * fixed_tl
Definition globals.h:330
char sig[4]
Definition globals.h:219
char fzofft_buf[FZOFFT_NUM][FZOFFT_LEN]
Definition globals.h:351
int noargs
Definition globals.h:180
ulg outsize
Definition globals.h:265
FILE * outfile
Definition globals.h:283
int incnt_leftover
Definition globals.h:369
unsigned hufts
Definition globals.h:324
char filename[FILNAMSIZ]
Definition globals.h:294
int sol
Definition globals.h:272
unsigned wp
Definition globals.h:344
zoff_t csize
Definition globals.h:190
StatCBFn * statreportcb
Definition globals.h:364
int create_dirs
Definition globals.h:185
ZCONST ulg near * crc_32_tab
Definition globals.h:227
MsgFn * message
Definition globals.h:360
unsigned xfilespecs
Definition globals.h:182
PasswdFn * decr_passwd
Definition globals.h:363
uch * realbuf
Definition globals.h:285
uch * inptr
Definition globals.h:237
int nopwd
Definition globals.h:314
int process_all_files
Definition globals.h:183
ulg bb
Definition globals.h:345
int newfile
Definition globals.h:268
uch * extra_field
Definition globals.h:255
int newzip
Definition globals.h:187
min_info * pInfo
Definition globals.h:222
int zipfd
Definition globals.h:250
ulg outcnt
Definition globals.h:292
int overwrite_mode
Definition globals.h:184
zoff_t expect_ecrec_offset
Definition globals.h:189
ulg crc32val
Definition globals.h:231
Definition unzpriv.h:2198
Definition unzpriv.h:2011
Definition unzpriv.h:2057
#define __GPRO
Definition crypt.h:78
Uz_Globs * globalsCtor()
Definition globals.c:159
char local_hdr_sig[4]
Definition globals.c:31
Uz_Globs G
Definition globals.c:42
char end_central64_sig[4]
Definition globals.c:33
char end_central_sig[4]
Definition globals.c:32
char central_hdr_sig[4]
Definition globals.c:30
char end_centloc64_sig[4]
Definition globals.c:34
#define SYSTEM_SPECIFIC_GLOBALS
Definition unxcfg.h:216
off_t zoff_t
Definition unxcfg.h:59
struct stat z_stat
Definition unxcfg.h:62
unsigned short ush
Definition unzip.h:402
struct _UzpOpts UzpOpts
#define cbList(func)
Definition unzip.h:627
unsigned long ulg
Definition unzip.h:403
char zvoid
Definition unzip.h:399
unsigned char uch
Definition unzip.h:401
#define FZOFFT_NUM
Definition unzpriv.h:1541
struct local_file_header local_file_hdr
#define FZOFFT_LEN
Definition unzpriv.h:1542
#define near
Definition unzpriv.h:901
#define FILNAMSIZ
Definition unzpriv.h:1198
#define DIR_BLKSIZ
Definition unzpriv.h:881
ulg z_uint4
Definition unzpriv.h:1933
struct end_central_dir_record ecdir_rec
struct central_directory_file_header cdir_file_hdr
unsigned int extent
Definition unzpriv.h:669
#define Far
Definition unzpriv.h:1030
struct z_stream_s z_stream