20a4d74ed7936d6333a8b496ec7cda4aa92a0218
[oweals/opkg-lede.git] / libbb / unzip.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * gunzip implementation for busybox
4  *
5  * Based on GNU gzip v1.2.4 Copyright (C) 1992-1993 Jean-loup Gailly.
6  *
7  * Originally adjusted for busybox by Sven Rudolph <sr1@inf.tu-dresden.de>
8  * based on gzip sources
9  *
10  * Adjusted further by Erik Andersen <andersee@debian.org> to support
11  * files as well as stdin/stdout, and to generally behave itself wrt
12  * command line handling.
13  *
14  * General cleanup to better adhere to the style guide and make use of
15  * standard busybox functions by Glenn McGrath <bug1@optushome.com.au>
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation; either version 2 of the License, or
20  * (at your option) any later version.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25  * General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  *
31  *
32  * gzip (GNU zip) -- compress files with zip algorithm and 'compress' interface
33  * Copyright (C) 1992-1993 Jean-loup Gailly
34  * The unzip code was written and put in the public domain by Mark Adler.
35  * Portions of the lzw code are derived from the public domain 'compress'
36  * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies,
37  * Ken Turkowski, Dave Mack and Peter Jannesen.
38  *
39  * See the license_msg below and the file COPYING for the software license.
40  * See the file algorithm.doc for the compression algorithms and file formats.
41  */
42
43 #include <sys/types.h>
44 #include <sys/wait.h>
45 #include <signal.h>
46 #include <stdlib.h>
47 #include <string.h>
48 #include "libbb.h"
49
50 static FILE *in_file, *out_file;
51
52 /* these are freed by gz_close */
53 static unsigned char *window;
54 static unsigned long *crc_table = NULL;
55
56 static unsigned long crc; /* shift register contents */
57
58 /* Return codes from gzip */
59 static const int ERROR = 1;
60
61 /*
62  * window size--must be a power of two, and
63  *  at least 32K for zip's deflate method 
64  */
65 static const int WSIZE = 0x8000;
66
67 /* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
68 static const int BMAX = 16;             /* maximum bit length of any code (16 for explode) */
69 static const int N_MAX = 288;           /* maximum number of codes in any set */
70
71 static long bytes_out;          /* number of output bytes */
72 static unsigned long outcnt;    /* bytes in output buffer */
73
74 static unsigned hufts;          /* track memory usage */
75 static unsigned long bb;                        /* bit buffer */
76 static unsigned bk;             /* bits in bit buffer */
77
78 typedef struct huft_s {
79         unsigned char e;                /* number of extra bits or operation */
80         unsigned char b;                /* number of bits in this code or subcode */
81         union {
82                 unsigned short n;               /* literal, length base, or distance base */
83                 struct huft_s *t;       /* pointer to next level of table */
84         } v;
85 } huft_t;
86
87 static const unsigned short mask_bits[] = {
88         0x0000,
89         0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
90         0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
91 };
92
93 //static int error_number = 0;
94 /* ========================================================================
95  * Signal and error handler.
96  */
97  
98 static void abort_gzip()
99 {
100         error_msg("gzip aborted\n");
101         exit(ERROR);
102 }
103
104 static void make_crc_table()
105 {
106         unsigned long table_entry;      /* crc shift register */
107         unsigned long poly = 0;      /* polynomial exclusive-or pattern */
108         int i;                /* counter for all possible eight bit values */
109         int k;                /* byte being shifted into crc apparatus */
110
111         /* terms of polynomial defining this crc (except x^32): */
112         static int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
113
114         /* initial shift register value */
115         crc = 0xffffffffL;      
116         crc_table = (unsigned long *) malloc(256 * sizeof(unsigned long));
117
118         /* Make exclusive-or pattern from polynomial (0xedb88320) */
119         for (i = 0; i < sizeof(p)/sizeof(int); i++)
120                 poly |= 1L << (31 - p[i]);
121
122         /* Compute and print table of CRC's, five per line */
123         for (i = 0; i < 256; i++) {
124                 table_entry = i;
125            /* The idea to initialize the register with the byte instead of
126              * zero was stolen from Haruhiko Okumura's ar002
127              */
128                 for (k = 8; k; k--) {
129                         table_entry = table_entry & 1 ? (table_entry >> 1) ^ poly : table_entry >> 1;
130                 }
131                 crc_table[i]=table_entry;
132         }
133 }
134
135 /* ===========================================================================
136  * Write the output window window[0..outcnt-1] and update crc and bytes_out.
137  * (Used for the decompressed data only.)
138  */
139 static void flush_window(void)
140 {
141         int n;
142
143         if (outcnt == 0)
144                 return;
145
146         for (n = 0; n < outcnt; n++) {
147                 crc = crc_table[((int) crc ^ (window[n])) & 0xff] ^ (crc >> 8);
148         }
149
150         if (fwrite(window, 1, outcnt, out_file) != outcnt) {
151                 error_msg_and_die("Couldnt write");
152         }
153         bytes_out += (unsigned long) outcnt;
154         outcnt = 0;
155 }
156
157 /*
158  * Free the malloc'ed tables built by huft_build(), which makes a linked
159  * list of the tables it made, with the links in a dummy first entry of
160  * each table. 
161  * t: table to free
162  */
163 static int huft_free(huft_t *t)
164 {
165         huft_t *p, *q;
166
167         /* Go through linked list, freeing from the malloced (t[-1]) address. */
168         p = t;
169         while (p != (huft_t *) NULL) {
170                 q = (--p)->v.t;
171                 free((char *) p);
172                 p = q;
173         }
174         return 0;
175 }
176
177 /* Given a list of code lengths and a maximum table size, make a set of
178  * tables to decode that set of codes.  Return zero on success, one if
179  * the given code set is incomplete (the tables are still built in this
180  * case), two if the input is invalid (all zero length codes or an
181  * oversubscribed set of lengths), and three if not enough memory.
182  *
183  * b:   code lengths in bits (all assumed <= BMAX)
184  * n:   number of codes (assumed <= N_MAX)
185  * s:   number of simple-valued codes (0..s-1)
186  * d:   list of base values for non-simple codes
187  * e:   list of extra bits for non-simple codes
188  * t:   result: starting table
189  * m:   maximum lookup bits, returns actual
190  */
191 static int huft_build(unsigned int *b, const unsigned int n, const unsigned int s, 
192         const unsigned short *d, const unsigned short *e, huft_t **t, int *m)
193 {
194         unsigned a;             /* counter for codes of length k */
195         unsigned c[BMAX + 1];   /* bit length count table */
196         unsigned f;             /* i repeats in table every f entries */
197         int g;                  /* maximum code length */
198         int h;                  /* table level */
199         unsigned i;     /* counter, current code */
200         unsigned j;     /* counter */
201         int k;          /* number of bits in current code */
202         int l;                  /* bits per table (returned in m) */
203         unsigned *p;            /* pointer into c[], b[], or v[] */
204         huft_t *q;      /* points to current table */
205         huft_t r;               /* table entry for structure assignment */
206         huft_t *u[BMAX];        /* table stack */
207         unsigned v[N_MAX];      /* values in order of bit length */
208         int w;          /* bits before this table == (l * h) */
209         unsigned x[BMAX + 1];   /* bit offsets, then code stack */
210         unsigned *xp;           /* pointer into x */
211         int y;                  /* number of dummy codes added */
212         unsigned z;             /* number of entries in current table */
213
214         /* Generate counts for each bit length */
215         memset ((void *)(c), 0, sizeof(c));
216         p = b;
217         i = n;
218         do {
219                 c[*p]++;        /* assume all entries <= BMAX */
220                 p++;            /* Can't combine with above line (Solaris bug) */
221         } while (--i);
222         if (c[0] == n) {        /* null input--all zero length codes */
223                 *t = (huft_t *) NULL;
224                 *m = 0;
225                 return 0;
226         }
227
228         /* Find minimum and maximum length, bound *m by those */
229         l = *m;
230         for (j = 1; j <= BMAX; j++)
231                 if (c[j])
232                         break;
233         k = j;                          /* minimum code length */
234         if ((unsigned) l < j)
235                 l = j;
236         for (i = BMAX; i; i--)
237                 if (c[i])
238                         break;
239         g = i;                          /* maximum code length */
240         if ((unsigned) l > i)
241                 l = i;
242         *m = l;
243
244         /* Adjust last length count to fill out codes, if needed */
245         for (y = 1 << j; j < i; j++, y <<= 1)
246                 if ((y -= c[j]) < 0)
247                         return 2;       /* bad input: more codes than bits */
248         if ((y -= c[i]) < 0)
249                 return 2;
250         c[i] += y;
251
252         /* Generate starting offsets into the value table for each length */
253         x[1] = j = 0;
254         p = c + 1;
255         xp = x + 2;
256         while (--i) {                   /* note that i == g from above */
257                 *xp++ = (j += *p++);
258         }
259
260         /* Make a table of values in order of bit lengths */
261         p = b;
262         i = 0;
263         do {
264                 if ((j = *p++) != 0)
265                         v[x[j]++] = i;
266         } while (++i < n);
267
268         /* Generate the Huffman codes and for each, make the table entries */
269         x[0] = i = 0;                   /* first Huffman code is zero */
270         p = v;                          /* grab values in bit order */
271         h = -1;                         /* no tables yet--level -1 */
272         w = -l;                         /* bits decoded == (l * h) */
273         u[0] = (huft_t *) NULL; /* just to keep compilers happy */
274         q = (huft_t *) NULL;    /* ditto */
275         z = 0;                          /* ditto */
276
277         /* go through the bit lengths (k already is bits in shortest code) */
278         for (; k <= g; k++) {
279                 a = c[k];
280                 while (a--) {
281                         /* here i is the Huffman code of length k bits for value *p */
282                         /* make tables up to required level */
283                         while (k > w + l) {
284                                 h++;
285                                 w += l;         /* previous table always l bits */
286
287                                 /* compute minimum size table less than or equal to l bits */
288                                 z = (z = g - w) > (unsigned) l ? l : z; /* upper limit on table size */
289                                 if ((f = 1 << (j = k - w)) > a + 1) {   /* try a k-w bit table *//* too few codes for k-w bit table */
290                                         f -= a + 1;     /* deduct codes from patterns left */
291                                         xp = c + k;
292                                         while (++j < z) {       /* try smaller tables up to z bits */
293                                                 if ((f <<= 1) <= *++xp)
294                                                         break;  /* enough codes to use up j bits */
295                                                 f -= *xp;       /* else deduct codes from patterns */
296                                         }
297                                 }
298                                 z = 1 << j;             /* table entries for j-bit table */
299
300                                 /* allocate and link in new table */
301                                 if ((q = (huft_t *) xmalloc((z + 1) * sizeof(huft_t))) == NULL) {
302                                         if (h) {
303                                                 huft_free(u[0]);
304                                         }
305                                         return 3;       /* not enough memory */
306                                 }
307                                 hufts += z + 1; /* track memory usage */
308                                 *t = q + 1;             /* link to list for huft_free() */
309                                 *(t = &(q->v.t)) = NULL;
310                                 u[h] = ++q;             /* table starts after link */
311
312                                 /* connect to last table, if there is one */
313                                 if (h) {
314                                         x[h] = i;       /* save pattern for backing up */
315                                         r.b = (unsigned char) l;        /* bits to dump before this table */
316                                         r.e = (unsigned char) (16 + j); /* bits in this table */
317                                         r.v.t = q;      /* pointer to this table */
318                                         j = i >> (w - l);       /* (get around Turbo C bug) */
319                                         u[h - 1][j] = r;        /* connect to last table */
320                                 }
321                         }
322
323                         /* set up table entry in r */
324                         r.b = (unsigned char) (k - w);
325                         if (p >= v + n)
326                                 r.e = 99;               /* out of values--invalid code */
327                         else if (*p < s) {
328                                 r.e = (unsigned char) (*p < 256 ? 16 : 15);     /* 256 is end-of-block code */
329                                 r.v.n = (unsigned short) (*p);  /* simple code is just the value */
330                                 p++;                    /* one compiler does not like *p++ */
331                         } else {
332                                 r.e = (unsigned char) e[*p - s];        /* non-simple--look up in lists */
333                                 r.v.n = d[*p++ - s];
334                         }
335
336                         /* fill code-like entries with r */
337                         f = 1 << (k - w);
338                         for (j = i >> w; j < z; j += f)
339                                 q[j] = r;
340
341                         /* backwards increment the k-bit code i */
342                         for (j = 1 << (k - 1); i & j; j >>= 1)
343                                 i ^= j;
344                         i ^= j;
345
346                         /* backup over finished tables */
347                         while ((i & ((1 << w) - 1)) != x[h]) {
348                                 h--;                    /* don't need to update q */
349                                 w -= l;
350                         }
351                 }
352         }
353         /* Return true (1) if we were given an incomplete table */
354         return y != 0 && g != 1;
355 }
356
357 /*
358  * inflate (decompress) the codes in a deflated (compressed) block.
359  * Return an error code or zero if it all goes ok.
360  *
361  * tl, td: literal/length and distance decoder tables
362  * bl, bd: number of bits decoded by tl[] and td[]
363  */
364 static int inflate_codes(huft_t *tl, huft_t *td, int bl, int bd)
365 {
366         unsigned long e;                /* table entry flag/number of extra bits */
367         unsigned long n, d;                             /* length and index for copy */
368         unsigned long w;                                /* current window position */
369         huft_t *t;                              /* pointer to table entry */
370         unsigned ml, md;                        /* masks for bl and bd bits */
371         unsigned long b;                                /* bit buffer */
372         unsigned k;             /* number of bits in bit buffer */
373
374         /* make local copies of globals */
375         b = bb;                                 /* initialize bit buffer */
376         k = bk;
377         w = outcnt;                             /* initialize window position */
378
379         /* inflate the coded data */
380         ml = mask_bits[bl];                     /* precompute masks for speed */
381         md = mask_bits[bd];
382         for (;;) {                              /* do until end of block */
383                 while (k < (unsigned) bl) {
384                         b |= ((unsigned long)fgetc(in_file)) << k;
385                         k += 8;
386                 }
387                 if ((e = (t = tl + ((unsigned) b & ml))->e) > 16)
388                 do {
389                         if (e == 99) {
390                                 return 1;
391                         }
392                         b >>= t->b;
393                         k -= t->b;
394                         e -= 16;
395                         while (k < e) {
396                                 b |= ((unsigned long)fgetc(in_file)) << k;
397                                 k += 8;
398                         }
399                 } while ((e = (t = t->v.t + ((unsigned) b & mask_bits[e]))->e) > 16);
400                 b >>= t->b;
401                 k -= t->b;
402                 if (e == 16) {          /* then it's a literal */
403                         window[w++] = (unsigned char) t->v.n;
404                         if (w == WSIZE) {
405                                 outcnt=(w),
406                                 flush_window();
407                                 w = 0;
408                         }
409                 } else {                                /* it's an EOB or a length */
410
411                         /* exit if end of block */
412                         if (e == 15) {
413                                 break;
414                         }
415
416                         /* get length of block to copy */
417                         while (k < e) {
418                                 b |= ((unsigned long)fgetc(in_file)) << k;
419                                 k += 8;
420                         }
421                         n = t->v.n + ((unsigned) b & mask_bits[e]);
422                         b >>= e;
423                         k -= e;
424
425                         /* decode distance of block to copy */
426                         while (k < (unsigned) bd) {
427                                 b |= ((unsigned long)fgetc(in_file)) << k;
428                                 k += 8;
429                         }
430
431                         if ((e = (t = td + ((unsigned) b & md))->e) > 16)
432                                 do {
433                                         if (e == 99)
434                                                 return 1;
435                                         b >>= t->b;
436                                         k -= t->b;
437                                         e -= 16;
438                                         while (k < e) {
439                                                 b |= ((unsigned long)fgetc(in_file)) << k;
440                                                 k += 8;
441                                         }
442                                 } while ((e = (t = t->v.t + ((unsigned) b & mask_bits[e]))->e) > 16);
443                         b >>= t->b;
444                         k -= t->b;
445                         while (k < e) {
446                                 b |= ((unsigned long)fgetc(in_file)) << k;
447                                 k += 8;
448                         }
449                         d = w - t->v.n - ((unsigned) b & mask_bits[e]);
450                         b >>= e;
451                         k -= e;
452
453                         /* do the copy */
454                         do {
455                                 n -= (e = (e = WSIZE - ((d &= WSIZE - 1) > w ? d : w)) > n ? n : e);
456 #if !defined(NOMEMCPY) && !defined(DEBUG)
457                                 if (w - d >= e) {       /* (this test assumes unsigned comparison) */
458                                         memcpy(window + w, window + d, e);
459                                         w += e;
460                                         d += e;
461                                 } else                  /* do it slow to avoid memcpy() overlap */
462 #endif                                                  /* !NOMEMCPY */
463                                         do {
464                                                 window[w++] = window[d++];
465                                         } while (--e);
466                                 if (w == WSIZE) {
467                                         outcnt=(w),
468                                         flush_window();
469                                         w = 0;
470                                 }
471                         } while (n);
472                 }
473         }
474
475         /* restore the globals from the locals */
476         outcnt = w;                     /* restore global window pointer */
477         bb = b;                         /* restore global bit buffer */
478         bk = k;
479
480         /* done */
481         return 0;
482 }
483
484 /*
485  * decompress an inflated block
486  * e: last block flag
487  *
488  * GLOBAL VARIABLES: bb, kk,
489  */
490 static int inflate_block(int *e)
491 {
492         unsigned t;                     /* block type */
493         unsigned long b;                        /* bit buffer */
494         unsigned k;             /* number of bits in bit buffer */
495         static unsigned short cplens[] = {              /* Copy lengths for literal codes 257..285 */
496                 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
497                 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
498         };
499         /* note: see note #13 above about the 258 in this list. */
500         static unsigned short cplext[] = {              /* Extra bits for literal codes 257..285 */
501                 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
502                 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99
503         };                              /* 99==invalid */
504         static unsigned short cpdist[] = {              /* Copy offsets for distance codes 0..29 */
505                 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
506                 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
507                 8193, 12289, 16385, 24577
508         };
509         static unsigned short cpdext[] = {              /* Extra bits for distance codes */
510                 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
511                 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
512                 12, 12, 13, 13
513         };
514
515         /* make local bit buffer */
516         b = bb;
517         k = bk;
518
519         /* read in last block bit */
520         while (k < 1) {
521                 b |= ((unsigned long)fgetc(in_file)) << k;
522                 k += 8;
523         }
524         *e = (int) b & 1;
525         b >>= 1;
526         k -= 1;
527
528         /* read in block type */
529         while (k < 2) {
530                 b |= ((unsigned long)fgetc(in_file)) << k;
531                 k += 8;
532         }
533         t = (unsigned) b & 3;
534         b >>= 2;
535         k -= 2;
536
537         /* restore the global bit buffer */
538         bb = b;
539         bk = k;
540
541         /* inflate that block type */
542         switch (t) {
543         case 0: /* Inflate stored */
544                 {
545                         unsigned long n;                        /* number of bytes in block */
546                         unsigned long w;                        /* current window position */
547                         unsigned long b_stored;                 /* bit buffer */
548                         unsigned long k_stored;         /* number of bits in bit buffer */
549
550                         /* make local copies of globals */
551                         b_stored = bb;                          /* initialize bit buffer */
552                         k_stored = bk;
553                         w = outcnt;                     /* initialize window position */
554
555                         /* go to byte boundary */
556                         n = k_stored & 7;
557                         b_stored >>= n;
558                         k_stored -= n;
559
560                         /* get the length and its complement */
561                         while (k_stored < 16) {
562                                 b_stored |= ((unsigned long)fgetc(in_file)) << k_stored;
563                                 k_stored += 8;
564                         }
565                         n = ((unsigned) b_stored & 0xffff);
566                         b_stored >>= 16;
567                         k_stored -= 16;
568                         while (k_stored < 16) {
569                                 b_stored |= ((unsigned long)fgetc(in_file)) << k_stored;
570                                 k_stored += 8;
571                         }
572                         if (n != (unsigned) ((~b_stored) & 0xffff)) {
573                                 return 1;               /* error in compressed data */
574                         }
575                         b_stored >>= 16;
576                         k_stored -= 16;
577
578                         /* read and output the compressed data */
579                         while (n--) {
580                                 while (k_stored < 8) {
581                                         b_stored |= ((unsigned long)fgetc(in_file)) << k_stored;
582                                         k_stored += 8;
583                                 }
584                                 window[w++] = (unsigned char) b_stored;
585                                 if (w == (unsigned long)WSIZE) {
586                                         outcnt=(w),
587                                         flush_window();
588                                         w = 0;
589                                 }
590                                 b_stored >>= 8;
591                                 k_stored -= 8;
592                         }
593
594                         /* restore the globals from the locals */
595                         outcnt = w;                     /* restore global window pointer */
596                         bb = b_stored;                          /* restore global bit buffer */
597                         bk = k_stored;
598                         return 0;
599                 }
600         case 1: /* Inflate fixed 
601                          * decompress an inflated type 1 (fixed Huffman codes) block.  We should
602                          * either replace this with a custom decoder, or at least precompute the
603                          * Huffman tables.
604                          */
605                 {
606                         int i;                                  /* temporary variable */
607                         huft_t *tl;                             /* literal/length code table */
608                         huft_t *td;                             /* distance code table */
609                         int bl;                                 /* lookup bits for tl */
610                         int bd;                                 /* lookup bits for td */
611                         unsigned int l[288];    /* length list for huft_build */
612
613                         /* set up literal table */
614                         for (i = 0; i < 144; i++) {
615                                 l[i] = 8;
616                         }
617                         for (; i < 256; i++) {
618                                 l[i] = 9;
619                         }
620                         for (; i < 280; i++) {
621                                 l[i] = 7;
622                         }
623                         for (; i < 288; i++) {  /* make a complete, but wrong code set */
624                                 l[i] = 8;
625                         }
626                         bl = 7;
627                         if ((i = huft_build(l, 288, 257, cplens, cplext, &tl, &bl)) != 0) {
628                                 return i;
629                         }
630
631                         /* set up distance table */
632                         for (i = 0; i < 30; i++) {      /* make an incomplete code set */
633                                 l[i] = 5;
634                         }
635                         bd = 5;
636                         if ((i = huft_build(l, 30, 0, cpdist, cpdext, &td, &bd)) > 1) {
637                                 huft_free(tl);
638                                 return i;
639                         }
640
641                         /* decompress until an end-of-block code */
642                         if (inflate_codes(tl, td, bl, bd))
643                                 return 1;
644
645                         /* free the decoding tables, return */
646                         huft_free(tl);
647                         huft_free(td);
648                         return 0;
649                 }
650         case 2: /* Inflate dynamic */
651                 {
652                         /* Tables for deflate from PKZIP's appnote.txt. */
653                         static unsigned border[] = {    /* Order of the bit length code lengths */
654                                 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
655                         };
656                         int dbits = 6;                                  /* bits in base distance lookup table */
657                         int lbits = 9;                                  /* bits in base literal/length lookup table */
658
659                         int i;                                          /* temporary variables */
660                         unsigned j;
661                         unsigned l;                                     /* last length */
662                         unsigned m;                                     /* mask for bit lengths table */
663                         unsigned n;                                     /* number of lengths to get */
664                         huft_t *tl;                     /* literal/length code table */
665                         huft_t *td;                     /* distance code table */
666                         int bl;                                         /* lookup bits for tl */
667                         int bd;                                         /* lookup bits for td */
668                         unsigned nb;                            /* number of bit length codes */
669                         unsigned nl;                            /* number of literal/length codes */
670                         unsigned nd;                            /* number of distance codes */
671
672                         unsigned ll[286 + 30];          /* literal/length and distance code lengths */
673                         unsigned long b_dynamic;        /* bit buffer */
674                         unsigned k_dynamic;             /* number of bits in bit buffer */
675
676                         /* make local bit buffer */
677                         b_dynamic = bb;
678                         k_dynamic = bk;
679
680                         /* read in table lengths */
681                         while (k_dynamic < 5) {
682                                 b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
683                                 k_dynamic += 8;
684                         }
685                         nl = 257 + ((unsigned) b_dynamic & 0x1f);       /* number of literal/length codes */
686                         b_dynamic >>= 5;
687                         k_dynamic -= 5;
688                         while (k_dynamic < 5) {
689                                 b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
690                                 k_dynamic += 8;
691                         }
692                         nd = 1 + ((unsigned) b_dynamic & 0x1f); /* number of distance codes */
693                         b_dynamic >>= 5;
694                         k_dynamic -= 5;
695                         while (k_dynamic < 4) {
696                                 b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
697                                 k_dynamic += 8;
698                         }
699                         nb = 4 + ((unsigned) b_dynamic & 0xf);  /* number of bit length codes */
700                         b_dynamic >>= 4;
701                         k_dynamic -= 4;
702                         if (nl > 286 || nd > 30) {
703                                 return 1;       /* bad lengths */
704                         }
705
706                         /* read in bit-length-code lengths */
707                         for (j = 0; j < nb; j++) {
708                                 while (k_dynamic < 3) {
709                                         b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
710                                         k_dynamic += 8;
711                                 }
712                                 ll[border[j]] = (unsigned) b_dynamic & 7;
713                                 b_dynamic >>= 3;
714                                 k_dynamic -= 3;
715                         }
716                         for (; j < 19; j++) {
717                                 ll[border[j]] = 0;
718                         }
719
720                         /* build decoding table for trees--single level, 7 bit lookup */
721                         bl = 7;
722                         if ((i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) {
723                                 if (i == 1) {
724                                         huft_free(tl);
725                                 }
726                                 return i;                       /* incomplete code set */
727                         }
728
729                         /* read in literal and distance code lengths */
730                         n = nl + nd;
731                         m = mask_bits[bl];
732                         i = l = 0;
733                         while ((unsigned) i < n) {
734                                 while (k_dynamic < (unsigned) bl) {
735                                         b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
736                                         k_dynamic += 8;
737                                 }
738                                 j = (td = tl + ((unsigned) b_dynamic & m))->b;
739                                 b_dynamic >>= j;
740                                 k_dynamic -= j;
741                                 j = td->v.n;
742                                 if (j < 16) {                   /* length of code in bits (0..15) */
743                                         ll[i++] = l = j;        /* save last length in l */
744                                 }
745                                 else if (j == 16) {             /* repeat last length 3 to 6 times */
746                                         while (k_dynamic < 2) {
747                                                 b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
748                                                 k_dynamic += 8;
749                                         }
750                                         j = 3 + ((unsigned) b_dynamic & 3);
751                                         b_dynamic >>= 2;
752                                         k_dynamic -= 2;
753                                         if ((unsigned) i + j > n) {
754                                                 return 1;
755                                         }
756                                         while (j--) {
757                                                 ll[i++] = l;
758                                         }
759                                 } else if (j == 17) {   /* 3 to 10 zero length codes */
760                                         while (k_dynamic < 3) {
761                                                 b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
762                                                 k_dynamic += 8;
763                                         }
764                                         j = 3 + ((unsigned) b_dynamic & 7);
765                                         b_dynamic >>= 3;
766                                         k_dynamic -= 3;
767                                         if ((unsigned) i + j > n) {
768                                                 return 1;
769                                         }
770                                         while (j--) {
771                                                 ll[i++] = 0;
772                                         }
773                                         l = 0;
774                                 } else {                /* j == 18: 11 to 138 zero length codes */
775                                         while (k_dynamic < 7) {
776                                                 b_dynamic |= ((unsigned long)fgetc(in_file)) << k_dynamic;
777                                                 k_dynamic += 8;
778                                         }
779                                         j = 11 + ((unsigned) b_dynamic & 0x7f);
780                                         b_dynamic >>= 7;
781                                         k_dynamic -= 7;
782                                         if ((unsigned) i + j > n) {
783                                                 return 1;
784                                         }
785                                         while (j--) {
786                                                 ll[i++] = 0;
787                                         }
788                                         l = 0;
789                                 }
790                         }
791
792                         /* free decoding table for trees */
793                         huft_free(tl);
794
795                         /* restore the global bit buffer */
796                         bb = b_dynamic;
797                         bk = k_dynamic;
798
799                         /* build the decoding tables for literal/length and distance codes */
800                         bl = lbits;
801                         if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) {
802                                 if (i == 1) {
803                                         error_msg("Incomplete literal tree");
804                                         huft_free(tl);
805                                 }
806                                 return i;                       /* incomplete code set */
807                         }
808                         bd = dbits;
809                         if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) {
810                                 if (i == 1) {
811                                         error_msg("incomplete distance tree");
812                                         huft_free(td);
813                                 }
814                                 huft_free(tl);
815                                 return i;                       /* incomplete code set */
816                         }
817
818                         /* decompress until an end-of-block code */
819                         if (inflate_codes(tl, td, bl, bd))
820                                 return 1;
821
822                         /* free the decoding tables, return */
823                         huft_free(tl);
824                         huft_free(td);
825                         return 0;
826                 }
827         default:
828                 /* bad block type */
829                 return 2;
830         }
831 }
832
833 /*
834  * decompress an inflated entry
835  *
836  * GLOBAL VARIABLES: outcnt, bk, bb, hufts, inptr
837  */
838 static int inflate()
839 {
840         int e;                          /* last block flag */
841         int r;                          /* result code */
842         unsigned h = 0;         /* maximum struct huft's malloc'ed */
843
844         /* initialize window, bit buffer */
845         outcnt = 0;
846         bk = 0;
847         bb = 0;
848
849         /* decompress until the last block */
850         do {
851                 hufts = 0;
852                 if ((r = inflate_block(&e)) != 0) {
853                         return r;
854                 }
855                 if (hufts > h) {
856                         h = hufts;
857                 }
858         } while (!e);
859
860         /* Undo too much lookahead.  The next read will be byte aligned so we
861          * can discard unused bits in the last meaningful byte.  */
862         while (bk >= 8) {
863                 bk -= 8;
864                 ungetc((bb << bk), in_file);
865         }
866
867         /* flush out window */
868         flush_window();
869
870         /* return success */
871         return 0;
872 }
873
874 /* ===========================================================================
875  * Unzip in to out.  This routine works on both gzip and pkzip files.
876  *
877  * IN assertions: the buffer inbuf contains already the beginning of
878  *   the compressed data, from offsets inptr to insize-1 included.
879  *   The magic header has already been checked. The output buffer is cleared.
880  * in, out: input and output file descriptors
881  */
882 extern int unzip(FILE *l_in_file, FILE *l_out_file)
883 {
884         const int extra_field = 0x04;   /* bit 2 set: extra field present */
885         const int orig_name = 0x08;     /* bit 3 set: original file name present */
886         const int comment = 0x10;       /* bit 4 set: file comment present */
887         unsigned char buf[8];   /* extended local header */
888         unsigned char flags;    /* compression flags */
889         char magic[2];                  /* magic header */
890         int method;
891         typedef void (*sig_type) (int);
892         int exit_code=0;        /* program exit code */
893         int i;
894
895         in_file = l_in_file;
896         out_file = l_out_file;
897
898         if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
899                 (void) signal(SIGINT, (sig_type) abort_gzip);
900         }
901 #ifdef SIGTERM
902 //      if (signal(SIGTERM, SIG_IGN) != SIG_IGN) {
903 //              (void) signal(SIGTERM, (sig_type) abort_gzip);
904 //      }
905 #endif
906 #ifdef SIGHUP
907         if (signal(SIGHUP, SIG_IGN) != SIG_IGN) {
908                 (void) signal(SIGHUP, (sig_type) abort_gzip);
909         }
910 #endif
911
912         /* Allocate all global buffers (for DYN_ALLOC option) */
913         window = xmalloc((size_t)(((2L*WSIZE)+1L)*sizeof(unsigned char)));
914         outcnt = 0;
915         bytes_out = 0L;
916
917         magic[0] = fgetc(in_file);
918         magic[1] = fgetc(in_file);
919
920         /* Magic header for gzip files, 1F 8B = \037\213 */
921         if (memcmp(magic, "\037\213", 2) != 0) {
922                 error_msg("Invalid gzip magic");
923                 return EXIT_FAILURE;
924         }
925
926         method = (int) fgetc(in_file);
927         if (method != 8) {
928                 error_msg("unknown method %d -- get newer version of gzip", method);
929                 exit_code = 1;
930                 return -1;
931         }
932
933         flags = (unsigned char) fgetc(in_file);
934
935         /* Ignore time stamp(4), extra flags(1), OS type(1) */
936         for (i = 0; i < 6; i++)
937                 fgetc(in_file);
938
939         if ((flags & extra_field) != 0) {
940                 size_t extra;
941                 extra = fgetc(in_file);
942                 extra += fgetc(in_file) << 8;
943
944                 for (i = 0; i < extra; i++)
945                         fgetc(in_file);
946         }
947
948         /* Discard original name if any */
949         if ((flags & orig_name) != 0) {
950                 while (fgetc(in_file) != 0);    /* null */
951         }
952
953         /* Discard file comment if any */
954         if ((flags & comment) != 0) {
955                 while (fgetc(in_file) != 0);    /* null */
956         }
957
958         if (method < 0) {
959                 printf("it failed\n");
960                 return(exit_code);              /* error message already emitted */
961         }
962
963         make_crc_table();
964
965         /* Decompress */
966         if (method == 8) {
967
968                 int res = inflate();
969
970                 if (res == 3) {
971                         error_msg(memory_exhausted);
972                         exit_code = 1;
973                 } else if (res != 0) {
974                         error_msg("invalid compressed data--format violated");
975                         exit_code = 1;
976                 }
977
978         } else {
979                 error_msg("internal error, invalid method");
980                 exit_code = 1;
981         }
982
983         /* Get the crc and original length
984          * crc32  (see algorithm.doc)
985          * uncompressed input size modulo 2^32
986          */
987         fread(buf, 1, 8, in_file);
988
989         /* Validate decompression - crc */
990         if (!exit_code && (unsigned int)((buf[0] | (buf[1] << 8)) |((buf[2] | (buf[3] << 8)) << 16)) != (crc ^ 0xffffffffL)) {
991                 error_msg("invalid compressed data--crc error");
992                 exit_code = 1;
993         }
994         /* Validate decompression - size */
995         if (!exit_code && ((buf[4] | (buf[5] << 8)) |((buf[6] | (buf[7] << 8)) << 16)) != (unsigned long) bytes_out) {
996                 error_msg("invalid compressed data--length error");
997                 exit_code = 1;
998         }
999
1000         free(window);
1001         free(crc_table);
1002
1003         window = NULL;
1004         crc_table = NULL;
1005
1006         return exit_code;
1007 }