xref: /openbsd-src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm (revision d13be5d47e4149db2549a9828e244d59dbc43f15)
1package IO::Uncompress::Unzip;
2
3require 5.004 ;
4
5# for RFC1952
6
7use strict ;
8use warnings;
9use bytes;
10
11use IO::Uncompress::RawInflate  2.024 ;
12use IO::Compress::Base::Common  2.024 qw(:Status createSelfTiedObject);
13use IO::Uncompress::Adapter::Inflate  2.024 ;
14use IO::Uncompress::Adapter::Identity 2.024 ;
15use IO::Compress::Zlib::Extra 2.024 ;
16use IO::Compress::Zip::Constants 2.024 ;
17
18use Compress::Raw::Zlib  2.024 qw(crc32) ;
19
20BEGIN
21{
22    eval { require IO::Uncompress::Adapter::Bunzip2 ;
23           import  IO::Uncompress::Adapter::Bunzip2 } ;
24#   eval { require IO::Uncompress::Adapter::UnLzma ;
25#           import  IO::Uncompress::Adapter::UnLzma } ;
26}
27
28
29require Exporter ;
30
31our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
32
33$VERSION = '2.024';
34$UnzipError = '';
35
36@ISA    = qw(Exporter IO::Uncompress::RawInflate);
37@EXPORT_OK = qw( $UnzipError unzip );
38%EXPORT_TAGS = %IO::Uncompress::RawInflate::EXPORT_TAGS ;
39push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
40Exporter::export_ok_tags('all');
41
42%headerLookup = (
43        ZIP_CENTRAL_HDR_SIG,            \&skipCentralDirectory,
44        ZIP_END_CENTRAL_HDR_SIG,        \&skipEndCentralDirectory,
45        ZIP64_END_CENTRAL_REC_HDR_SIG,  \&skipCentralDirectory64Rec,
46        ZIP64_END_CENTRAL_LOC_HDR_SIG,  \&skipCentralDirectory64Loc,
47        ZIP64_ARCHIVE_EXTRA_SIG,        \&skipArchiveExtra,
48        ZIP64_DIGITAL_SIGNATURE_SIG,    \&skipDigitalSignature,
49        );
50
51sub new
52{
53    my $class = shift ;
54    my $obj = createSelfTiedObject($class, \$UnzipError);
55    $obj->_create(undef, 0, @_);
56}
57
58sub unzip
59{
60    my $obj = createSelfTiedObject(undef, \$UnzipError);
61    return $obj->_inf(@_) ;
62}
63
64sub getExtraParams
65{
66    use IO::Compress::Base::Common  2.024 qw(:Parse);
67
68
69    return (
70#            # Zip header fields
71            'Name'    => [1, 1, Parse_any,       undef],
72
73#            'Stream' => [1, 1, Parse_boolean,   1],
74            # This means reading the central directory to get
75            # 1. the local header offsets
76            # 2. The compressed data length
77        );
78}
79
80sub ckParams
81{
82    my $self = shift ;
83    my $got = shift ;
84
85    # unzip always needs crc32
86    $got->value('CRC32' => 1);
87
88    *$self->{UnzipData}{Name} = $got->value('Name');
89
90    return 1;
91}
92
93sub mkUncomp
94{
95    my $self = shift ;
96    my $got = shift ;
97
98     my $magic = $self->ckMagic()
99        or return 0;
100
101    *$self->{Info} = $self->readHeader($magic)
102        or return undef ;
103
104    return 1;
105
106}
107
108sub ckMagic
109{
110    my $self = shift;
111
112    my $magic ;
113    $self->smartReadExact(\$magic, 4);
114
115    *$self->{HeaderPending} = $magic ;
116
117    return $self->HeaderError("Minimum header size is " .
118                              4 . " bytes")
119        if length $magic != 4 ;
120
121    return $self->HeaderError("Bad Magic")
122        if ! _isZipMagic($magic) ;
123
124    *$self->{Type} = 'zip';
125
126    return $magic ;
127}
128
129
130sub fastForward
131{
132    my $self = shift;
133    my $offset = shift;
134
135    # TODO - if Stream isn't enabled & reading from file, use seek
136
137    my $buffer = '';
138    my $c = 1024 * 16;
139
140    while ($offset > 0)
141    {
142        $c = length $offset
143            if length $offset < $c ;
144
145        $offset -= $c;
146
147        $self->smartReadExact(\$buffer, $c)
148            or return 0;
149    }
150
151    return 1;
152}
153
154
155sub readHeader
156{
157    my $self = shift;
158    my $magic = shift ;
159
160    my $name =  *$self->{UnzipData}{Name} ;
161    my $hdr = $self->_readZipHeader($magic) ;
162
163    while (defined $hdr)
164    {
165        if (! defined $name || $hdr->{Name} eq $name)
166        {
167            return $hdr ;
168        }
169
170        # skip the data
171        # TODO - when Stream is off, use seek
172        my $buffer;
173        if (*$self->{ZipData}{Streaming}) {
174
175            while (1) {
176
177                my $b;
178                my $status = $self->smartRead(\$b, 1024 * 16);
179                return undef
180                    if $status <= 0 ;
181
182                my $temp_buf;
183                my $out;
184                $status = *$self->{Uncomp}->uncompr(\$b, \$temp_buf, 0, $out);
185
186                return $self->saveErrorString(undef, *$self->{Uncomp}{Error},
187                                                     *$self->{Uncomp}{ErrorNo})
188                    if $self->saveStatus($status) == STATUS_ERROR;
189
190                if ($status == STATUS_ENDSTREAM) {
191                    *$self->{Uncomp}->reset();
192                    $self->pushBack($b)  ;
193                    last;
194                }
195            }
196
197            # skip the trailer
198            $self->smartReadExact(\$buffer, $hdr->{TrailerLength})
199                or return $self->saveErrorString(undef, "Truncated file");
200        }
201        else {
202            my $c = $hdr->{CompressedLength}->get64bit();
203            $self->fastForward($c)
204                or return $self->saveErrorString(undef, "Truncated file");
205            $buffer = '';
206        }
207
208        $self->chkTrailer($buffer) == STATUS_OK
209            or return $self->saveErrorString(undef, "Truncated file");
210
211        $hdr = $self->_readFullZipHeader();
212
213        return $self->saveErrorString(undef, "Cannot find '$name'")
214            if $self->smartEof();
215    }
216
217    return undef;
218}
219
220sub chkTrailer
221{
222    my $self = shift;
223    my $trailer = shift;
224
225    my ($sig, $CRC32, $cSize, $uSize) ;
226    my ($cSizeHi, $uSizeHi) = (0, 0);
227    if (*$self->{ZipData}{Streaming}) {
228        $sig   = unpack ("V", substr($trailer, 0, 4));
229        $CRC32 = unpack ("V", substr($trailer, 4, 4));
230
231        if (*$self->{ZipData}{Zip64} ) {
232            $cSize = U64::newUnpack_V64 substr($trailer,  8, 8);
233            $uSize = U64::newUnpack_V64 substr($trailer, 16, 8);
234        }
235        else {
236            $cSize = U64::newUnpack_V32 substr($trailer,  8, 4);
237            $uSize = U64::newUnpack_V32 substr($trailer, 12, 4);
238        }
239
240        return $self->TrailerError("Data Descriptor signature, got $sig")
241            if $sig != ZIP_DATA_HDR_SIG;
242    }
243    else {
244        ($CRC32, $cSize, $uSize) =
245            (*$self->{ZipData}{Crc32},
246             *$self->{ZipData}{CompressedLen},
247             *$self->{ZipData}{UnCompressedLen});
248    }
249
250    *$self->{Info}{CRC32} = *$self->{ZipData}{CRC32} ;
251    *$self->{Info}{CompressedLength} = $cSize->get64bit();
252    *$self->{Info}{UncompressedLength} = $uSize->get64bit();
253
254    if (*$self->{Strict}) {
255        return $self->TrailerError("CRC mismatch")
256            if $CRC32  != *$self->{ZipData}{CRC32} ;
257
258        return $self->TrailerError("CSIZE mismatch.")
259            if ! $cSize->equal(*$self->{CompSize});
260
261        return $self->TrailerError("USIZE mismatch.")
262            if ! $uSize->equal(*$self->{UnCompSize});
263    }
264
265    my $reachedEnd = STATUS_ERROR ;
266    # check for central directory or end of central directory
267    while (1)
268    {
269        my $magic ;
270        my $got = $self->smartRead(\$magic, 4);
271
272        return $self->saveErrorString(STATUS_ERROR, "Truncated file")
273            if $got != 4 && *$self->{Strict};
274
275        if ($got == 0) {
276            return STATUS_EOF ;
277        }
278        elsif ($got < 0) {
279            return STATUS_ERROR ;
280        }
281        elsif ($got < 4) {
282            $self->pushBack($magic)  ;
283            return STATUS_OK ;
284        }
285
286        my $sig = unpack("V", $magic) ;
287
288        my $hdr;
289        if ($hdr = $headerLookup{$sig})
290        {
291            if (&$hdr($self, $magic) != STATUS_OK ) {
292                if (*$self->{Strict}) {
293                    return STATUS_ERROR ;
294                }
295                else {
296                    $self->clearError();
297                    return STATUS_OK ;
298                }
299            }
300
301            if ($sig == ZIP_END_CENTRAL_HDR_SIG)
302            {
303                return STATUS_OK ;
304                last;
305            }
306        }
307        elsif ($sig == ZIP_LOCAL_HDR_SIG)
308        {
309            $self->pushBack($magic)  ;
310            return STATUS_OK ;
311        }
312        else
313        {
314            # put the data back
315            $self->pushBack($magic)  ;
316            last;
317        }
318    }
319
320    return $reachedEnd ;
321}
322
323sub skipCentralDirectory
324{
325    my $self = shift;
326    my $magic = shift ;
327
328    my $buffer;
329    $self->smartReadExact(\$buffer, 46 - 4)
330        or return $self->TrailerError("Minimum header size is " .
331                                     46 . " bytes") ;
332
333    my $keep = $magic . $buffer ;
334    *$self->{HeaderPending} = $keep ;
335
336   #my $versionMadeBy      = unpack ("v", substr($buffer, 4-4,  2));
337   #my $extractVersion     = unpack ("v", substr($buffer, 6-4,  2));
338   #my $gpFlag             = unpack ("v", substr($buffer, 8-4,  2));
339   #my $compressedMethod   = unpack ("v", substr($buffer, 10-4, 2));
340   #my $lastModTime        = unpack ("V", substr($buffer, 12-4, 4));
341   #my $crc32              = unpack ("V", substr($buffer, 16-4, 4));
342    my $compressedLength   = unpack ("V", substr($buffer, 20-4, 4));
343    my $uncompressedLength = unpack ("V", substr($buffer, 24-4, 4));
344    my $filename_length    = unpack ("v", substr($buffer, 28-4, 2));
345    my $extra_length       = unpack ("v", substr($buffer, 30-4, 2));
346    my $comment_length     = unpack ("v", substr($buffer, 32-4, 2));
347   #my $disk_start         = unpack ("v", substr($buffer, 34-4, 2));
348   #my $int_file_attrib    = unpack ("v", substr($buffer, 36-4, 2));
349   #my $ext_file_attrib    = unpack ("V", substr($buffer, 38-4, 2));
350   #my $lcl_hdr_offset     = unpack ("V", substr($buffer, 42-4, 2));
351
352
353    my $filename;
354    my $extraField;
355    my $comment ;
356    if ($filename_length)
357    {
358        $self->smartReadExact(\$filename, $filename_length)
359            or return $self->TruncatedTrailer("filename");
360        $keep .= $filename ;
361    }
362
363    if ($extra_length)
364    {
365        $self->smartReadExact(\$extraField, $extra_length)
366            or return $self->TruncatedTrailer("extra");
367        $keep .= $extraField ;
368    }
369
370    if ($comment_length)
371    {
372        $self->smartReadExact(\$comment, $comment_length)
373            or return $self->TruncatedTrailer("comment");
374        $keep .= $comment ;
375    }
376
377    return STATUS_OK ;
378}
379
380sub skipArchiveExtra
381{
382    my $self = shift;
383    my $magic = shift ;
384
385    my $buffer;
386    $self->smartReadExact(\$buffer, 4)
387        or return $self->TrailerError("Minimum header size is " .
388                                     4 . " bytes") ;
389
390    my $keep = $magic . $buffer ;
391
392    my $size = unpack ("V", $buffer);
393
394    $self->smartReadExact(\$buffer, $size)
395        or return $self->TrailerError("Minimum header size is " .
396                                     $size . " bytes") ;
397
398    $keep .= $buffer ;
399    *$self->{HeaderPending} = $keep ;
400
401    return STATUS_OK ;
402}
403
404
405sub skipCentralDirectory64Rec
406{
407    my $self = shift;
408    my $magic = shift ;
409
410    my $buffer;
411    $self->smartReadExact(\$buffer, 8)
412        or return $self->TrailerError("Minimum header size is " .
413                                     8 . " bytes") ;
414
415    my $keep = $magic . $buffer ;
416
417    my ($sizeLo, $sizeHi)  = unpack ("V V", $buffer);
418    my $size = $sizeHi * 0xFFFFFFFF + $sizeLo;
419
420    $self->fastForward($size)
421        or return $self->TrailerError("Minimum header size is " .
422                                     $size . " bytes") ;
423
424   #$keep .= $buffer ;
425   #*$self->{HeaderPending} = $keep ;
426
427   #my $versionMadeBy      = unpack ("v",   substr($buffer,  0, 2));
428   #my $extractVersion     = unpack ("v",   substr($buffer,  2, 2));
429   #my $diskNumber         = unpack ("V",   substr($buffer,  4, 4));
430   #my $cntrlDirDiskNo     = unpack ("V",   substr($buffer,  8, 4));
431   #my $entriesInThisCD    = unpack ("V V", substr($buffer, 12, 8));
432   #my $entriesInCD        = unpack ("V V", substr($buffer, 20, 8));
433   #my $sizeOfCD           = unpack ("V V", substr($buffer, 28, 8));
434   #my $offsetToCD         = unpack ("V V", substr($buffer, 36, 8));
435
436    return STATUS_OK ;
437}
438
439sub skipCentralDirectory64Loc
440{
441    my $self = shift;
442    my $magic = shift ;
443
444    my $buffer;
445    $self->smartReadExact(\$buffer, 20 - 4)
446        or return $self->TrailerError("Minimum header size is " .
447                                     20 . " bytes") ;
448
449    my $keep = $magic . $buffer ;
450    *$self->{HeaderPending} = $keep ;
451
452   #my $startCdDisk        = unpack ("V",   substr($buffer,  4-4, 4));
453   #my $offsetToCD         = unpack ("V V", substr($buffer,  8-4, 8));
454   #my $diskCount          = unpack ("V",   substr($buffer, 16-4, 4));
455
456    return STATUS_OK ;
457}
458
459sub skipEndCentralDirectory
460{
461    my $self = shift;
462    my $magic = shift ;
463
464    my $buffer;
465    $self->smartReadExact(\$buffer, 22 - 4)
466        or return $self->TrailerError("Minimum header size is " .
467                                     22 . " bytes") ;
468
469    my $keep = $magic . $buffer ;
470    *$self->{HeaderPending} = $keep ;
471
472   #my $diskNumber         = unpack ("v", substr($buffer, 4-4,  2));
473   #my $cntrlDirDiskNo     = unpack ("v", substr($buffer, 6-4,  2));
474   #my $entriesInThisCD    = unpack ("v", substr($buffer, 8-4,  2));
475   #my $entriesInCD        = unpack ("v", substr($buffer, 10-4, 2));
476   #my $sizeOfCD           = unpack ("V", substr($buffer, 12-4, 2));
477   #my $offsetToCD         = unpack ("V", substr($buffer, 16-4, 2));
478    my $comment_length     = unpack ("v", substr($buffer, 20-4, 2));
479
480
481    my $comment ;
482    if ($comment_length)
483    {
484        $self->smartReadExact(\$comment, $comment_length)
485            or return $self->TruncatedTrailer("comment");
486        $keep .= $comment ;
487    }
488
489    return STATUS_OK ;
490}
491
492
493sub _isZipMagic
494{
495    my $buffer = shift ;
496    return 0 if length $buffer < 4 ;
497    my $sig = unpack("V", $buffer) ;
498    return $sig == ZIP_LOCAL_HDR_SIG ;
499}
500
501
502sub _readFullZipHeader($)
503{
504    my ($self) = @_ ;
505    my $magic = '' ;
506
507    $self->smartReadExact(\$magic, 4);
508
509    *$self->{HeaderPending} = $magic ;
510
511    return $self->HeaderError("Minimum header size is " .
512                              30 . " bytes")
513        if length $magic != 4 ;
514
515
516    return $self->HeaderError("Bad Magic")
517        if ! _isZipMagic($magic) ;
518
519    my $status = $self->_readZipHeader($magic);
520    delete *$self->{Transparent} if ! defined $status ;
521    return $status ;
522}
523
524sub _readZipHeader($)
525{
526    my ($self, $magic) = @_ ;
527    my ($HeaderCRC) ;
528    my ($buffer) = '' ;
529
530    $self->smartReadExact(\$buffer, 30 - 4)
531        or return $self->HeaderError("Minimum header size is " .
532                                     30 . " bytes") ;
533
534    my $keep = $magic . $buffer ;
535    *$self->{HeaderPending} = $keep ;
536
537    my $extractVersion     = unpack ("v", substr($buffer, 4-4,  2));
538    my $gpFlag             = unpack ("v", substr($buffer, 6-4,  2));
539    my $compressedMethod   = unpack ("v", substr($buffer, 8-4,  2));
540    my $lastModTime        = unpack ("V", substr($buffer, 10-4, 4));
541    my $crc32              = unpack ("V", substr($buffer, 14-4, 4));
542    my $compressedLength   = U64::newUnpack_V32 substr($buffer, 18-4, 4);
543    my $uncompressedLength = U64::newUnpack_V32 substr($buffer, 22-4, 4);
544    my $filename_length    = unpack ("v", substr($buffer, 26-4, 2));
545    my $extra_length       = unpack ("v", substr($buffer, 28-4, 2));
546
547    my $filename;
548    my $extraField;
549    my @EXTRA = ();
550    my $streamingMode = ($gpFlag & ZIP_GP_FLAG_STREAMING_MASK) ? 1 : 0 ;
551
552    return $self->HeaderError("Streamed Stored content not supported")
553        if $streamingMode && $compressedMethod == 0 ;
554
555    return $self->HeaderError("Encrypted content not supported")
556        if $gpFlag & (ZIP_GP_FLAG_ENCRYPTED_MASK|ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK);
557
558    return $self->HeaderError("Patch content not supported")
559        if $gpFlag & ZIP_GP_FLAG_PATCHED_MASK;
560
561    *$self->{ZipData}{Streaming} = $streamingMode;
562
563
564    if ($filename_length)
565    {
566        $self->smartReadExact(\$filename, $filename_length)
567            or return $self->TruncatedHeader("Filename");
568        $keep .= $filename ;
569    }
570
571    my $zip64 = 0 ;
572
573    if ($extra_length)
574    {
575        $self->smartReadExact(\$extraField, $extra_length)
576            or return $self->TruncatedHeader("Extra Field");
577
578        my $bad = IO::Compress::Zlib::Extra::parseRawExtra($extraField,
579                                                \@EXTRA, 1, 0);
580        return $self->HeaderError($bad)
581            if defined $bad;
582
583        $keep .= $extraField ;
584
585        my %Extra ;
586        for (@EXTRA)
587        {
588            $Extra{$_->[0]} = \$_->[1];
589        }
590
591        if (defined $Extra{ZIP_EXTRA_ID_ZIP64()})
592        {
593            $zip64 = 1 ;
594
595            my $buff = ${ $Extra{ZIP_EXTRA_ID_ZIP64()} };
596
597            # This code assumes that all the fields in the Zip64
598            # extra field aren't necessarily present. The spec says that
599            # they only exist if the equivalent local headers are -1.
600
601            if (! $streamingMode) {
602                my $offset = 0 ;
603
604                if ($uncompressedLength->get32bit() == 0xFFFFFFFF ) {
605                    $uncompressedLength
606                            = U64::newUnpack_V64 substr($buff, 0, 8);
607
608                    $offset += 8 ;
609                }
610
611                if ($compressedLength->get32bit() == 0xFFFFFFFF) {
612
613                    $compressedLength
614                        = U64::newUnpack_V64 substr($buff, $offset, 8);
615
616                    $offset += 8 ;
617                }
618           }
619        }
620    }
621
622    *$self->{ZipData}{Zip64} = $zip64;
623
624    if (! $streamingMode) {
625        *$self->{ZipData}{Streaming} = 0;
626        *$self->{ZipData}{Crc32} = $crc32;
627        *$self->{ZipData}{CompressedLen} = $compressedLength;
628        *$self->{ZipData}{UnCompressedLen} = $uncompressedLength;
629        *$self->{CompressedInputLengthRemaining} =
630            *$self->{CompressedInputLength} = $compressedLength->get64bit();
631    }
632
633    *$self->{ZipData}{CRC32} = crc32(undef);
634    *$self->{ZipData}{Method} = $compressedMethod;
635    if ($compressedMethod == ZIP_CM_DEFLATE)
636    {
637        *$self->{Type} = 'zip-deflate';
638        my $obj = IO::Uncompress::Adapter::Inflate::mkUncompObject(1,0,0);
639
640        *$self->{Uncomp} = $obj;
641    }
642    elsif ($compressedMethod == ZIP_CM_BZIP2)
643    {
644        return $self->HeaderError("Unsupported Compression format $compressedMethod")
645            if ! defined $IO::Uncompress::Adapter::Bunzip2::VERSION ;
646
647        *$self->{Type} = 'zip-bzip2';
648
649        my $obj = IO::Uncompress::Adapter::Bunzip2::mkUncompObject();
650
651        *$self->{Uncomp} = $obj;
652    }
653#    elsif ($compressedMethod == ZIP_CM_LZMA)
654#    {
655#        return $self->HeaderError("Unsupported Compression format $compressedMethod")
656#            if ! defined $IO::Uncompress::Adapter::UnLzma::VERSION ;
657#
658#        *$self->{Type} = 'zip-lzma';
659#        my $LzmaHeader;
660#        $self->smartReadExact(\$LzmaHeader, 4)
661#                or return $self->saveErrorString(undef, "Truncated file");
662#        my ($verHi, $verLo)   = unpack ("CC", substr($LzmaHeader, 0, 2));
663#        my $LzmaPropertiesSize   = unpack ("v", substr($LzmaHeader, 2, 2));
664#
665#
666#        my $LzmaPropertyData;
667#        $self->smartReadExact(\$LzmaPropertyData, $LzmaPropertiesSize)
668#                or return $self->saveErrorString(undef, "Truncated file");
669#        #my $LzmaInfo = unpack ("C", substr($LzmaPropertyData, 0, 1));
670#        #my $LzmaDictSize = unpack ("V", substr($LzmaPropertyData, 1, 4));
671#
672#        # Create an LZMA_Alone header
673#        $self->pushBack($LzmaPropertyData .
674#                $uncompressedLength->getPacked_V64());
675#
676#        my $obj =
677#        IO::Uncompress::Adapter::UnLzma::mkUncompObject();
678#
679#        *$self->{Uncomp} = $obj;
680#    }
681    elsif ($compressedMethod == ZIP_CM_STORE)
682    {
683        # TODO -- add support for reading uncompressed
684
685        *$self->{Type} = 'zip-stored';
686
687        my $obj = IO::Uncompress::Adapter::Identity::mkUncompObject();
688
689        *$self->{Uncomp} = $obj;
690    }
691    else
692    {
693        return $self->HeaderError("Unsupported Compression format $compressedMethod");
694    }
695
696    return {
697        'Type'               => 'zip',
698        'FingerprintLength'  => 4,
699        #'HeaderLength'       => $compressedMethod == 8 ? length $keep : 0,
700        'HeaderLength'       => length $keep,
701        'Zip64'              => $zip64,
702        'TrailerLength'      => ! $streamingMode ? 0 : $zip64 ? 24 : 16,
703        'Header'             => $keep,
704        'CompressedLength'   => $compressedLength ,
705        'UncompressedLength' => $uncompressedLength ,
706        'CRC32'              => $crc32 ,
707        'Name'               => $filename,
708        'Time'               => _dosToUnixTime($lastModTime),
709        'Stream'             => $streamingMode,
710
711        'MethodID'           => $compressedMethod,
712        'MethodName'         => $compressedMethod == ZIP_CM_DEFLATE
713                                 ? "Deflated"
714                                 : $compressedMethod == ZIP_CM_BZIP2
715                                     ? "Bzip2"
716                                     : $compressedMethod == ZIP_CM_LZMA
717                                         ? "Lzma"
718                                         : $compressedMethod == ZIP_CM_STORE
719                                             ? "Stored"
720                                             : "Unknown" ,
721
722#        'TextFlag'      => $flag & GZIP_FLG_FTEXT ? 1 : 0,
723#        'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0,
724#        'NameFlag'      => $flag & GZIP_FLG_FNAME ? 1 : 0,
725#        'CommentFlag'   => $flag & GZIP_FLG_FCOMMENT ? 1 : 0,
726#        'ExtraFlag'     => $flag & GZIP_FLG_FEXTRA ? 1 : 0,
727#        'Comment'       => $comment,
728#        'OsID'          => $os,
729#        'OsName'        => defined $GZIP_OS_Names{$os}
730#                                 ? $GZIP_OS_Names{$os} : "Unknown",
731#        'HeaderCRC'     => $HeaderCRC,
732#        'Flags'         => $flag,
733#        'ExtraFlags'    => $xfl,
734        'ExtraFieldRaw' => $extraField,
735        'ExtraField'    => [ @EXTRA ],
736
737
738      }
739}
740
741sub filterUncompressed
742{
743    my $self = shift ;
744
745    if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
746        *$self->{ZipData}{CRC32} = *$self->{Uncomp}->crc32() ;
747    }
748    else {
749        *$self->{ZipData}{CRC32} = crc32(${$_[0]}, *$self->{ZipData}{CRC32});
750    }
751}
752
753
754# from Archive::Zip & info-zip
755sub _dosToUnixTime
756{
757	my $dt = shift;
758
759	my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
760	my $mon  = ( ( $dt >> 21 ) & 0x0f ) - 1;
761	my $mday = ( ( $dt >> 16 ) & 0x1f );
762
763	my $hour = ( ( $dt >> 11 ) & 0x1f );
764	my $min  = ( ( $dt >> 5 ) & 0x3f );
765	my $sec  = ( ( $dt << 1 ) & 0x3e );
766
767
768    use POSIX 'mktime';
769
770    my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
771    return 0 if ! defined $time_t;
772	return $time_t;
773}
774
775
7761;
777
778__END__
779
780
781=head1 NAME
782
783IO::Uncompress::Unzip - Read zip files/buffers
784
785=head1 SYNOPSIS
786
787    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
788
789    my $status = unzip $input => $output [,OPTS]
790        or die "unzip failed: $UnzipError\n";
791
792    my $z = new IO::Uncompress::Unzip $input [OPTS]
793        or die "unzip failed: $UnzipError\n";
794
795    $status = $z->read($buffer)
796    $status = $z->read($buffer, $length)
797    $status = $z->read($buffer, $length, $offset)
798    $line = $z->getline()
799    $char = $z->getc()
800    $char = $z->ungetc()
801    $char = $z->opened()
802
803    $status = $z->inflateSync()
804
805    $data = $z->trailingData()
806    $status = $z->nextStream()
807    $data = $z->getHeaderInfo()
808    $z->tell()
809    $z->seek($position, $whence)
810    $z->binmode()
811    $z->fileno()
812    $z->eof()
813    $z->close()
814
815    $UnzipError ;
816
817    # IO::File mode
818
819    <$z>
820    read($z, $buffer);
821    read($z, $buffer, $length);
822    read($z, $buffer, $length, $offset);
823    tell($z)
824    seek($z, $position, $whence)
825    binmode($z)
826    fileno($z)
827    eof($z)
828    close($z)
829
830=head1 DESCRIPTION
831
832This module provides a Perl interface that allows the reading of
833zlib files/buffers.
834
835For writing zip files/buffers, see the companion module IO::Compress::Zip.
836
837=head1 Functional Interface
838
839A top-level function, C<unzip>, is provided to carry out
840"one-shot" uncompression between buffers and/or files. For finer
841control over the uncompression process, see the L</"OO Interface">
842section.
843
844    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
845
846    unzip $input => $output [,OPTS]
847        or die "unzip failed: $UnzipError\n";
848
849The functional interface needs Perl5.005 or better.
850
851=head2 unzip $input => $output [, OPTS]
852
853C<unzip> expects at least two parameters, C<$input> and C<$output>.
854
855=head3 The C<$input> parameter
856
857The parameter, C<$input>, is used to define the source of
858the compressed data.
859
860It can take one of the following forms:
861
862=over 5
863
864=item A filename
865
866If the C<$input> parameter is a simple scalar, it is assumed to be a
867filename. This file will be opened for reading and the input data
868will be read from it.
869
870=item A filehandle
871
872If the C<$input> parameter is a filehandle, the input data will be
873read from it.
874The string '-' can be used as an alias for standard input.
875
876=item A scalar reference
877
878If C<$input> is a scalar reference, the input data will be read
879from C<$$input>.
880
881=item An array reference
882
883If C<$input> is an array reference, each element in the array must be a
884filename.
885
886The input data will be read from each file in turn.
887
888The complete array will be walked to ensure that it only
889contains valid filenames before any data is uncompressed.
890
891=item An Input FileGlob string
892
893If C<$input> is a string that is delimited by the characters "<" and ">"
894C<unzip> will assume that it is an I<input fileglob string>. The
895input is the list of files that match the fileglob.
896
897If the fileglob does not match any files ...
898
899See L<File::GlobMapper|File::GlobMapper> for more details.
900
901=back
902
903If the C<$input> parameter is any other type, C<undef> will be returned.
904
905=head3 The C<$output> parameter
906
907The parameter C<$output> is used to control the destination of the
908uncompressed data. This parameter can take one of these forms.
909
910=over 5
911
912=item A filename
913
914If the C<$output> parameter is a simple scalar, it is assumed to be a
915filename.  This file will be opened for writing and the uncompressed
916data will be written to it.
917
918=item A filehandle
919
920If the C<$output> parameter is a filehandle, the uncompressed data
921will be written to it.
922The string '-' can be used as an alias for standard output.
923
924=item A scalar reference
925
926If C<$output> is a scalar reference, the uncompressed data will be
927stored in C<$$output>.
928
929=item An Array Reference
930
931If C<$output> is an array reference, the uncompressed data will be
932pushed onto the array.
933
934=item An Output FileGlob
935
936If C<$output> is a string that is delimited by the characters "<" and ">"
937C<unzip> will assume that it is an I<output fileglob string>. The
938output is the list of files that match the fileglob.
939
940When C<$output> is an fileglob string, C<$input> must also be a fileglob
941string. Anything else is an error.
942
943=back
944
945If the C<$output> parameter is any other type, C<undef> will be returned.
946
947=head2 Notes
948
949When C<$input> maps to multiple compressed files/buffers and C<$output> is
950a single file/buffer, after uncompression C<$output> will contain a
951concatenation of all the uncompressed data from each of the input
952files/buffers.
953
954=head2 Optional Parameters
955
956Unless specified below, the optional parameters for C<unzip>,
957C<OPTS>, are the same as those used with the OO interface defined in the
958L</"Constructor Options"> section below.
959
960=over 5
961
962=item C<< AutoClose => 0|1 >>
963
964This option applies to any input or output data streams to
965C<unzip> that are filehandles.
966
967If C<AutoClose> is specified, and the value is true, it will result in all
968input and/or output filehandles being closed once C<unzip> has
969completed.
970
971This parameter defaults to 0.
972
973=item C<< BinModeOut => 0|1 >>
974
975When writing to a file or filehandle, set C<binmode> before writing to the
976file.
977
978Defaults to 0.
979
980=item C<< Append => 0|1 >>
981
982The behaviour of this option is dependent on the type of output data
983stream.
984
985=over 5
986
987=item * A Buffer
988
989If C<Append> is enabled, all uncompressed data will be append to the end of
990the output buffer. Otherwise the output buffer will be cleared before any
991uncompressed data is written to it.
992
993=item * A Filename
994
995If C<Append> is enabled, the file will be opened in append mode. Otherwise
996the contents of the file, if any, will be truncated before any uncompressed
997data is written to it.
998
999=item * A Filehandle
1000
1001If C<Append> is enabled, the filehandle will be positioned to the end of
1002the file via a call to C<seek> before any uncompressed data is
1003written to it.  Otherwise the file pointer will not be moved.
1004
1005=back
1006
1007When C<Append> is specified, and set to true, it will I<append> all uncompressed
1008data to the output data stream.
1009
1010So when the output is a filehandle it will carry out a seek to the eof
1011before writing any uncompressed data. If the output is a filename, it will be opened for
1012appending. If the output is a buffer, all uncompressed data will be appened to
1013the existing buffer.
1014
1015Conversely when C<Append> is not specified, or it is present and is set to
1016false, it will operate as follows.
1017
1018When the output is a filename, it will truncate the contents of the file
1019before writing any uncompressed data. If the output is a filehandle
1020its position will not be changed. If the output is a buffer, it will be
1021wiped before any uncompressed data is output.
1022
1023Defaults to 0.
1024
1025=item C<< MultiStream => 0|1 >>
1026
1027If the input file/buffer contains multiple compressed data streams, this
1028option will uncompress the whole lot as a single data stream.
1029
1030Defaults to 0.
1031
1032=item C<< TrailingData => $scalar >>
1033
1034Returns the data, if any, that is present immediately after the compressed
1035data stream once uncompression is complete.
1036
1037This option can be used when there is useful information immediately
1038following the compressed data stream, and you don't know the length of the
1039compressed data stream.
1040
1041If the input is a buffer, C<trailingData> will return everything from the
1042end of the compressed data stream to the end of the buffer.
1043
1044If the input is a filehandle, C<trailingData> will return the data that is
1045left in the filehandle input buffer once the end of the compressed data
1046stream has been reached. You can then use the filehandle to read the rest
1047of the input file.
1048
1049Don't bother using C<trailingData> if the input is a filename.
1050
1051If you know the length of the compressed data stream before you start
1052uncompressing, you can avoid having to use C<trailingData> by setting the
1053C<InputLength> option.
1054
1055=back
1056
1057=head2 Examples
1058
1059To read the contents of the file C<file1.txt.zip> and write the
1060uncompressed data to the file C<file1.txt>.
1061
1062    use strict ;
1063    use warnings ;
1064    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
1065
1066    my $input = "file1.txt.zip";
1067    my $output = "file1.txt";
1068    unzip $input => $output
1069        or die "unzip failed: $UnzipError\n";
1070
1071To read from an existing Perl filehandle, C<$input>, and write the
1072uncompressed data to a buffer, C<$buffer>.
1073
1074    use strict ;
1075    use warnings ;
1076    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
1077    use IO::File ;
1078
1079    my $input = new IO::File "<file1.txt.zip"
1080        or die "Cannot open 'file1.txt.zip': $!\n" ;
1081    my $buffer ;
1082    unzip $input => \$buffer
1083        or die "unzip failed: $UnzipError\n";
1084
1085To uncompress all files in the directory "/my/home" that match "*.txt.zip" and store the compressed data in the same directory
1086
1087    use strict ;
1088    use warnings ;
1089    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
1090
1091    unzip '</my/home/*.txt.zip>' => '</my/home/#1.txt>'
1092        or die "unzip failed: $UnzipError\n";
1093
1094and if you want to compress each file one at a time, this will do the trick
1095
1096    use strict ;
1097    use warnings ;
1098    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
1099
1100    for my $input ( glob "/my/home/*.txt.zip" )
1101    {
1102        my $output = $input;
1103        $output =~ s/.zip// ;
1104        unzip $input => $output
1105            or die "Error compressing '$input': $UnzipError\n";
1106    }
1107
1108=head1 OO Interface
1109
1110=head2 Constructor
1111
1112The format of the constructor for IO::Uncompress::Unzip is shown below
1113
1114    my $z = new IO::Uncompress::Unzip $input [OPTS]
1115        or die "IO::Uncompress::Unzip failed: $UnzipError\n";
1116
1117Returns an C<IO::Uncompress::Unzip> object on success and undef on failure.
1118The variable C<$UnzipError> will contain an error message on failure.
1119
1120If you are running Perl 5.005 or better the object, C<$z>, returned from
1121IO::Uncompress::Unzip can be used exactly like an L<IO::File|IO::File> filehandle.
1122This means that all normal input file operations can be carried out with
1123C<$z>.  For example, to read a line from a compressed file/buffer you can
1124use either of these forms
1125
1126    $line = $z->getline();
1127    $line = <$z>;
1128
1129The mandatory parameter C<$input> is used to determine the source of the
1130compressed data. This parameter can take one of three forms.
1131
1132=over 5
1133
1134=item A filename
1135
1136If the C<$input> parameter is a scalar, it is assumed to be a filename. This
1137file will be opened for reading and the compressed data will be read from it.
1138
1139=item A filehandle
1140
1141If the C<$input> parameter is a filehandle, the compressed data will be
1142read from it.
1143The string '-' can be used as an alias for standard input.
1144
1145=item A scalar reference
1146
1147If C<$input> is a scalar reference, the compressed data will be read from
1148C<$$output>.
1149
1150=back
1151
1152=head2 Constructor Options
1153
1154The option names defined below are case insensitive and can be optionally
1155prefixed by a '-'.  So all of the following are valid
1156
1157    -AutoClose
1158    -autoclose
1159    AUTOCLOSE
1160    autoclose
1161
1162OPTS is a combination of the following options:
1163
1164=over 5
1165
1166=item C<< AutoClose => 0|1 >>
1167
1168This option is only valid when the C<$input> parameter is a filehandle. If
1169specified, and the value is true, it will result in the file being closed once
1170either the C<close> method is called or the IO::Uncompress::Unzip object is
1171destroyed.
1172
1173This parameter defaults to 0.
1174
1175=item C<< MultiStream => 0|1 >>
1176
1177Treats the complete zip file/buffer as a single compressed data
1178stream. When reading in multi-stream mode each member of the zip
1179file/buffer will be uncompressed in turn until the end of the file/buffer
1180is encountered.
1181
1182This parameter defaults to 0.
1183
1184=item C<< Prime => $string >>
1185
1186This option will uncompress the contents of C<$string> before processing the
1187input file/buffer.
1188
1189This option can be useful when the compressed data is embedded in another
1190file/data structure and it is not possible to work out where the compressed
1191data begins without having to read the first few bytes. If this is the
1192case, the uncompression can be I<primed> with these bytes using this
1193option.
1194
1195=item C<< Transparent => 0|1 >>
1196
1197If this option is set and the input file/buffer is not compressed data,
1198the module will allow reading of it anyway.
1199
1200In addition, if the input file/buffer does contain compressed data and
1201there is non-compressed data immediately following it, setting this option
1202will make this module treat the whole file/bufffer as a single data stream.
1203
1204This option defaults to 1.
1205
1206=item C<< BlockSize => $num >>
1207
1208When reading the compressed input data, IO::Uncompress::Unzip will read it in
1209blocks of C<$num> bytes.
1210
1211This option defaults to 4096.
1212
1213=item C<< InputLength => $size >>
1214
1215When present this option will limit the number of compressed bytes read
1216from the input file/buffer to C<$size>. This option can be used in the
1217situation where there is useful data directly after the compressed data
1218stream and you know beforehand the exact length of the compressed data
1219stream.
1220
1221This option is mostly used when reading from a filehandle, in which case
1222the file pointer will be left pointing to the first byte directly after the
1223compressed data stream.
1224
1225This option defaults to off.
1226
1227=item C<< Append => 0|1 >>
1228
1229This option controls what the C<read> method does with uncompressed data.
1230
1231If set to 1, all uncompressed data will be appended to the output parameter
1232of the C<read> method.
1233
1234If set to 0, the contents of the output parameter of the C<read> method
1235will be overwritten by the uncompressed data.
1236
1237Defaults to 0.
1238
1239=item C<< Strict => 0|1 >>
1240
1241This option controls whether the extra checks defined below are used when
1242carrying out the decompression. When Strict is on, the extra tests are
1243carried out, when Strict is off they are not.
1244
1245The default for this option is off.
1246
1247=back
1248
1249=head2 Examples
1250
1251TODO
1252
1253=head1 Methods
1254
1255=head2 read
1256
1257Usage is
1258
1259    $status = $z->read($buffer)
1260
1261Reads a block of compressed data (the size the the compressed block is
1262determined by the C<Buffer> option in the constructor), uncompresses it and
1263writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
1264set in the constructor, the uncompressed data will be appended to the
1265C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
1266
1267Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
1268or a negative number on error.
1269
1270=head2 read
1271
1272Usage is
1273
1274    $status = $z->read($buffer, $length)
1275    $status = $z->read($buffer, $length, $offset)
1276
1277    $status = read($z, $buffer, $length)
1278    $status = read($z, $buffer, $length, $offset)
1279
1280Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
1281
1282The main difference between this form of the C<read> method and the
1283previous one, is that this one will attempt to return I<exactly> C<$length>
1284bytes. The only circumstances that this function will not is if end-of-file
1285or an IO error is encountered.
1286
1287Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
1288or a negative number on error.
1289
1290=head2 getline
1291
1292Usage is
1293
1294    $line = $z->getline()
1295    $line = <$z>
1296
1297Reads a single line.
1298
1299This method fully supports the use of of the variable C<$/> (or
1300C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
1301determine what constitutes an end of line. Paragraph mode, record mode and
1302file slurp mode are all supported.
1303
1304=head2 getc
1305
1306Usage is
1307
1308    $char = $z->getc()
1309
1310Read a single character.
1311
1312=head2 ungetc
1313
1314Usage is
1315
1316    $char = $z->ungetc($string)
1317
1318=head2 inflateSync
1319
1320Usage is
1321
1322    $status = $z->inflateSync()
1323
1324TODO
1325
1326=head2 getHeaderInfo
1327
1328Usage is
1329
1330    $hdr  = $z->getHeaderInfo();
1331    @hdrs = $z->getHeaderInfo();
1332
1333This method returns either a hash reference (in scalar context) or a list
1334or hash references (in array context) that contains information about each
1335of the header fields in the compressed data stream(s).
1336
1337=head2 tell
1338
1339Usage is
1340
1341    $z->tell()
1342    tell $z
1343
1344Returns the uncompressed file offset.
1345
1346=head2 eof
1347
1348Usage is
1349
1350    $z->eof();
1351    eof($z);
1352
1353Returns true if the end of the compressed input stream has been reached.
1354
1355=head2 seek
1356
1357    $z->seek($position, $whence);
1358    seek($z, $position, $whence);
1359
1360Provides a sub-set of the C<seek> functionality, with the restriction
1361that it is only legal to seek forward in the input file/buffer.
1362It is a fatal error to attempt to seek backward.
1363
1364The C<$whence> parameter takes one the usual values, namely SEEK_SET,
1365SEEK_CUR or SEEK_END.
1366
1367Returns 1 on success, 0 on failure.
1368
1369=head2 binmode
1370
1371Usage is
1372
1373    $z->binmode
1374    binmode $z ;
1375
1376This is a noop provided for completeness.
1377
1378=head2 opened
1379
1380    $z->opened()
1381
1382Returns true if the object currently refers to a opened file/buffer.
1383
1384=head2 autoflush
1385
1386    my $prev = $z->autoflush()
1387    my $prev = $z->autoflush(EXPR)
1388
1389If the C<$z> object is associated with a file or a filehandle, this method
1390returns the current autoflush setting for the underlying filehandle. If
1391C<EXPR> is present, and is non-zero, it will enable flushing after every
1392write/print operation.
1393
1394If C<$z> is associated with a buffer, this method has no effect and always
1395returns C<undef>.
1396
1397B<Note> that the special variable C<$|> B<cannot> be used to set or
1398retrieve the autoflush setting.
1399
1400=head2 input_line_number
1401
1402    $z->input_line_number()
1403    $z->input_line_number(EXPR)
1404
1405Returns the current uncompressed line number. If C<EXPR> is present it has
1406the effect of setting the line number. Note that setting the line number
1407does not change the current position within the file/buffer being read.
1408
1409The contents of C<$/> are used to to determine what constitutes a line
1410terminator.
1411
1412=head2 fileno
1413
1414    $z->fileno()
1415    fileno($z)
1416
1417If the C<$z> object is associated with a file or a filehandle, C<fileno>
1418will return the underlying file descriptor. Once the C<close> method is
1419called C<fileno> will return C<undef>.
1420
1421If the C<$z> object is is associated with a buffer, this method will return
1422C<undef>.
1423
1424=head2 close
1425
1426    $z->close() ;
1427    close $z ;
1428
1429Closes the output file/buffer.
1430
1431For most versions of Perl this method will be automatically invoked if
1432the IO::Uncompress::Unzip object is destroyed (either explicitly or by the
1433variable with the reference to the object going out of scope). The
1434exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
1435these cases, the C<close> method will be called automatically, but
1436not until global destruction of all live objects when the program is
1437terminating.
1438
1439Therefore, if you want your scripts to be able to run on all versions
1440of Perl, you should call C<close> explicitly and not rely on automatic
1441closing.
1442
1443Returns true on success, otherwise 0.
1444
1445If the C<AutoClose> option has been enabled when the IO::Uncompress::Unzip
1446object was created, and the object is associated with a file, the
1447underlying file will also be closed.
1448
1449=head2 nextStream
1450
1451Usage is
1452
1453    my $status = $z->nextStream();
1454
1455Skips to the next compressed data stream in the input file/buffer. If a new
1456compressed data stream is found, the eof marker will be cleared and C<$.>
1457will be reset to 0.
1458
1459Returns 1 if a new stream was found, 0 if none was found, and -1 if an
1460error was encountered.
1461
1462=head2 trailingData
1463
1464Usage is
1465
1466    my $data = $z->trailingData();
1467
1468Returns the data, if any, that is present immediately after the compressed
1469data stream once uncompression is complete. It only makes sense to call
1470this method once the end of the compressed data stream has been
1471encountered.
1472
1473This option can be used when there is useful information immediately
1474following the compressed data stream, and you don't know the length of the
1475compressed data stream.
1476
1477If the input is a buffer, C<trailingData> will return everything from the
1478end of the compressed data stream to the end of the buffer.
1479
1480If the input is a filehandle, C<trailingData> will return the data that is
1481left in the filehandle input buffer once the end of the compressed data
1482stream has been reached. You can then use the filehandle to read the rest
1483of the input file.
1484
1485Don't bother using C<trailingData> if the input is a filename.
1486
1487If you know the length of the compressed data stream before you start
1488uncompressing, you can avoid having to use C<trailingData> by setting the
1489C<InputLength> option in the constructor.
1490
1491=head1 Importing
1492
1493No symbolic constants are required by this IO::Uncompress::Unzip at present.
1494
1495=over 5
1496
1497=item :all
1498
1499Imports C<unzip> and C<$UnzipError>.
1500Same as doing this
1501
1502    use IO::Uncompress::Unzip qw(unzip $UnzipError) ;
1503
1504=back
1505
1506=head1 EXAMPLES
1507
1508=head2 Working with Net::FTP
1509
1510See L<IO::Uncompress::Unzip::FAQ|IO::Uncompress::Unzip::FAQ/"Compressed files and Net::FTP">
1511
1512=head1 SEE ALSO
1513
1514L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
1515
1516L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
1517
1518L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
1519L<Archive::Tar|Archive::Tar>,
1520L<IO::Zlib|IO::Zlib>
1521
1522For RFC 1950, 1951 and 1952 see
1523F<http://www.faqs.org/rfcs/rfc1950.html>,
1524F<http://www.faqs.org/rfcs/rfc1951.html> and
1525F<http://www.faqs.org/rfcs/rfc1952.html>
1526
1527The I<zlib> compression library was written by Jean-loup Gailly
1528F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
1529
1530The primary site for the I<zlib> compression library is
1531F<http://www.zlib.org>.
1532
1533The primary site for gzip is F<http://www.gzip.org>.
1534
1535=head1 AUTHOR
1536
1537This module was written by Paul Marquess, F<pmqs@cpan.org>.
1538
1539=head1 MODIFICATION HISTORY
1540
1541See the Changes file.
1542
1543=head1 COPYRIGHT AND LICENSE
1544
1545Copyright (c) 2005-2010 Paul Marquess. All rights reserved.
1546
1547This program is free software; you can redistribute it and/or
1548modify it under the same terms as Perl itself.
1549
1550