summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL1
-rw-r--r--MANIFEST4
-rwxr-xr-xPorting/Maintainers.pl2
-rw-r--r--configure.com1
-rw-r--r--cpan/IO-Compress/Changes13
-rw-r--r--cpan/IO-Compress/Makefile.PL4
-rw-r--r--cpan/IO-Compress/README6
-rw-r--r--cpan/IO-Compress/bin/zipdetails2088
-rw-r--r--cpan/IO-Compress/lib/Compress/Zlib.pm14
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm22
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm6
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm4
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Base.pm12
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Base/Common.pm23
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Bzip2.pm10
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Deflate.pm14
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/FAQ.pod (renamed from cpan/IO-Compress/pod/FAQ.pod)74
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Gzip.pm18
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm2
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm16
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Zip.pm63
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm2
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm2
-rw-r--r--cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm4
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm6
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm6
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm6
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm20
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm42
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Base.pm13
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm10
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm16
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm10
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm12
-rw-r--r--cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm20
-rw-r--r--cpan/IO-Compress/t/000prereq.t2
-rw-r--r--cpan/IO-Compress/t/105oneshot-zip-bzip2-only.t64
-rwxr-xr-xinstallperl3
-rw-r--r--pod/perldelta.pod9
-rw-r--r--pod/perlutil.pod7
-rw-r--r--t/porting/known_pod_issues.dat2
-rw-r--r--utils.lst1
-rw-r--r--utils/Makefile8
-rw-r--r--utils/Makefile.SH8
-rw-r--r--utils/zipdetails.PL51
-rw-r--r--vms/descrip_mms.template5
-rw-r--r--win32/Makefile3
-rw-r--r--win32/makefile.mk3
48 files changed, 2511 insertions, 221 deletions
diff --git a/INSTALL b/INSTALL
index 079cc4e0c2..06a9c5993f 100644
--- a/INSTALL
+++ b/INSTALL
@@ -2122,6 +2122,7 @@ make install will install the following:
shasum A tool to print or check SHA checksums.
splain Describe Perl warnings and errors.
xsubpp Compiler to convert Perl XS code into C code.
+ zipdetails display the internal structure of zip files
library files
diff --git a/MANIFEST b/MANIFEST
index 8f6deb0381..388ac2f7e0 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1219,6 +1219,7 @@ cpan/HTTP-Tiny/t/cases/redirect-07.txt
cpan/HTTP-Tiny/t/cases/redirect-08.txt
cpan/HTTP-Tiny/t/cases/redirect-09.txt
cpan/HTTP-Tiny/t/Util.pm
+cpan/IO-Compress/bin/zipdetails IO::Compress
cpan/IO-Compress/Changes IO::Compress
cpan/IO-Compress/examples/compress-zlib/filtdef IO::Compress
cpan/IO-Compress/examples/compress-zlib/filtinf IO::Compress
@@ -1242,6 +1243,7 @@ cpan/IO-Compress/lib/IO/Compress/Base/Common.pm IO::Compress
cpan/IO-Compress/lib/IO/Compress/Base.pm IO::Compress
cpan/IO-Compress/lib/IO/Compress/Bzip2.pm IO::Compress
cpan/IO-Compress/lib/IO/Compress/Deflate.pm IO::Compress
+cpan/IO-Compress/lib/IO/Compress/FAQ.pod IO::Compress
cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm IO::Compress
cpan/IO-Compress/lib/IO/Compress/Gzip.pm IO::Compress
cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm IO::Compress
@@ -1261,7 +1263,6 @@ cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm IO::Compress
cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm IO::Compress
cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm IO::Compress
cpan/IO-Compress/Makefile.PL IO::Compress
-cpan/IO-Compress/pod/FAQ.pod IO::Compress
cpan/IO-Compress/private/MakeUtil.pm IO::Compress
cpan/IO-Compress/README IO::Compress
cpan/IO-Compress/t/000prereq.t IO::Compress
@@ -5470,6 +5471,7 @@ utils/ptar.PL The ptar utility
utils/shasum.PL filter for computing SHA digests (analogous to md5sum)
utils/splain.PL Stand-alone version of diagnostics.pm
utils/xsubpp.PL External subroutine preprocessor
+utils/zipdetails.PL display the internal structure of zip files
uts/sprintf_wrap.c sprintf wrapper for UTS
uts/strtol_wrap.c strtol wrapper for UTS
vmesa/Makefile VM/ESA Makefile
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index f466ab2722..8abc0289ae 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -1035,7 +1035,7 @@ use File::Glob qw(:case);
'IO-Compress' =>
{
'MAINTAINER' => 'pmqs',
- 'DISTRIBUTION' => 'PMQS/IO-Compress-2.043.tar.gz',
+ 'DISTRIBUTION' => 'PMQS/IO-Compress-2.044.tar.gz',
'FILES' => q[cpan/IO-Compress],
'EXCLUDED' => [ qr{t/Test/} ],
'UPSTREAM' => 'cpan',
diff --git a/configure.com b/configure.com
index 5da59730bc..e51c3e6787 100644
--- a/configure.com
+++ b/configure.com
@@ -7330,6 +7330,7 @@ $ WRITE CONFIG "$ ptargrep == """ + perl_setup_perl + " ''vms_prefix':[utils]p
$ WRITE CONFIG "$ shasum == """ + perl_setup_perl + " ''vms_prefix':[utils]shasum.com"""
$ WRITE CONFIG "$ splain == """ + perl_setup_perl + " ''vms_prefix':[utils]splain.com"""
$ WRITE CONFIG "$ xsubpp == """ + perl_setup_perl + " ''vms_prefix':[utils]xsubpp.com"""
+$ WRITE CONFIG "$ zipdetails == """ + perl_setup_perl + " ''vms_prefix':[utils]zipdetails.com"""
$ CLOSE CONFIG
$!
$ echo ""
diff --git a/cpan/IO-Compress/Changes b/cpan/IO-Compress/Changes
index 9f2d070112..d8c82c6f97 100644
--- a/cpan/IO-Compress/Changes
+++ b/cpan/IO-Compress/Changes
@@ -1,6 +1,19 @@
CHANGES
-------
+ 2.044 2 December 2011
+
+ * Moved FAQ.pod under the lib directory so it can get installed
+
+ * Added bin/zipdetails
+
+ * IO::Compress::Zip
+ - In one-shot mode enable Zip64 mode if the input file/buffer
+ >= 0xFFFFFFFF bytes.
+
+ * IO::Compress::FAQ
+ - Updates
+
2.043 20 November 2011
* IO::Compress::Base
diff --git a/cpan/IO-Compress/Makefile.PL b/cpan/IO-Compress/Makefile.PL
index bfe40a54b0..71809ac20b 100644
--- a/cpan/IO-Compress/Makefile.PL
+++ b/cpan/IO-Compress/Makefile.PL
@@ -3,7 +3,7 @@
use strict ;
require 5.004 ;
-$::VERSION = '2.043' ;
+$::VERSION = '2.044' ;
use private::MakeUtil;
use ExtUtils::MakeMaker 5.16 ;
@@ -40,6 +40,8 @@ WriteMakefile(
),
INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'),
+
+ EXE_FILES => ['bin/zipdetails'],
(
$] >= 5.009 && $] <= 5.011001 && ! $ENV{PERL_CORE}
diff --git a/cpan/IO-Compress/README b/cpan/IO-Compress/README
index b1090dc58e..d72d9b9519 100644
--- a/cpan/IO-Compress/README
+++ b/cpan/IO-Compress/README
@@ -1,9 +1,9 @@
IO-Compress
- Version 2.043
+ Version 2.044
- 20th November 2011
+ 3rd December 2011
Copyright (c) 1995-2011 Paul Marquess. All rights reserved.
This program is free software; you can redistribute it
@@ -89,7 +89,7 @@ To help me help you, I need all of the following information:
If you haven't installed IO-Compress then search IO::Compress::Gzip.pm
for a line like this:
- $VERSION = "2.043" ;
+ $VERSION = "2.044" ;
2. If you are having problems building IO-Compress, send me a
complete log of what happened. Start by unpacking the IO-Compress
diff --git a/cpan/IO-Compress/bin/zipdetails b/cpan/IO-Compress/bin/zipdetails
new file mode 100644
index 0000000000..5cb3a96ad6
--- /dev/null
+++ b/cpan/IO-Compress/bin/zipdetails
@@ -0,0 +1,2088 @@
+#!/usr/bin/perl
+
+# zipdetails
+#
+# Display info on the contents of a Zip file
+#
+
+use strict;
+use warnings ;
+
+use IO::File;
+use Encode;
+
+# Compression types
+use constant ZIP_CM_STORE => 0 ;
+use constant ZIP_CM_IMPLODE => 6 ;
+use constant ZIP_CM_DEFLATE => 8 ;
+use constant ZIP_CM_BZIP2 => 12 ;
+use constant ZIP_CM_LZMA => 14 ;
+use constant ZIP_CM_PPMD => 98 ;
+
+# General Purpose Flag
+use constant ZIP_GP_FLAG_ENCRYPTED_MASK => (1 << 0) ;
+use constant ZIP_GP_FLAG_STREAMING_MASK => (1 << 3) ;
+use constant ZIP_GP_FLAG_PATCHED_MASK => (1 << 5) ;
+use constant ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK => (1 << 6) ;
+use constant ZIP_GP_FLAG_LZMA_EOS_PRESENT => (1 << 1) ;
+use constant ZIP_GP_FLAG_LANGUAGE_ENCODING => (1 << 11) ;
+
+# Internal File Attributes
+use constant ZIP_IFA_TEXT_MASK => 1;
+
+# Signatures for each of the headers
+use constant ZIP_LOCAL_HDR_SIG => 0x04034b50;
+use constant ZIP_DATA_HDR_SIG => 0x08074b50;
+use constant ZIP_CENTRAL_HDR_SIG => 0x02014b50;
+use constant ZIP_END_CENTRAL_HDR_SIG => 0x06054b50;
+use constant ZIP64_END_CENTRAL_REC_HDR_SIG => 0x06064b50;
+use constant ZIP64_END_CENTRAL_LOC_HDR_SIG => 0x07064b50;
+use constant ZIP64_ARCHIVE_EXTRA_SIG => 0x08064b50;
+use constant ZIP64_DIGITAL_SIGNATURE_SIG => 0x05054b50;
+
+use constant ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG => 0x08064b50;
+
+# Extra sizes
+use constant ZIP_EXTRA_HEADER_SIZE => 2 ;
+use constant ZIP_EXTRA_MAX_SIZE => 0xFFFF ;
+use constant ZIP_EXTRA_SUBFIELD_ID_SIZE => 2 ;
+use constant ZIP_EXTRA_SUBFIELD_LEN_SIZE => 2 ;
+use constant ZIP_EXTRA_SUBFIELD_HEADER_SIZE => ZIP_EXTRA_SUBFIELD_ID_SIZE +
+ ZIP_EXTRA_SUBFIELD_LEN_SIZE;
+use constant ZIP_EXTRA_SUBFIELD_MAX_SIZE => ZIP_EXTRA_MAX_SIZE -
+ ZIP_EXTRA_SUBFIELD_HEADER_SIZE;
+
+my %ZIP_CompressionMethods =
+ (
+ 0 => 'Stored',
+ 1 => 'Shrunk',
+ 2 => 'Reduced compression factor 1',
+ 3 => 'Reduced compression factor 2',
+ 4 => 'Reduced compression factor 3',
+ 5 => 'Reduced compression factor 4',
+ 6 => 'Imploded',
+ 7 => 'Reserved for Tokenizing compression algorithm',
+ 8 => 'Deflated',
+ 9 => 'Enhanced Deflating using Deflate64(tm)',
+ 10 => 'PKWARE Data Compression Library Imploding',
+ 11 => 'Reserved by PKWARE',
+ 12 => 'BZIP2 ',
+ 13 => 'Reserved by PKWARE',
+ 14 => 'LZMA',
+ 15 => 'Reserved by PKWARE',
+ 16 => 'Reserved by PKWARE',
+ 17 => 'Reserved by PKWARE',
+ 18 => 'File is compressed using IBM TERSE (new)',
+ 19 => 'IBM LZ77 z Architecture (PFS)',
+ 96 => 'WinZip JPEG Compression',
+ 97 => 'WavPack compressed data',
+ 98 => 'PPMd version I, Rev 1',
+ 99 => 'AES Encryption',
+ );
+
+my %OS_Lookup = (
+ 0 => "MS-DOS",
+ 1 => "Amiga",
+ 2 => "OpenVMS",
+ 3 => "Unix",
+ 4 => "VM/CMS",
+ 5 => "Atari ST",
+ 6 => "HPFS (OS/2, NT 3.x)",
+ 7 => "Macintosh",
+ 8 => "Z-System",
+ 9 => "CP/M",
+ 10 => "Windoxs NTFS or TOPS-20",
+ 11 => "MVS or NTFS",
+ 12 => "VSE or SMS/QDOS",
+ 13 => "Acorn RISC OS",
+ 14 => "VFAT",
+ 15 => "alternate MVS",
+ 16 => "BeOS",
+ 17 => "Tandem",
+ 18 => "OS/400",
+ 19 => "OS/X (Darwin)",
+ 30 => "AtheOS/Syllable",
+ );
+
+
+my %Lookup = (
+ ZIP_LOCAL_HDR_SIG, \&LocalHeader,
+ ZIP_DATA_HDR_SIG, \&DataHeader,
+ ZIP_CENTRAL_HDR_SIG, \&CentralHeader,
+ ZIP_END_CENTRAL_HDR_SIG, \&EndCentralHeader,
+ ZIP64_END_CENTRAL_REC_HDR_SIG, \&Zip64EndCentralHeader,
+ ZIP64_END_CENTRAL_LOC_HDR_SIG, \&Zip64EndCentralLocator,
+
+ # TODO - Archive Encryption Headers
+ #ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG
+);
+
+my %Extras = (
+ 0x0001, ['ZIP64', \&decode_Zip64],
+ 0x0007, ['AV Info', undef],
+ 0x0008, ['Extended Language Encoding', undef],
+ 0x0009, ['OS/2 extended attributes', undef],
+ 0x000a, ['NTFS FileTimes', \&decode_NTFS_Filetimes],
+ 0x000c, ['OpenVMS', undef],
+ 0x000d, ['Unix', undef],
+ 0x000e, ['Stream & Fork Descriptors', undef],
+ 0x000f, ['Patch Descriptor', undef],
+ 0x0014, ['PKCS#7 Store for X.509 Certificates', undef],
+ 0x0015, ['X.509 Certificate ID and Signature for individual file', undef],
+ 0x0016, ['X.509 Certificate ID for Central Directory', undef],
+ 0x0017, ['Strong Encryption Header', undef],
+ 0x0018, ['Record Management Controls', undef],
+ 0x0019, ['PKCS#7 Encryption Recipient Certificate List', undef],
+
+
+ #The Header ID mappings defined by Info-ZIP and third parties are:
+
+ 0x0065, ['IBM S/390 attributes - uncompressed', undef],
+ 0x0066, ['IBM S/390 attributes - compressed', undef],
+ 0x07c8, ['Info-ZIP Macintosh (old, J. Lee)', undef],
+ 0x2605, ['ZipIt Macintosh (first version)', undef],
+ 0x2705, ['ZipIt Macintosh v 1.3.5 and newer (w/o full filename)', undef],
+ 0x2805, ['ZipIt Macintosh v 1.3.5 and newer ', undef],
+ 0x334d, ["Info-ZIP Macintosh (new, D. Haase's 'Mac3' field)", undef],
+ 0x4154, ['Tandem NSK', undef],
+ 0x4341, ['Acorn/SparkFS (David Pilling)', undef],
+ 0x4453, ['Windows NT security descriptor', \&decode_NT_security],
+ 0x4690, ['POSZIP 4690', undef],
+ 0x4704, ['VM/CMS', undef],
+ 0x470f, ['MVS', undef],
+ 0x4854, ['Theos, old inofficial port', undef],
+ 0x4b46, ['FWKCS MD5 (see below)', undef],
+ 0x4c41, ['OS/2 access control list (text ACL)', undef],
+ 0x4d49, ['Info-ZIP OpenVMS (obsolete)', undef],
+ 0x4d63, ['Macintosh SmartZIP, by Macro Bambini', undef],
+ 0x4f4c, ['Xceed original location extra field', undef],
+ 0x5356, ['AOS/VS (binary ACL)', undef],
+ 0x5455, ['Extended Timestamp', \&decode_UT],
+ 0x554e, ['Xceed unicode extra field', \&decode_Xceed_unicode],
+ 0x5855, ['Info-ZIP Unix (original; also OS/2, NT, etc.)', \&decode_UX],
+ 0x5a4c, ['ZipArchive Unicode Filename', undef],
+ 0x5a4d, ['ZipArchive Offsets Array', undef],
+ 0x6375, ["Info-ZIP Unicode Comment", \&decode_up ],
+ 0x6542, ['BeOS (BeBox, PowerMac, etc.)', undef],
+ 0x6854, ['Theos', undef],
+ 0x7075, ["Info-ZIP Unicode Path", \&decode_up ],
+ 0x756e, ['ASi Unix', undef],
+ 0x7441, ['AtheOS (AtheOS/Syllable attributes)', undef],
+ 0x7855, ["Unix Extra type 2", \&decode_Ux],
+ 0x7875, ["Unix Extra Type 3", \&decode_ux],
+ 0x9901, ['AES Encryption', \&decode_AES],
+ 0xA220, ["Microsoft Microsoft Open Packaging Growth Hint", undef ],
+ 0xCAFE, ["Java Executable", \&decode_Java_exe],
+ 0xfb4a, ['SMS/QDOS', undef],
+
+ );
+
+my $VERSION = "1.04" ;
+
+my $FH;
+
+my $ZIP64 = 0 ;
+my $NIBBLES = 8;
+my $LocalHeaderCount = 0;
+my $CentralHeaderCount = 0;
+
+my $START;
+my $OFFSET = new U64 0;
+my $TRAILING = 0 ;
+
+sub prOff
+{
+ my $offset = shift;
+ my $s = offset($OFFSET);
+ $OFFSET->add($offset);
+ return $s;
+}
+
+sub offset
+{
+ my $v = shift ;
+
+ if (ref $v eq 'U64') {
+ my $hi = $v->getHigh();
+ my $lo = $v->getLow();
+
+ if ($hi)
+ {
+ my $hiNib = $NIBBLES - 8 ;
+ sprintf("%0${hiNib}X", $hi) .
+ sprintf("%08X", $lo);
+ }
+ else
+ {
+ sprintf("%0${NIBBLES}X", $lo);
+ }
+ }
+ else {
+ sprintf("%0${NIBBLES}X", $v);
+ }
+
+}
+
+my ($OFF, $LENGTH, $CONTENT, $TEXT, $VALUE) ;
+
+my $FMT1 ;
+my $FMT2 ;
+
+sub setupFormat
+{
+ my $wantVerbose = shift ;
+ my $nibbles = shift;
+
+ my $width = '@' . ('>' x ($nibbles -1));
+ my $space = " " x length($width);
+
+ my $fmt ;
+
+ if ($wantVerbose) {
+
+ $FMT1 = "
+ format STDOUT =
+$width $width ^<<<<<<<<<<<^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF, \$LENGTH, \$CONTENT, \$TEXT, \$VALUE
+$space $space ^<<<<<<<<<<<^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+ \$CONTENT, \$TEXT, \$VALUE
+.
+";
+
+ $FMT2 = "
+ format STDOUT =
+$width $width ^<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF, \$LENGTH, \$CONTENT, \$TEXT, \$VALUE
+$space $space ^<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+ \$CONTENT, \$TEXT, \$VALUE
+. " ;
+
+ }
+ else {
+
+ $FMT1 = "
+ format STDOUT =
+$width ^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF, \$TEXT, \$VALUE
+$space ^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+ \$TEXT, \$VALUE
+.
+";
+
+ $FMT2 = "
+ format STDOUT =
+$width ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF, \$TEXT, \$VALUE
+$space ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+ \$TEXT, \$VALUE
+.
+" ;
+ }
+
+ eval "$FMT1";
+
+ $| = 1;
+
+}
+
+sub mySpr
+{
+ my $format = shift ;
+
+ return "" if ! defined $format;
+ return $format unless @_ ;
+ return sprintf $format, @_ ;
+}
+
+sub out0
+{
+ my $size = shift;
+ my $text = shift;
+ my $format = shift;
+
+ $OFF = prOff($size);
+ $LENGTH = offset($size) ;
+ $CONTENT = '...';
+ $TEXT = $text;
+ $VALUE = mySpr $format, @_;
+
+ write;
+
+ skip($FH, $size);
+}
+
+sub xDump
+{
+ my $input = shift;
+
+ $input =~ tr/\0-\37\177-\377/./;
+ return $input;
+}
+
+sub hexDump
+{
+ my $input = shift;
+
+ my $out = unpack('H*', $input) ;
+ $out =~ s#(..)# $1#g ;
+ $out =~ s/^ //;
+ $out = uc $out;
+
+ return $out;
+}
+
+sub out
+{
+ my $data = shift;
+ my $text = shift;
+ my $format = shift;
+
+ my $size = length($data) ;
+
+ $OFF = prOff($size);
+ $LENGTH = offset($size) ;
+ $CONTENT = hexDump($data);
+ $TEXT = $text;
+ $VALUE = mySpr $format, @_;
+
+ write;
+}
+
+sub out1
+{
+ my $text = shift;
+ my $format = shift;
+
+ $OFF = '';
+ $LENGTH = '' ;
+ $CONTENT = '';
+ $TEXT = $text;
+ $VALUE = mySpr $format, @_;
+
+ write;
+}
+
+sub out2
+{
+ my $data = shift ;
+ my $text = shift ;
+ my $format = shift;
+
+ my $size = length($data) ;
+ $OFF = prOff($size);
+ $LENGTH = offset($size);
+ $CONTENT = hexDump($data);
+ $TEXT = $text;
+ $VALUE = mySpr $format, @_;
+
+ no warnings;
+ eval "$FMT2";
+ write ;
+ eval "$FMT1";
+}
+
+sub Value
+{
+ my $letter = shift;
+ my @value = @_;
+
+ if ($letter eq 'C')
+ { return Value_C(@value) }
+ elsif ($letter eq 'v')
+ { return Value_v(@value) }
+ elsif ($letter eq 'V')
+ { return Value_V(@value) }
+ elsif ($letter eq 'VV')
+ { return Value_VV(@value) }
+}
+
+sub outer
+{
+ my $name = shift ;
+ my $unpack = shift ;
+ my $size = shift ;
+ my $cb1 = shift ;
+ my $cb2 = shift ;
+
+
+ myRead(my $buff, $size);
+ my (@value) = unpack $unpack, $buff;
+ my $hex = Value($unpack, @value);
+
+ if (defined $cb1) {
+ my $v ;
+ if (ref $cb1 eq 'CODE') {
+ $v = $cb1->(@value) ;
+ }
+ else {
+ $v = $cb1 ;
+ }
+
+ $v = "'" . $v unless $v =~ /^'/;
+ $v .= "'" unless $v =~ /'$/;
+ $hex .= " $v" ;
+ }
+
+ out $buff, $name, $hex ;
+
+ $cb2->(@value)
+ if defined $cb2 ;
+
+ return $value[0];
+}
+
+sub out_C
+{
+ my $name = shift ;
+ my $cb1 = shift ;
+ my $cb2 = shift ;
+
+ outer($name, 'C', 1, $cb1, $cb2);
+}
+
+sub out_v
+{
+ my $name = shift ;
+ my $cb1 = shift ;
+ my $cb2 = shift ;
+
+ outer($name, 'v', 2, $cb1, $cb2);
+}
+
+sub out_V
+{
+ my $name = shift ;
+ my $cb1 = shift ;
+ my $cb2 = shift ;
+
+ outer($name, 'V', 4, $cb1, $cb2);
+}
+
+sub out_VV
+{
+ my $name = shift ;
+ my $cb1 = shift ;
+ my $cb2 = shift ;
+
+ outer($name, 'VV', 8, $cb1, $cb2);
+}
+
+sub outSomeData
+{
+ my $size = shift;
+ my $message = shift;
+
+ my $size32 = $size;
+ if (ref $size eq 'U64') {
+ $size32 = $size->getLow();
+ }
+
+ if ($size > 0) {
+ if ($size > 64) {
+ out0 $size, $message;
+ } else {
+ myRead(my $buffer, $size32 );
+ out $buffer, $message, xDump $buffer ;
+ }
+ }
+}
+
+sub unpackValue_C
+{
+ Value_v(unpack "C", $_[0]);
+}
+
+sub Value_C
+{
+ sprintf "%02X", $_[0];
+}
+
+
+sub unpackValue_v
+{
+ Value_v(unpack "v", $_[0]);
+}
+
+sub Value_v
+{
+ sprintf "%04X", $_[0];
+}
+
+sub unpackValue_V
+{
+ Value_V(unpack "V", $_[0]);
+}
+
+sub Value_V
+{
+ my $v = defined $_[0] ? $_[0] : 0;
+ sprintf "%08X", $v;
+}
+
+sub unpackValue_VV
+{
+ my ($lo, $hi) = unpack ("V V", $_[0]);
+ Value_VV($lo, $hi);
+}
+
+sub Value_U64
+{
+ my $u64 = shift ;
+ Value_VV($u64->getLow(), $u64->getHigh());
+}
+
+sub Value_VV
+{
+ my $lo = defined $_[0] ? $_[0] : 0;
+ my $hi = defined $_[1] ? $_[1] : 0;
+
+ if ($hi == 0)
+ {
+ sprintf "%016X", $lo;
+ }
+ else
+ {
+ sprintf("%08X", $hi) .
+ sprintf "%08X", $lo;
+ }
+}
+
+sub Value_VV64
+{
+ my $buffer = shift;
+
+ my ($lo, $hi) = unpack ("V V" , $buffer);
+ no warnings 'uninitialized';
+ return $hi * (0xFFFFFFFF+1) + $lo;
+}
+
+sub read_U64
+{
+ my $b ;
+ myRead($b, 8);
+ my ($lo, $hi) = unpack ("V V" , $b);
+ no warnings 'uninitialized';
+ return ($b, new U64 $hi, $lo);
+}
+
+sub read_VV
+{
+ my $b ;
+ myRead($b, 8);
+ my ($lo, $hi) = unpack ("V V" , $b);
+ no warnings 'uninitialized';
+ return ($b, $hi * (0xFFFFFFFF+1) + $lo);
+}
+
+sub read_V
+{
+ my $b ;
+ myRead($b, 4);
+ return ($b, unpack ("V", $b));
+}
+
+sub read_v
+{
+ my $b ;
+ myRead($b, 2);
+ return ($b, unpack "v", $b);
+}
+
+
+sub read_C
+{
+ my $b ;
+ myRead($b, 1);
+ return ($b, unpack "C", $b);
+}
+
+
+my $opt_verbose = 0;
+while (@ARGV && $ARGV[0] =~ /^-/)
+{
+ my $opt = shift;
+
+ if ($opt =~ /^-h/i)
+ {
+ Usage();
+ exit;
+ }
+ elsif ($opt =~ /^-v/i)
+ {
+ $opt_verbose = 1;
+ }
+ else {
+ Usage();
+ }
+}
+
+Usage() unless @ARGV == 1;
+
+my $filename = shift @ARGV;
+
+die "$filename does not exist\n"
+ unless -e $filename ;
+
+die "$filename not a standard file\n"
+ unless -f $filename ;
+
+$FH = new IO::File "<$filename"
+ or die "Cannot open $filename: $!\n";
+
+
+my $FILELEN = -s $filename ;
+$TRAILING = -s $filename ;
+$NIBBLES = U64::nibbles(-s $filename) ;
+#$NIBBLES = int ($NIBBLES / 4) + ( ($NIBBLES % 4) ? 1 : 0 );
+#$NIBBLES = 4 * $NIBBLES;
+# Minimum of 4 nibbles
+$NIBBLES = 4 if $NIBBLES < 4 ;
+
+die "$filename too short to be a zip file\n"
+ if $FILELEN < 100 ;
+
+setupFormat($opt_verbose, $NIBBLES);
+
+if(0)
+{
+ # Sanity check that this is a Zip file
+ my ($buffer, $signature) = read_V();
+
+ warn "$filename doesn't look like a zip file\n"
+ if $signature != ZIP_LOCAL_HDR_SIG ;
+ $FH->seek(0, SEEK_SET) ;
+}
+
+
+our @CentralDirectory = scanCentralDirectory($FH);
+die "No Central Directory found\n"
+ if ! @CentralDirectory ;
+
+$OFFSET->reset();
+$FH->seek(0, SEEK_SET) ;
+
+outSomeData($START, "PREFIX DATA")
+ if defined $START && $START > 0 ;
+
+while (1)
+{
+ last if $FH->eof();
+
+ if ($FH->tell() >= $TRAILING) {
+ print "\n" ;
+ outSomeData($FILELEN - $TRAILING, "TRAILING DATA");
+ last;
+
+ }
+
+ my ($buffer, $signature) = read_V();
+
+ my $handler = $Lookup{$signature};
+
+ if (!defined $handler)
+ {
+ my $offset = $FH->tell() - 4;
+ printf "\n\nUnexpecded END at offset %08X, value %s\n", $offset, Value_V($signature);
+ last;
+ }
+
+ $ZIP64 = 0 if $signature != ZIP_DATA_HDR_SIG ;
+ $handler->($signature, $buffer);
+}
+
+print "Done\n";
+
+exit ;
+
+sub compressionMethod
+{
+ my $id = shift ;
+ Value_v($id) . " '" . ($ZIP_CompressionMethods{$id} || "Unknown Method") . "'" ;
+}
+
+sub LocalHeader
+{
+ my $signature = shift ;
+ my $data = shift ;
+
+ print "\n";
+ ++ $LocalHeaderCount;
+ out $data, "LOCAL HEADER #" . sprintf("%X", $LocalHeaderCount) , Value_V($signature);
+
+ my $buffer;
+
+ my ($loc, $CDcompressedLength) = @{ shift @CentralDirectory };
+ # TODO - add test to check that the loc from central header matches
+
+ out_C "Extract Zip Spec", \&decodeZipVer;
+ out_C "Extract OS", \&decodeOS;
+
+ my ($bgp, $gpFlag) = read_v();
+ my ($bcm, $compressedMethod) = read_v();
+
+ out $bgp, "General Purpose Flag", Value_v($gpFlag) ;
+ GeneralPurposeBits($compressedMethod, $gpFlag);
+
+ out $bcm, "Compression Method", compressionMethod($compressedMethod) ;
+
+ out_V "Last Mod Time", sub { scalar getTime(_dosToUnixTime($_[0])) };
+
+ my $crc = out_V "CRC";
+ my $compressedLength = out_V "Compressed Length";
+ my $uncompressedLength = out_V "Uncompressed Length";
+ my $filenameLength = out_v "Filename Length";
+ my $extraLength = out_v "Extra Length";
+
+ my $filename ;
+ myRead($filename, $filenameLength);
+ out $filename, "Filename", "'". $filename . "'";
+
+ my $cl64 = new U64 $compressedLength ;
+ my %ExtraContext = ();
+ if ($extraLength)
+ {
+ my @z64 = ($uncompressedLength, $compressedLength, 1, 1);
+ $ExtraContext{Zip64} = \@z64 ;
+ $ExtraContext{InCentralDir} = 0;
+ walkExtra($extraLength, \%ExtraContext);
+ }
+
+ my $size = 0;
+ $size = printAes(\%ExtraContext)
+ if $compressedMethod == 99 ;
+
+ $size += printLzmaProperties()
+ if $compressedMethod == ZIP_CM_LZMA ;
+
+ $CDcompressedLength->subtract($size)
+ if $size ;
+
+ if ($CDcompressedLength->getHigh() || $CDcompressedLength->getLow()) {
+ outSomeData($CDcompressedLength, "PAYLOAD") ;
+ }
+
+ if ($compressedMethod == 99) {
+ my $auth ;
+ myRead($auth, 10);
+ out $auth, "AES Auth", hexDump($auth);
+ }
+}
+
+
+sub CentralHeader
+{
+ my $signature = shift ;
+ my $data = shift ;
+
+ ++ $CentralHeaderCount;
+ print "\n";
+ out $data, "CENTRAL HEADER #" . sprintf("%X", $CentralHeaderCount) . "", Value_V($signature);
+ my $buffer;
+
+ out_C "Created Zip Spec", \&decodeZipVer;
+ out_C "Created OS", \&decodeOS;
+ out_C "Extract Zip Spec", \&decodeZipVer;
+ out_C "Extract OS", \&decodeOS;
+
+ my ($bgp, $gpFlag) = read_v();
+ my ($bcm, $compressedMethod) = read_v();
+
+ out $bgp, "General Purpose Flag", Value_v($gpFlag) ;
+ GeneralPurposeBits($compressedMethod, $gpFlag);
+
+ out $bcm, "Compression Method", compressionMethod($compressedMethod) ;
+
+ out_V "Last Mod Time", sub { scalar getTime(_dosToUnixTime($_[0])) };
+
+ my $crc = out_V "CRC";
+ my $compressedLength = out_V "Compressed Length";
+ my $uncompressedLength = out_V "Uncompressed Length";
+ my $filenameLength = out_v "Filename Length";
+ my $extraLength = out_v "Extra Length";
+ my $comment_length = out_v "Comment Length";
+ my $disk_start = out_v "Disk Start";
+ my $int_file_attrib = out_v "Int File Attributes";
+
+ out1 "[Bit 0]", $int_file_attrib & 1 ? "1 Text Data" : "0 'Binary Data'";
+
+ my $ext_file_attrib = out_V "Ext File Attributes";
+ out1 "[Bit 0]", "Read-Only"
+ if $ext_file_attrib & 0x01 ;
+ out1 "[Bit 1]", "Hidden"
+ if $ext_file_attrib & 0x02 ;
+ out1 "[Bit 2]", "System"
+ if $ext_file_attrib & 0x04 ;
+ out1 "[Bit 3]", "Label"
+ if $ext_file_attrib & 0x08 ;
+ out1 "[Bit 4]", "Directory"
+ if $ext_file_attrib & 0x10 ;
+ out1 "[Bit 5]", "Archive"
+ if $ext_file_attrib & 0x20 ;
+
+ my $lcl_hdr_offset = out_V "Local Header Offset";
+
+ my $filename ;
+ myRead($filename, $filenameLength);
+ out $filename, "Filename", "'". $filename . "'";
+
+ my %ExtraContext = ();
+ if ($extraLength)
+ {
+ my @z64 = ($uncompressedLength, $compressedLength, $lcl_hdr_offset, $disk_start);
+ $ExtraContext{Zip64} = \@z64 ;
+ $ExtraContext{InCentralDir} = 1;
+ walkExtra($extraLength, \%ExtraContext);
+ }
+
+ if ($comment_length)
+ {
+ my $comment ;
+ myRead($comment, $comment_length);
+ out $comment, "Comment", "'". $comment . "'";
+ }
+}
+
+sub decodeZipVer
+{
+ my $ver = shift ;
+
+ my $sHi = int($ver /10) ;
+ my $sLo = $ver % 10 ;
+
+ #out1 "Zip Spec", "$sHi.$sLo";
+ "$sHi.$sLo";
+}
+
+sub decodeOS
+{
+ my $ver = shift ;
+
+ $OS_Lookup{$ver} || "Unknown" ;
+}
+
+sub Zip64EndCentralHeader
+{
+ my $signature = shift ;
+ my $data = shift ;
+
+ print "\n";
+ out $data, "ZIP64 END CENTRAL DIR RECORD", Value_V($signature);
+
+ my $buff;
+ myRead($buff, 8);
+
+ out $buff, "Size of record", unpackValue_VV($buff);
+
+ my $size = Value_VV64($buff);
+
+ out_C "Created Zip Spec", \&decodeZipVer;
+ out_C "Created OS", \&decodeOS;
+ out_C "Extract Zip Spec", \&decodeZipVer;
+ out_C "Extract OS", \&decodeOS;
+ out_V "Number of this disk";
+ out_V "Central Dir Disk no";
+ out_VV "Entries in this disk";
+ out_VV "Total Entries";
+ out_VV "Size of Central Dir";
+ out_VV "Offset to Central dir";
+
+ # TODO -
+ die "Unsupported Size ($size) in Zip64EndCentralHeader\n"
+ if $size != 44;
+}
+
+
+sub Zip64EndCentralLocator
+{
+ my $signature = shift ;
+ my $data = shift ;
+
+ print "\n";
+ out $data, "ZIP64 END CENTRAL DIR LOCATOR", Value_V($signature);
+
+ out_V "Central Dir Disk no";
+ out_VV "Offset to Central dir";
+ out_V "Total no of Disks";
+}
+
+sub EndCentralHeader
+{
+ my $signature = shift ;
+ my $data = shift ;
+
+ print "\n";
+ out $data, "END CENTRAL HEADER", Value_V($signature);
+
+ out_v "Number of this disk";
+ out_v "Central Dir Disk no";
+ out_v "Entries in this disk";
+ out_v "Total Entries";
+ out_V "Size of Central Dir";
+ out_V "Offset to Central Dir";
+ my $comment_length = out_v "Comment Length";
+
+ if ($comment_length)
+ {
+ my $comment ;
+ myRead($comment, $comment_length);
+ out $comment, "Comment", "'$comment'";
+ }
+}
+
+sub DataHeader
+{
+ my $signature = shift ;
+ my $data = shift ;
+
+ print "\n";
+ out $data, "STREAMING DATA HEADER", Value_V($signature);
+
+ out_V "CRC";
+
+ if ($ZIP64)
+ {
+ out_VV "Compressed Length" ;
+ out_VV "Uncompressed Length" ;
+ }
+ else
+ {
+ out_V "Compressed Length" ;
+ out_V "Uncompressed Length" ;
+ }
+}
+
+
+sub GeneralPurposeBits
+{
+ my $method = shift;
+ my $gp = shift;
+
+ out1 "[Bit 0]", "1 'Encryption'" if $gp & ZIP_GP_FLAG_ENCRYPTED_MASK;
+
+ my %lookup = (
+ 0 => "Normal Compression",
+ 1 => "Maximum Compression",
+ 2 => "Fast Compression",
+ 3 => "Super Fast Compression");
+
+
+ if ($method == ZIP_CM_DEFLATE)
+ {
+ my $mid = $gp & 0x03;
+
+ out1 "[Bits 1-2]", "$mid '$lookup{$mid}'";
+ }
+
+ if ($method == ZIP_CM_LZMA)
+ {
+ if ($gp & ZIP_GP_FLAG_LZMA_EOS_PRESENT) {
+ out1 "[Bit 1]", "1 'LZMA EOS Marker Present'" ;
+ }
+ else {
+ out1 "[Bit 1]", "0 'LZMA EOS Marker Not Present'" ;
+ }
+ }
+
+ if ($method == ZIP_CM_IMPLODE) # Imploding
+ {
+ out1 "[Bit 1]", ($gp & 1 ? "1 '8k" : "0 '4k") . " Sliding Dictionary'" ;
+ out1 "[Bit 2]", ($gp & 2 ? "1 '3" : "0 '2" ) . " Shannon-Fano
+ Trees'" ;
+ }
+
+ out1 "[Bit 3]", "1 'Streamed'" if $gp & ZIP_GP_FLAG_STREAMING_MASK;
+ out1 "[Bit 4]", "1 'Enhanced Deflating'" if $gp & 1 << 4;
+ out1 "[Bit 5]", "1 'Compressed Patched'" if $gp & 1 << 5 ;
+ out1 "[Bit 6]", "1 'Strong Encryption'" if $gp & ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK;
+ out1 "[Bit 11]", "1 'Language Encoding'" if $gp & ZIP_GP_FLAG_LANGUAGE_ENCODING;
+ out1 "[Bit 12]", "1 'Pkware Enhanced Compression'" if $gp & 1 <<12 ;
+ out1 "[Bit 13]", "1 'Encrypted Central Dir'" if $gp & 1 <<13 ;
+
+ return ();
+}
+
+
+
+
+sub skip
+{
+ my $fh = $_[0] ;
+ my $size = $_[1];
+
+ use Fcntl qw(SEEK_CUR);
+ if (ref $size eq 'U64') {
+ seek($fh, $size->get64bit(), SEEK_CUR);
+ }
+ else {
+ seek($fh, $size, SEEK_CUR);
+ }
+
+}
+
+
+sub myRead
+{
+ my $got = \$_[0] ;
+ my $size = $_[1];
+
+ my $wantSize = $size;
+ $$got = '';
+
+ if ($size == 0)
+ {
+ return ;
+ }
+
+ if ($size > 0)
+ {
+ my $buff ;
+ my $status = $FH->read($buff, $size);
+ return $status
+ if $status < 0;
+ $$got .= $buff ;
+ }
+
+ my $len = length $$got;
+ die "Truncated file (got $len, wanted $wantSize): $!\n"
+ if length $$got != $wantSize;
+}
+
+
+
+
+sub walkExtra
+{
+ my $XLEN = shift;
+ my $context = shift;
+
+ my $buff ;
+ my $offset = 0 ;
+
+ my $id;
+ my $subLen;
+ my $payload ;
+
+ my $count = 0 ;
+
+ while ($offset < $XLEN) {
+
+ ++ $count;
+
+ return undef
+ if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE > $XLEN ;
+
+ myRead($id, ZIP_EXTRA_SUBFIELD_ID_SIZE);
+ $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE;
+ my $lookID = unpack "v", $id ;
+ my ($who, $decoder) = @{ defined $Extras{$lookID} ? $Extras{$lookID} : ['', undef] };
+ #my ($who, $decoder) = @{ $Extras{unpack "v", $id} || ['', undef] };
+
+ $who = "$id: $who"
+ if $id =~ /\w\w/ ;
+
+ $who = "'$who'";
+ out $id, "Extra ID #" . Value_v($count), unpackValue_v($id) . " $who" ;
+
+ myRead($buff, ZIP_EXTRA_SUBFIELD_LEN_SIZE);
+ $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE;
+
+ $subLen = unpack("v", $buff);
+ out2 $buff, "Length", Value_v($subLen) ;
+
+ return undef
+ if $offset + $subLen > $XLEN ;
+
+ if (! defined $decoder)
+ {
+ myRead($payload, $subLen);
+ my $data = hexDump($payload);
+
+ out2 $payload, "Extra Payload", $data;
+ }
+ else
+ {
+ $decoder->($subLen, $context) ;
+ }
+
+ $offset += $subLen ;
+ }
+
+ return undef ;
+}
+
+
+sub full32
+{
+ return $_[0] == 0xFFFFFFFF ;
+}
+
+sub decode_Zip64
+{
+ my $len = shift;
+ my $context = shift;
+
+ my $z64Data = $context->{Zip64};
+
+ $ZIP64 = 1;
+
+ if (full32 $z64Data->[0] ) {
+ out_VV " Uncompressed Size";
+ }
+
+ if (full32 $z64Data->[1] ) {
+ out_VV " Compressed Size";
+ }
+
+ if (full32 $z64Data->[2] ) {
+ out_VV " Offset to Central Dir";
+ }
+
+ if ($z64Data->[3] == 0xFFFF ) {
+ out_V " Disk Number";
+ }
+}
+
+sub Ntfs2Unix
+{
+ my $v = shift;
+ my $u64 = shift;
+
+ # NTFS offset is 19DB1DED53E8000
+
+ my $hex = Value_U64($u64) ;
+ my $NTFS_OFFSET = new U64 0x19DB1DE, 0xD53E8000 ;
+ $u64->subtract($NTFS_OFFSET);
+ my $elapse = $u64->get64bit();
+ my $ns = ($elapse % 10000000) * 100;
+ $elapse = int ($elapse/10000000);
+ return "$hex '" . localtime($elapse) .
+ " " . sprintf("%0dns'", $ns);
+}
+
+sub decode_NTFS_Filetimes
+{
+ my $len = shift;
+ my $context = shift;
+
+ out_V " Reserved";
+ out_v " Tag1";
+ out_v " Size1" ;
+
+ my ($m, $s1) = read_U64;
+ out $m, " Mtime", Ntfs2Unix($m, $s1);
+
+ my ($c, $s2) = read_U64;
+ out $c, " Ctime", Ntfs2Unix($m, $s2);
+
+ my ($a, $s3) = read_U64;
+ out $m, " Atime", Ntfs2Unix($m, $s3);
+}
+
+sub getTime
+{
+ my $time = shift ;
+
+ return "'" . localtime($time) . "'" ;
+}
+
+sub decode_UT
+{
+ my $len = shift;
+ my $context = shift;
+
+ my ($data, $flags) = read_C();
+
+ my $f = Value_C $flags;
+ $f .= " mod" if $flags & 1;
+ $f .= " access" if $flags & 2;
+ $f .= " change" if $flags & 4;
+
+ out $data, " Flags", "'$f'";
+
+ -- $len;
+
+ if ($flags & 1)
+ {
+ my ($data, $time) = read_V();
+
+ out2 $data, "Mod Time", Value_V($time) . " " . getTime($time) ;
+
+ $len -= 4 ;
+ }
+
+
+ if ($flags & 2 && $len > 0 )
+ {
+ my ($data, $time) = read_V();
+
+ out2 $data, "Access Time", Value_V($time) . " " . getTime($time) ;
+ $len -= 4 ;
+ }
+
+ if ($flags & 4 && $len > 0)
+ {
+ my ($data, $time) = read_V();
+
+ out2 $data, "Change Time", Value_V($time) . " " . getTime($time) ;
+ }
+}
+
+
+
+sub decode_AES
+{
+ my $len = shift;
+ my $context = shift;
+
+ return if $len == 0 ;
+
+ my %lookup = ( 1 => "AE-1", 2 => "AE-2");
+ out_v " Vendor Version", sub { $lookup{$_[0]} || "Unknown" } ;
+
+ my $id ;
+ myRead($id, 2);
+ out $id, " Vendor ID", unpackValue_v($id) . " '$id'";
+
+ my %strengths = (1 => "128-bit encryption key",
+ 2 => "192-bit encryption key",
+ 3 => "256-bit encryption key",
+ );
+
+ my $strength = out_C " Encryption Strength", sub {$strengths{$_[0]} || "Unknown" } ;
+
+ my ($bmethod, $method) = read_v();
+ out $bmethod, " Compression Method", compressionMethod($method) ;
+
+ $context->{AesStrength} = $strength ;
+}
+
+sub decode_UX
+{
+ my $len = shift;
+ my $context = shift;
+ my $inCentralHdr = $context->{InCentralDir} ;
+
+ return if $len == 0 ;
+
+ my ($data, $time) = read_V();
+ out2 $data, "Access Time", Value_V($time) . " " . getTime($time) ;
+
+ ($data, $time) = read_V();
+ out2 $data, "Mod Time", Value_V($time) . " " . getTime($time) ;
+
+ if (! $inCentralHdr ) {
+ out_v " UID" ;
+ out_v " GID";
+ }
+}
+
+sub decode_Ux
+{
+ my $len = shift;
+ my $context = shift;
+
+ return if $len == 0 ;
+ out_v " UID" ;
+ out_v " GID";
+}
+
+sub decodeLitteEndian
+{
+ my $value = shift ;
+
+ if (length $value == 4)
+ {
+ return Value_V unpack ("V", $value)
+ }
+ else {
+ # TODO - fix this
+ die "unsupported\n";
+ }
+
+ my $got = 0 ;
+ my $shift = 0;
+
+ #hexDump
+ #reverse
+ #my @a =unpack "C*", $value;
+ #@a = reverse @a;
+ #hexDump(@a);
+
+ for (reverse unpack "C*", $value)
+ {
+ $got = ($got << 8) + $_ ;
+ }
+
+ return $got ;
+}
+
+sub decode_ux
+{
+ my $len = shift;
+ my $context = shift;
+
+ return if $len == 0 ;
+ out_C " Version" ;
+ my $uidSize = out_C " UID Size";
+ myRead(my $data, $uidSize);
+ out2 $data, "UID", decodeLitteEndian($data);
+
+ my $gidSize = out_C " GID Size";
+ myRead($data, $gidSize);
+ out2 $data, "GID", decodeLitteEndian($data);
+
+}
+
+sub decode_Java_exe
+{
+ my $len = shift;
+ my $context = shift;
+
+}
+
+sub decode_up
+{
+ my $len = shift;
+ my $context = shift;
+
+
+ out_C " Version";
+ out_V " NameCRC32";
+
+ myRead(my $data, $len - 5);
+
+ out $data, " UnicodeName", $data;
+}
+
+sub decode_Xceed_unicode
+{
+ my $len = shift;
+ my $context = shift;
+
+ my $data ;
+
+ # guess the fields used for this one
+ myRead($data, 4);
+ out $data, " ID", $data;
+
+ out_v " Length";
+ out_v " Null";
+
+ myRead($data, $len - 8);
+
+ out $data, " UTF16LE Name", decode("UTF16LE", $data);
+}
+
+
+sub decode_NT_security
+{
+ my $len = shift;
+ my $context = shift;
+ my $inCentralHdr = $context->{InCentralDir} ;
+
+ out_V " Uncompressed Size" ;
+
+ if (! $inCentralHdr) {
+
+ out_C " Version" ;
+
+ out_v " Type";
+
+ out_V " NameCRC32" ;
+
+ my $plen = $len - 4 - 1 - 2 - 4;
+ myRead(my $payload, $plen);
+ out $plen, " Extra Payload", hexDump($payload);
+ }
+}
+
+sub printAes
+{
+ my $context = shift ;
+
+ my %saltSize = (
+ 1 => 8,
+ 2 => 12,
+ 3 => 16,
+ );
+
+ myRead(my $salt, $saltSize{$context->{AesStrength} });
+ out $salt, "AES Salt", hexDump($salt);
+ myRead(my $pwv, 2);
+ out $pwv, "AES Pwd Ver", hexDump($pwv);
+
+ return $saltSize{$context->{AesStrength}} + 2 + 10;
+}
+
+sub printLzmaProperties
+{
+ my $len = 0;
+
+ my $b1;
+ my $b2;
+ my $buffer;
+
+ myRead($b1, 2);
+ my ($verHi, $verLow) = unpack ("CC", $b1);
+
+ out $b1, "LZMA Version", sprintf("%02X%02X", $verHi, $verLow) . " '$verHi.$verLow'";
+ my $LzmaPropertiesSize = out_v "LZMA Properties Size";
+ $len += 4;
+
+ my $LzmaInfo = out_C "LZMA Info", sub { $_[0] == 93 ? "(Default)" : ""};
+
+ my $PosStateBits = 0;
+ my $LiteralPosStateBits = 0;
+ my $LiteralContextBits = 0;
+ $PosStateBits = int($LzmaInfo / (9 * 5));
+ $LzmaInfo -= $PosStateBits * 9 * 5;
+ $LiteralPosStateBits = int($LzmaInfo / 9);
+ $LiteralContextBits = $LzmaInfo - $LiteralPosStateBits * 9;
+
+ out1 " PosStateBits", $PosStateBits;
+ out1 " LiteralPosStateBits", $LiteralPosStateBits;
+ out1 " LiteralContextBits", $LiteralContextBits;
+
+ out_V "LZMA Dictionary Size";
+
+ # TODO - assumption that this is 5
+ $len += $LzmaPropertiesSize;
+
+ skip($FH, $LzmaPropertiesSize - 5)
+ if $LzmaPropertiesSize != 5 ;
+
+ return $len;
+}
+
+sub scanCentralDirectory
+{
+ my $fh = shift;
+
+ my $here = $fh->tell();
+
+ # Use cases
+ # 1 32-bit CD
+ # 2 64-bit CD
+
+ my @CD = ();
+ my $offset = findCentralDirectoryOffset($fh);
+
+ return ()
+ if ! defined $offset;
+
+ $fh->seek($offset, SEEK_SET) ;
+
+ # Now walk the Central Directory Records
+ my $buffer ;
+ while ($fh->read($buffer, 46) == 46 &&
+ unpack("V", $buffer) == ZIP_CENTRAL_HDR_SIG) {
+
+ my $compressedLength = unpack("V", substr($buffer, 20, 4));
+ my $uncompressedLength = unpack("V", substr($buffer, 24, 4));
+ my $filename_length = unpack("v", substr($buffer, 28, 2));
+ my $extra_length = unpack("v", substr($buffer, 30, 2));
+ my $comment_length = unpack("v", substr($buffer, 32, 2));
+ my $locHeaderOffset = unpack("V", substr($buffer, 42, 4));
+
+ $START = $locHeaderOffset
+ if ! defined $START;
+
+ skip($fh, $filename_length ) ;
+
+ my $v64 = new U64 $compressedLength ;
+ my $loc64 = new U64 $locHeaderOffset ;
+ my $got = [$loc64, $v64] ;
+
+ if (full32 $compressedLength || full32 $locHeaderOffset) {
+ $fh->read($buffer, $extra_length) ;
+ # TODO - fix this
+ die "xxx $offset $comment_length $filename_length $extra_length" . length($buffer)
+ if length($buffer) != $extra_length;
+ $got = get64Extra($buffer, full32($uncompressedLength),
+ $v64,
+ $loc64);
+
+ # If not Zip64 extra field, assume size is 0xFFFFFFFF
+ #$v64 = $got if defined $got;
+ }
+ else {
+ skip($fh, $extra_length) ;
+ }
+
+ skip($fh, $comment_length ) ;
+
+ push @CD, $got ;
+ }
+
+ $fh->seek($here, SEEK_SET) ;
+
+ @CD = sort { $a->[0]->cmp($b->[0]) } @CD ;
+ return @CD;
+}
+
+sub get64Extra
+{
+ my $buffer = shift;
+ my $is_uncomp = shift ;
+ my $comp = shift ;
+ my $loc = shift ;
+
+ my $extra = findID(0x0001, $buffer);
+
+ if ( defined $extra)
+ {
+ my $offset = 0;
+ $offset += 8 if $is_uncomp;
+ if ($comp->max32()) {
+ $comp = U64::newUnpack_V64(substr($extra, $offset)) ;
+ $offset += 8;
+ }
+ if ($loc->max32()) {
+ $loc = U64::newUnpack_V64(substr($extra, $offset)) ;
+ }
+ }
+
+ return [$loc, $comp] ;
+}
+
+sub offsetFromZip64
+{
+ my $fh = shift ;
+ my $here = shift;
+
+ $fh->seek($here - 20, SEEK_SET)
+ # TODO - fix this
+ or die "xx $!" ;
+
+ my $buffer;
+ my $got = 0;
+ ($got = $fh->read($buffer, 20)) == 20
+ # TODO - fix this
+ or die "xxx $here $got $!" ;
+
+ if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_LOC_HDR_SIG ) {
+ my $cd64 = Value_VV64 substr($buffer, 8, 8);
+
+ $fh->seek($cd64, SEEK_SET) ;
+
+ $fh->read($buffer, 4) == 4
+ # TODO - fix this
+ or die "xxx" ;
+
+ if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_REC_HDR_SIG ) {
+
+ $fh->read($buffer, 8) == 8
+ # TODO - fix this
+ or die "xxx" ;
+ my $size = Value_VV64($buffer);
+ $fh->read($buffer, $size) == $size
+ # TODO - fix this
+ or die "xxx" ;
+
+ my $cd64 = Value_VV64 substr($buffer, 36, 8);
+
+ return $cd64 ;
+ }
+
+ # TODO - fix this
+ die "zzz";
+ }
+
+ # TODO - fix this
+ die "zzz";
+}
+
+use constant Pack_ZIP_END_CENTRAL_HDR_SIG => pack("V", ZIP_END_CENTRAL_HDR_SIG);
+
+sub findCentralDirectoryOffset
+{
+ my $fh = shift ;
+
+ # Most common use-case is where there is no comment, so
+ # know exactly where the end of central directory record
+ # should be.
+
+ $fh->seek(-22, SEEK_END) ;
+ my $here = $fh->tell();
+
+ my $buffer;
+ $fh->read($buffer, 22) == 22
+ # TODO - fix this
+ or die "xxx" ;
+
+ my $zip64 = 0;
+ my $centralDirOffset ;
+ if ( unpack("V", $buffer) == ZIP_END_CENTRAL_HDR_SIG ) {
+ $centralDirOffset = unpack("V", substr($buffer, 16, 4));
+ }
+ else {
+ $fh->seek(0, SEEK_END) ;
+
+ my $fileLen = $fh->tell();
+ my $want = 0 ;
+
+ while(1) {
+ $want += 1024 * 32;
+ my $seekTo = $fileLen - $want;
+ if ($seekTo < 0 ) {
+ $seekTo = 0;
+ $want = $fileLen ;
+ }
+ $fh->seek( $seekTo, SEEK_SET)
+ # TODO - fix this
+ or die "xxx $!" ;
+ my $got;
+ ($got = $fh->read($buffer, $want)) == $want
+ # TODO - fix this
+ or die "xxx $got $!" ;
+ my $pos = rindex( $buffer, Pack_ZIP_END_CENTRAL_HDR_SIG);
+
+ if ($pos >= 0 && $want - $pos > 22) {
+ $here = $seekTo + $pos ;
+ $centralDirOffset = unpack("V", substr($buffer, $pos + 16, 4));
+ my $commentLength = unpack("V", substr($buffer, $pos + 20, 2));
+ $commentLength = 0 if ! defined $commentLength ;
+
+ my $expectedEof = $fileLen - $want + $pos + 22 + $commentLength ;
+ # check for trailing data after end of zip
+ if ($expectedEof < $fileLen ) {
+ $TRAILING = $expectedEof ;
+ }
+ last ;
+ }
+
+ return undef
+ if $want == $fileLen;
+ }
+ }
+
+ $centralDirOffset = offsetFromZip64($fh, $here)
+ if full32 $centralDirOffset ;
+
+ return $centralDirOffset ;
+}
+
+sub findID
+{
+ my $id_want = shift ;
+ my $data = shift;
+
+ my $XLEN = length $data ;
+
+ my $offset = 0 ;
+ while ($offset < $XLEN) {
+
+ return undef
+ if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE > $XLEN ;
+
+ my $id = substr($data, $offset, ZIP_EXTRA_SUBFIELD_ID_SIZE);
+ $id = unpack("v", $id);
+ $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE;
+
+ my $subLen = unpack("v", substr($data, $offset,
+ ZIP_EXTRA_SUBFIELD_LEN_SIZE));
+ $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE ;
+
+ return undef
+ if $offset + $subLen > $XLEN ;
+
+ return substr($data, $offset, $subLen)
+ if $id eq $id_want ;
+
+ $offset += $subLen ;
+ }
+
+ return undef ;
+}
+
+
+sub _dosToUnixTime
+{
+ my $dt = shift;
+
+ my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
+ my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1;
+ my $mday = ( ( $dt >> 16 ) & 0x1f );
+
+ my $hour = ( ( $dt >> 11 ) & 0x1f );
+ my $min = ( ( $dt >> 5 ) & 0x3f );
+ my $sec = ( ( $dt << 1 ) & 0x3e );
+
+
+ use POSIX 'mktime';
+
+ my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
+ return 0 if ! defined $time_t;
+ return $time_t;
+}
+
+
+{
+ package U64;
+
+ use constant MAX32 => 0xFFFFFFFF ;
+ use constant HI_1 => MAX32 + 1 ;
+ use constant LOW => 0 ;
+ use constant HIGH => 1;
+
+ sub new
+ {
+ my $class = shift ;
+
+ my $high = 0 ;
+ my $low = 0 ;
+
+ if (@_ == 2) {
+ $high = shift ;
+ $low = shift ;
+ }
+ elsif (@_ == 1) {
+ $low = shift ;
+ }
+
+ bless [$low, $high], $class;
+ }
+
+ sub newUnpack_V64
+ {
+ my $string = shift;
+
+ my ($low, $hi) = unpack "V V", $string ;
+ bless [ $low, $hi ], "U64";
+ }
+
+ sub newUnpack_V32
+ {
+ my $string = shift;
+
+ my $low = unpack "V", $string ;
+ bless [ $low, 0 ], "U64";
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ $self->[HIGH] = $self->[LOW] = 0;
+ }
+
+ sub clone
+ {
+ my $self = shift;
+ bless [ @$self ], ref $self ;
+ }
+
+ sub getHigh
+ {
+ my $self = shift;
+ return $self->[HIGH];
+ }
+
+ sub getLow
+ {
+ my $self = shift;
+ return $self->[LOW];
+ }
+
+ sub get32bit
+ {
+ my $self = shift;
+ return $self->[LOW];
+ }
+
+ sub get64bit
+ {
+ my $self = shift;
+ # Not using << here because the result will still be
+ # a 32-bit value on systems where int size is 32-bits
+ return $self->[HIGH] * HI_1 + $self->[LOW];
+ }
+
+ sub add
+ {
+ my $self = shift;
+ my $value = shift;
+
+ if (ref $value eq 'U64') {
+ $self->[HIGH] += $value->[HIGH] ;
+ $value = $value->[LOW];
+ }
+
+ my $available = MAX32 - $self->[LOW] ;
+
+ if ($value > $available) {
+ ++ $self->[HIGH] ;
+ $self->[LOW] = $value - $available - 1;
+ }
+ else {
+ $self->[LOW] += $value ;
+ }
+
+ }
+
+ sub subtract
+ {
+ my $self = shift;
+ my $value = shift;
+
+ if (ref $value eq 'U64') {
+
+ if ($value->[HIGH]) {
+ die "unsupport subtract option"
+ if $self->[HIGH] == 0 ||
+ $value->[HIGH] > $self->[HIGH] ;
+
+ $self->[HIGH] -= $value->[HIGH] ;
+ }
+
+ $value = $value->[LOW] ;
+ }
+
+ if ($value > $self->[LOW]) {
+ -- $self->[HIGH] ;
+ $self->[LOW] = MAX32 - $value + $self->[LOW] + 1;
+ }
+ else {
+ $self->[LOW] -= $value;
+ }
+ }
+
+ sub rshift
+ {
+ my $self = shift;
+ my $count = shift;
+
+ for (1 .. $count)
+ {
+ $self->[LOW] >>= 1;
+ $self->[LOW] |= 0x80000000
+ if $self->[HIGH] & 1 ;
+ $self->[HIGH] >>= 1;
+ }
+ }
+
+ sub equal
+ {
+ my $self = shift;
+ my $other = shift;
+
+ return $self->[LOW] == $other->[LOW] &&
+ $self->[HIGH] == $other->[HIGH] ;
+ }
+
+ sub is64bit
+ {
+ my $self = shift;
+ return $self->[HIGH] > 0 ;
+ }
+
+ sub getPacked_V64
+ {
+ my $self = shift;
+
+ return pack "V V", @$self ;
+ }
+
+ sub getPacked_V32
+ {
+ my $self = shift;
+
+ return pack "V", $self->[LOW] ;
+ }
+
+ sub pack_V64
+ {
+ my $low = shift;
+
+ return pack "V V", $low, 0;
+ }
+
+ sub max32
+ {
+ my $self = shift;
+ return $self->[HIGH] == 0 && $self->[LOW] == MAX32;
+ }
+
+ sub cmp
+ {
+ my $self = shift;
+ my $other = shift ;
+
+ if ($self->[HIGH] == $other->[LOW]) {
+ return $self->[HIGH] - $other->[HIGH] ;
+ }
+ else {
+ return $self->[LOW] - $other->[LOW] ;
+ }
+ }
+
+ sub nibbles
+ {
+ my @nibbles = (
+ [ 16 => HI_1 * 0x10000000 ],
+ [ 15 => HI_1 * 0x1000000 ],
+ [ 14 => HI_1 * 0x100000 ],
+ [ 13 => HI_1 * 0x10000 ],
+ [ 12 => HI_1 * 0x1000 ],
+ [ 11 => HI_1 * 0x100 ],
+ [ 10 => HI_1 * 0x10 ],
+ [ 9 => HI_1 * 0x1 ],
+
+ [ 8 => 0x10000000 ],
+ [ 7 => 0x1000000 ],
+ [ 6 => 0x100000 ],
+ [ 5 => 0x10000 ],
+ [ 4 => 0x1000 ],
+ [ 3 => 0x100 ],
+ [ 2 => 0x10 ],
+ [ 1 => 0x1 ],
+ );
+ my $value = shift ;
+
+ for my $pair (@nibbles)
+ {
+ my ($count, $limit) = @{ $pair };
+
+ return $count
+ if $value >= $limit ;
+ }
+
+ }
+}
+
+sub Usage
+{
+ die <<EOM;
+zipdetails [OPTIONS] file
+
+Display details about the internal structure of a Zip file.
+
+This is zipdetails version $VERSION
+
+OPTIONS
+ -h display help
+ -v Verbose - output more stuff
+
+Copyright (c) 2011 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+EOM
+
+
+}
+
+__END__
+
+=head1 NAME
+
+zipdetails - display the internal structure of zip files
+
+=head1 SYNOPSIS
+
+ zipdetaile [-v] zipfile.zip
+ zipdetails -h
+
+=head1 DESCRIPTION
+
+Zipdetails displays information about the internal record structure of the
+zip file. It is not concerned with displaying any details of the compressed
+data stored in the zip file.
+
+The program assumes prior understanding of the internal structure of a Zip
+file. You should have a copy of the Zip APPNOTE file at hand to help
+understand the output from this program (L<SEE ALSO> for details).
+
+=head2 OPTIONS
+
+=over 5
+
+=item -v
+
+Enable Verbose mode
+
+=item -h
+
+Display help
+
+=back
+
+
+By default zipdetails will output the details of the zip file in three
+columns.
+
+=over 5
+
+=item Column 1
+
+This contains the offset from the start of the file in hex.
+
+=item Column 2
+
+This contains a textual description of the field.
+
+=item Column 3
+
+If the field contains a numeric value it will be displayed in hex. Zip
+stored most numbers in little-endian format - the value displayed will have
+the little-endian encoding removed.
+
+Next, is an optional description of what the value means.
+
+
+=back
+
+If the C<-v> option is present, column 1 is expanded to include
+
+=over 5
+
+=item *
+
+The offset from the start of the file in hex.
+
+=item *
+
+The length of the filed in hex.
+
+=item *
+
+A hex dump of the bytes in field in the order they are stored in the zip
+file.
+
+=back
+
+
+=head1 TODO
+
+Error handling is still a work in progress. If the program encounters a
+problem reading a zip file it is likely to terminate with an unhelpful
+error message.
+
+
+=head1 SEE ALSO
+
+
+The primary reference for Zip files is the "appnote" document available at
+L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>.
+
+An alternative is the Info-Zip appnote. This is available from
+L<ftp://ftp.info-zip.org/pub/infozip/doc/>
+
+
+The C<zipinfo> program that comes with the info-zip distribution
+(L<http://www.info-zip.org/>) can also display details of the structure of
+a zip file.
+
+See also L<IO::Compress::Zip>, L<IO::Uncompress::Unzip>.
+
+
+=head1 AUTHOR
+
+Paul Marquess F<pmqs@cpan.org>.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2011 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
diff --git a/cpan/IO-Compress/lib/Compress/Zlib.pm b/cpan/IO-Compress/lib/Compress/Zlib.pm
index 2fb2b6ae81..3b26216b8c 100644
--- a/cpan/IO-Compress/lib/Compress/Zlib.pm
+++ b/cpan/IO-Compress/lib/Compress/Zlib.pm
@@ -7,17 +7,17 @@ use Carp ;
use IO::Handle ;
use Scalar::Util qw(dualvar);
-use IO::Compress::Base::Common 2.043 ;
-use Compress::Raw::Zlib 2.043 ;
-use IO::Compress::Gzip 2.043 ;
-use IO::Uncompress::Gunzip 2.043 ;
+use IO::Compress::Base::Common 2.044 ;
+use Compress::Raw::Zlib 2.044 ;
+use IO::Compress::Gzip 2.044 ;
+use IO::Uncompress::Gunzip 2.044 ;
use strict ;
use warnings ;
use bytes ;
our ($VERSION, $XS_VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
-$VERSION = '2.043';
+$VERSION = '2.044';
$XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
@@ -453,7 +453,7 @@ sub inflate
package Compress::Zlib ;
-use IO::Compress::Gzip::Constants 2.043 ;
+use IO::Compress::Gzip::Constants 2.044 ;
sub memGzip($)
{
@@ -1449,7 +1449,7 @@ of I<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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm b/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
index 00bae00273..05b9153587 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
@@ -4,13 +4,12 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status);
+use IO::Compress::Base::Common 2.044 qw(:Status);
-#use Compress::Bzip2 ;
-use Compress::Raw::Bzip2 2.043 ;
+use Compress::Raw::Bzip2 2.044 ;
our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
sub mkCompObject
{
@@ -18,11 +17,12 @@ sub mkCompObject
my $WorkFactor = shift ;
my $Verbosity = shift ;
+ $BlockSize100K = 1 if ! defined $BlockSize100K ;
+ $WorkFactor = 0 if ! defined $WorkFactor ;
+ $Verbosity = 0 if ! defined $Verbosity ;
+
my ($def, $status) = new Compress::Raw::Bzip2(1, $BlockSize100K,
$WorkFactor, $Verbosity);
- #my ($def, $status) = bzdeflateInit();
- #-BlockSize100K => $params->value('BlockSize100K'),
- #-WorkFactor => $params->value('WorkFactor');
return (undef, "Could not create Deflate object: $status", $status)
if $status != BZ_OK ;
@@ -39,7 +39,6 @@ sub compr
my $def = $self->{Def};
- #my ($out, $status) = $def->bzdeflate(defined ${$_[0]} ? ${$_[0]} : "") ;
my $status = $def->bzdeflate($_[0], $_[1]) ;
$self->{ErrorNo} = $status;
@@ -49,8 +48,6 @@ sub compr
return STATUS_ERROR;
}
- #${ $_[1] } .= $out if defined $out;
-
return STATUS_OK;
}
@@ -60,8 +57,6 @@ sub flush
my $def = $self->{Def};
- #my ($out, $status) = $def->bzflush($opt);
- #my $status = $def->bzflush($_[0], $opt);
my $status = $def->bzflush($_[0]);
$self->{ErrorNo} = $status;
@@ -71,7 +66,6 @@ sub flush
return STATUS_ERROR;
}
- #${ $_[0] } .= $out if defined $out ;
return STATUS_OK;
}
@@ -82,7 +76,6 @@ sub close
my $def = $self->{Def};
- #my ($out, $status) = $def->bzclose();
my $status = $def->bzclose($_[0]);
$self->{ErrorNo} = $status;
@@ -92,7 +85,6 @@ sub close
return STATUS_ERROR;
}
- #${ $_[0] } .= $out if defined $out ;
return STATUS_OK;
}
diff --git a/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm b/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
index 60c7790bfe..d2d444fc55 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
@@ -4,12 +4,12 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status);
+use IO::Compress::Base::Common 2.044 qw(:Status);
-use Compress::Raw::Zlib 2.043 qw(Z_OK Z_FINISH MAX_WBITS) ;
+use Compress::Raw::Zlib 2.044 qw(Z_OK Z_FINISH MAX_WBITS) ;
our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
sub mkCompObject
{
diff --git a/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm b/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
index 7aebede1c8..c14b6fbbb1 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
@@ -4,10 +4,10 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status);
+use IO::Compress::Base::Common 2.044 qw(:Status);
our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
sub mkCompObject
{
diff --git a/cpan/IO-Compress/lib/IO/Compress/Base.pm b/cpan/IO-Compress/lib/IO/Compress/Base.pm
index cac7610de9..6d9ba9c607 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Base.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Base.pm
@@ -6,7 +6,7 @@ require 5.004 ;
use strict ;
use warnings;
-use IO::Compress::Base::Common 2.043 ;
+use IO::Compress::Base::Common 2.044 ;
use IO::File qw(SEEK_SET SEEK_END); ;
use Scalar::Util qw(blessed readonly);
@@ -20,7 +20,7 @@ use bytes;
our (@ISA, $VERSION);
@ISA = qw(Exporter IO::File);
-$VERSION = '2.043';
+$VERSION = '2.044';
#Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16.
@@ -414,7 +414,7 @@ sub _singleTarget
if ($x->{oneInput})
{
$obj->getFileInfo($x->{Got}, $input)
- if isaFilename($input) and $inputIsFilename ;
+ if isaScalar($input) || (isaFilename($input) and $inputIsFilename) ;
my $z = $obj->_create($x->{Got}, @_)
or return undef ;
@@ -444,7 +444,7 @@ sub _singleTarget
else
{
$obj->getFileInfo($x->{Got}, $element)
- if $isFilename;
+ if isaScalar($element) || $isFilename;
$obj->_create($x->{Got}, @_)
or return undef ;
@@ -527,7 +527,7 @@ sub addInterStream
{
$self->getFileInfo(*$self->{Got}, $input)
#if isaFilename($input) and $inputIsFilename ;
- if isaFilename($input) ;
+ if isaScalar($input) || isaFilename($input) ;
# TODO -- newStream needs to allow gzip/zip header to be modified
return $self->newStream();
@@ -973,7 +973,7 @@ purpose if to to be sub-classed by IO::Compress modules.
L<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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm b/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm
index 4113304df5..6884707d23 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Base/Common.pm
@@ -11,15 +11,20 @@ use File::GlobMapper;
require Exporter;
our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE);
@ISA = qw(Exporter);
-$VERSION = '2.043';
+$VERSION = '2.044';
-@EXPORT = qw( isaFilehandle isaFilename whatIsInput whatIsOutput
+@EXPORT = qw( isaFilehandle isaFilename isaScalar
+ whatIsInput whatIsOutput
isaFileGlobString cleanFileGlobString oneTarget
setBinModeInput setBinModeOutput
ckInOutParams
createSelfTiedObject
getEncoding
+ isGeMax32
+
+ MAX32
+
WANT_CODE
WANT_EXT
WANT_UNDEF
@@ -42,7 +47,16 @@ use constant STATUS_OK => 0;
use constant STATUS_ENDSTREAM => 1;
use constant STATUS_EOF => 2;
use constant STATUS_ERROR => -1;
+use constant MAX16 => 0xFFFF ;
+use constant MAX32 => 0xFFFFFFFF ;
+use constant MAX32cmp => 0xFFFFFFFF + 1 - 1; # for 5.6.x on 32-bit need to force an non-IV value
+
+sub isGeMax32
+{
+ return $_[0] >= MAX32cmp ;
+}
+
sub hasEncode()
{
if (! defined $HAS_ENCODE) {
@@ -106,6 +120,11 @@ sub isaFilehandle($)
)
}
+sub isaScalar
+{
+ return ( defined($_[0]) and ref($_[0]) eq 'SCALAR' and defined ${ $_[0] } ) ;
+}
+
sub isaFilename($)
{
return (defined $_[0] and
diff --git a/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm b/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm
index 5211bef06a..fea0df9285 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm
@@ -5,16 +5,16 @@ use warnings;
use bytes;
require Exporter ;
-use IO::Compress::Base 2.043 ;
+use IO::Compress::Base 2.044 ;
-use IO::Compress::Base::Common 2.043 qw(createSelfTiedObject);
-use IO::Compress::Adapter::Bzip2 2.043 ;
+use IO::Compress::Base::Common 2.044 qw(createSelfTiedObject);
+use IO::Compress::Adapter::Bzip2 2.044 ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error);
-$VERSION = '2.043';
+$VERSION = '2.044';
$Bzip2Error = '';
@ISA = qw(Exporter IO::Compress::Base);
@@ -51,7 +51,7 @@ sub getExtraParams
{
my $self = shift ;
- use IO::Compress::Base::Common 2.043 qw(:Parse);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
return (
'BlockSize100K' => [0, 1, Parse_unsigned, 1],
diff --git a/cpan/IO-Compress/lib/IO/Compress/Deflate.pm b/cpan/IO-Compress/lib/IO/Compress/Deflate.pm
index 1d241d7c44..a1ed85e514 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Deflate.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Deflate.pm
@@ -6,16 +6,16 @@ use bytes;
require Exporter ;
-use IO::Compress::RawDeflate 2.043 ;
+use IO::Compress::RawDeflate 2.044 ;
-use Compress::Raw::Zlib 2.043 ;
-use IO::Compress::Zlib::Constants 2.043 ;
-use IO::Compress::Base::Common 2.043 qw(createSelfTiedObject);
+use Compress::Raw::Zlib 2.044 ;
+use IO::Compress::Zlib::Constants 2.044 ;
+use IO::Compress::Base::Common 2.044 qw(createSelfTiedObject);
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $DeflateError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$DeflateError = '';
@ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -884,8 +884,6 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
-
-
=head2 Working with Net::FTP
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -894,7 +892,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, 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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/pod/FAQ.pod b/cpan/IO-Compress/lib/IO/Compress/FAQ.pod
index 8848439d38..ee8a2c6569 100644
--- a/cpan/IO-Compress/pod/FAQ.pod
+++ b/cpan/IO-Compress/lib/IO/Compress/FAQ.pod
@@ -96,6 +96,78 @@ can find it on CPAN at
http://www.cpan.org/modules/by-module/Archive/Archive-Zip-*.tar.gz
+=head2 Can I Read/Write Zip files larger the 4 Gig?
+
+Yes, both the C<IO-Compress-Zip> and C<IO-Uncompress-Unzip> modules
+support the zip feature called I<Zip64>. That allows them to read/write
+files/buffers larger than 4Gig.
+
+If you are creating a Zip file using the one-shot interface, and any of the
+input files is greater than 4Gig, a zip64 complaint zip file will be
+created.
+
+ zip "really-large-file" => "my.zip";
+
+Similarly with the one-shot interface, if the input is a buffer larger than
+4 Gig, a zip64 complaint zip file will be created.
+
+ zip \$really_large_buffer => "my.zip";
+
+The one-shot interface allows you to force the creation of a zip64 zip file
+by including the C<Zip64> option.
+
+ zip $filehandle => "my.zip", Zip64 => 1;
+
+If you want to create a zip64 zip file with the OO interface you must
+specify the C<Zip64> option.
+
+ my $zip = new IO::Compress::Zip "whatever", Zip64 => 1;
+
+When uncompressing with C<IO-Uncompress-Unzip>, it will automatically
+detect if the zip file is zip64.
+
+If you intend to manipulate the Zip64 zip files created with
+C<IO-Compress-Zip> using an external zip/unzip, make sure that it supports
+Zip64.
+
+In particular, if you are using Info-Zip you need to have zip version 3.x
+or better to update a Zip64 archive and unzip version 6.x to read a zip64
+archive.
+
+=head2 What Compression Types do IO::Compress::Zip & IO::Uncompress::Unzip support?
+
+The following compression formats are supported by C<IO::Compress::Zip> and
+C<IO::Uncompress::Unzip>
+
+=over 5
+
+=item * Store (method 0)
+
+NO compression at all.
+
+=item * Deflate (method 8)
+
+This is the default compression used when creating a zip file with
+C<IO::Compress::Zip>.
+
+=item * Bzip2 (method 12)
+
+Only supported if the C<IO-Compress-Bzip2> module is available.
+
+=item * Lzma (method 14)
+
+Only supported if the C<IO-Compress-Lzma> module is available.
+
+=back
+
+=head2 Zip Resources
+
+The primary reference for zip files is the "appnote" document available at
+L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>
+
+An alternatively is the Info-Zip appnote. This is available from
+L<ftp://ftp.info-zip.org/pub/infozip/doc/>
+
=head2 Compressed files and Net::FTP
The C<Net::FTP> module provides two low-level methods called C<stor> and
@@ -491,7 +563,7 @@ file.
L<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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Compress/Gzip.pm b/cpan/IO-Compress/lib/IO/Compress/Gzip.pm
index fbc67586a1..6914c15ae6 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Gzip.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Gzip.pm
@@ -8,12 +8,12 @@ use warnings;
use bytes;
-use IO::Compress::RawDeflate 2.043 ;
+use IO::Compress::RawDeflate 2.044 ;
-use Compress::Raw::Zlib 2.043 ;
-use IO::Compress::Base::Common 2.043 qw(:Status :Parse createSelfTiedObject);
-use IO::Compress::Gzip::Constants 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
+use Compress::Raw::Zlib 2.044 ;
+use IO::Compress::Base::Common 2.044 qw(:Status :Parse isaScalar createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
BEGIN
{
@@ -27,7 +27,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GzipError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$GzipError = '' ;
@ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -178,6 +178,8 @@ sub getFileInfo
my $params = shift;
my $filename = shift ;
+ return if isaScalar($filename);
+
my $defaultTime = (stat($filename))[9] ;
$params->value('Name' => $filename)
@@ -1196,8 +1198,6 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
-
-
=head2 Working with Net::FTP
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -1206,7 +1206,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
L<Compress::Zlib>, 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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm b/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
index 8c78868678..2e6d76fae7 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
@@ -9,7 +9,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names);
our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE);
-$VERSION = '2.043';
+$VERSION = '2.044';
@ISA = qw(Exporter);
diff --git a/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm b/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm
index a316eb6b3f..e21e6ad2ba 100644
--- a/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm
@@ -7,16 +7,16 @@ use warnings;
use bytes;
-use IO::Compress::Base 2.043 ;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::Adapter::Deflate 2.043 ;
+use IO::Compress::Base 2.044 ;
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
+use IO::Compress::Adapter::Deflate 2.044 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$RawDeflateError = '';
@ISA = qw(Exporter IO::Compress::Base);
@@ -142,8 +142,8 @@ sub getZlibParams
{
my $self = shift ;
- use IO::Compress::Base::Common 2.043 qw(:Parse);
- use Compress::Raw::Zlib 2.043 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
+ use Compress::Raw::Zlib 2.044 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
return (
@@ -971,8 +971,6 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
-
-
=head2 Working with Net::FTP
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -981,7 +979,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, 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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Compress/Zip.pm b/cpan/IO-Compress/lib/IO/Compress/Zip.pm
index 77630d876d..303db18b41 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Zip.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Zip.pm
@@ -4,28 +4,30 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::RawDeflate 2.043 ;
-use IO::Compress::Adapter::Deflate 2.043 ;
-use IO::Compress::Adapter::Identity 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
-use IO::Compress::Zip::Constants 2.043 ;
+use IO::Compress::Base::Common 2.044 qw(:Status MAX32 isGeMax32 isaScalar createSelfTiedObject);
+use IO::Compress::RawDeflate 2.044 ;
+use IO::Compress::Adapter::Deflate 2.044 ;
+use IO::Compress::Adapter::Identity 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
+use IO::Compress::Zip::Constants 2.044 ;
use File::Spec();
use Config;
-use Compress::Raw::Zlib 2.043 qw(crc32) ;
+use Compress::Raw::Zlib 2.044 qw(crc32) ;
+
BEGIN
{
eval { require IO::Compress::Adapter::Bzip2 ;
- import IO::Compress::Adapter::Bzip2 2.043 ;
+ import IO::Compress::Adapter::Bzip2 2.044 ;
require IO::Compress::Bzip2 ;
- import IO::Compress::Bzip2 2.043 ;
+ import IO::Compress::Bzip2 2.044 ;
} ;
+
eval { require IO::Compress::Adapter::Lzma ;
- import IO::Compress::Adapter::Lzma 2.043 ;
+ import IO::Compress::Adapter::Lzma 2.044 ;
require IO::Compress::Lzma ;
- import IO::Compress::Lzma 2.043 ;
+ import IO::Compress::Lzma 2.044 ;
} ;
}
@@ -34,7 +36,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $ZipError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$ZipError = '';
@ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -248,7 +250,7 @@ sub mkHeader
if $osCode == ZIP_OS_CODE_UNIX ;
if (*$self->{ZipData}{Zip64}) {
- $empty = 0xFFFFFFFF;
+ $empty = MAX32;
my $x = '';
$x .= pack "V V", 0, 0 ; # uncompressedLength
@@ -368,7 +370,7 @@ sub mkHeader
# offset to local hdr
if (*$self->{ZipData}{LocalHdrOffset}->is64bit() ) {
- $ctl .= pack 'V', 0xFFFFFFFF ;
+ $ctl .= pack 'V', MAX32 ;
}
else {
$ctl .= *$self->{ZipData}{LocalHdrOffset}->getPacked_V32() ;
@@ -512,8 +514,8 @@ sub mkFinalTrailer
$z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to end zip64 central dir
$z64e .= pack 'V', 1 ; # Total number of disks
- $cd_offset = 0xFFFFFFFF ;
- $cd_len = 0xFFFFFFFF if $cd_len >= 0xFFFFFFFF ;
+ $cd_offset = MAX32 ;
+ $cd_len = MAX32 if isGeMax32 $cd_len ;
$entries = 0xFFFF if $entries >= 0xFFFF ;
}
@@ -641,15 +643,14 @@ sub getExtraParams
{
my $self = shift ;
- use IO::Compress::Base::Common 2.043 qw(:Parse);
- use Compress::Raw::Zlib 2.043 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
+ use Compress::Raw::Zlib 2.044 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
my @Bzip2 = ();
@Bzip2 = IO::Compress::Bzip2::getExtraParams($self)
if defined $IO::Compress::Bzip2::VERSION;
-
return (
# zlib behaviour
$self->getZlibParams(),
@@ -704,9 +705,20 @@ sub getFileInfo
my $params = shift;
my $filename = shift ;
+ if (isaScalar($filename))
+ {
+ $params->value(Zip64 => 1)
+ if isGeMax32 length (${ $filename }) ;
+
+ return ;
+ }
+
my ($mode, $uid, $gid, $atime, $mtime, $ctime)
= (stat($filename))[2, 4,5, 8,9,10] ;
+ $params->value(Zip64 => 1)
+ if isGeMax32 -s $filename ;
+
$params->value('Name' => $filename)
if ! $params->parsed('Name') ;
@@ -1416,11 +1428,14 @@ The default is 1.
=item C<< Zip64 => 0|1 >>
-Create a Zip64 zip file/buffer. This option should only be used if you want
-to store files larger than 4 Gig.
+Create a Zip64 zip file/buffer. This option is used if you want
+to store files larger than 4 Gig.
+
+C<Zip64> will be automatically set, as needed, if working with the one-shot
+interface when the input is either a filename or a scalar reference.
If you intend to manipulate the Zip64 zip files created with this module
-using an external zip/unzip make sure that it supports Zip64.
+using an external zip/unzip, make sure that it supports Zip64.
In particular, if you are using Info-Zip you need to have zip version 3.x
or better to update a Zip64 archive and unzip version 6.x to read a zip64
@@ -1855,8 +1870,6 @@ constructor.
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
-
-
=head2 Working with Net::FTP
See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -1865,7 +1878,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
L<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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm b/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm
index c9ed78307f..10b74f89a6 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm
@@ -7,7 +7,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS);
-$VERSION = '2.043';
+$VERSION = '2.044';
@ISA = qw(Exporter);
diff --git a/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm b/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
index 55c65c3a42..5ed370c739 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
@@ -9,7 +9,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT);
-$VERSION = '2.043';
+$VERSION = '2.044';
@ISA = qw(Exporter);
diff --git a/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm b/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
index a68953656d..4bae32cf2f 100644
--- a/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
+++ b/cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
@@ -8,9 +8,9 @@ use bytes;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS);
-$VERSION = '2.043';
+$VERSION = '2.044';
-use IO::Compress::Gzip::Constants 2.043 ;
+use IO::Compress::Gzip::Constants 2.044 ;
sub ExtraFieldError
{
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm b/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
index 68796b4132..2acc8355f4 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
@@ -4,12 +4,12 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status);
+use IO::Compress::Base::Common 2.044 qw(:Status);
-use Compress::Raw::Bzip2 2.043 ;
+use Compress::Raw::Bzip2 2.044 ;
our ($VERSION, @ISA);
-$VERSION = '2.043';
+$VERSION = '2.044';
sub mkUncompObject
{
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm b/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
index a730ea3907..6ced6a76c0 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
@@ -4,14 +4,14 @@ use warnings;
use strict;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status);
+use IO::Compress::Base::Common 2.044 qw(:Status);
use IO::Compress::Zip::Constants ;
our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
-use Compress::Raw::Zlib 2.043 ();
+use Compress::Raw::Zlib 2.044 ();
sub mkUncompObject
{
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm b/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
index 09d8c51a05..d407f3d48d 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
@@ -4,11 +4,11 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status);
-use Compress::Raw::Zlib 2.043 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
+use IO::Compress::Base::Common 2.044 qw(:Status);
+use Compress::Raw::Zlib 2.044 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm b/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
index 0522bd77c5..0b2abba259 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
@@ -6,22 +6,22 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(createSelfTiedObject);
+use IO::Compress::Base::Common 2.044 qw(createSelfTiedObject);
-use IO::Uncompress::Adapter::Inflate 2.043 ();
+use IO::Uncompress::Adapter::Inflate 2.044 ();
-use IO::Uncompress::Base 2.043 ;
-use IO::Uncompress::Gunzip 2.043 ;
-use IO::Uncompress::Inflate 2.043 ;
-use IO::Uncompress::RawInflate 2.043 ;
-use IO::Uncompress::Unzip 2.043 ;
+use IO::Uncompress::Base 2.044 ;
+use IO::Uncompress::Gunzip 2.044 ;
+use IO::Uncompress::Inflate 2.044 ;
+use IO::Uncompress::RawInflate 2.044 ;
+use IO::Uncompress::Unzip 2.044 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$AnyInflateError = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -48,7 +48,7 @@ sub anyinflate
sub getExtraParams
{
- use IO::Compress::Base::Common 2.043 qw(:Parse);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
return ( 'RawInflate' => [1, 1, Parse_boolean, 0] ) ;
}
@@ -951,7 +951,7 @@ See L<IO::Uncompress::AnyInflate::FAQ|IO::Uncompress::AnyInflate::FAQ/"Compresse
L<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::AnyUncompress>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm b/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
index acb5fa814e..bbc945af07 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
@@ -4,16 +4,16 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(createSelfTiedObject);
+use IO::Compress::Base::Common 2.044 qw(createSelfTiedObject);
-use IO::Uncompress::Base 2.043 ;
+use IO::Uncompress::Base 2.044 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$AnyUncompressError = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -27,22 +27,22 @@ Exporter::export_ok_tags('all');
BEGIN
{
- eval ' use IO::Uncompress::Adapter::Inflate 2.043 ;';
- eval ' use IO::Uncompress::Adapter::Bunzip2 2.043 ;';
- eval ' use IO::Uncompress::Adapter::LZO 2.043 ;';
- eval ' use IO::Uncompress::Adapter::Lzf 2.043 ;';
- eval ' use IO::Uncompress::Adapter::UnLzma 2.043 ;';
- eval ' use IO::Uncompress::Adapter::UnXz 2.043 ;';
-
- eval ' use IO::Uncompress::Bunzip2 2.043 ;';
- eval ' use IO::Uncompress::UnLzop 2.043 ;';
- eval ' use IO::Uncompress::Gunzip 2.043 ;';
- eval ' use IO::Uncompress::Inflate 2.043 ;';
- eval ' use IO::Uncompress::RawInflate 2.043 ;';
- eval ' use IO::Uncompress::Unzip 2.043 ;';
- eval ' use IO::Uncompress::UnLzf 2.043 ;';
- eval ' use IO::Uncompress::UnLzma 2.043 ;';
- eval ' use IO::Uncompress::UnXz 2.043 ;';
+ eval ' use IO::Uncompress::Adapter::Inflate 2.044 ;';
+ eval ' use IO::Uncompress::Adapter::Bunzip2 2.044 ;';
+ eval ' use IO::Uncompress::Adapter::LZO 2.044 ;';
+ eval ' use IO::Uncompress::Adapter::Lzf 2.044 ;';
+ eval ' use IO::Uncompress::Adapter::UnLzma 2.044 ;';
+ eval ' use IO::Uncompress::Adapter::UnXz 2.044 ;';
+
+ eval ' use IO::Uncompress::Bunzip2 2.044 ;';
+ eval ' use IO::Uncompress::UnLzop 2.044 ;';
+ eval ' use IO::Uncompress::Gunzip 2.044 ;';
+ eval ' use IO::Uncompress::Inflate 2.044 ;';
+ eval ' use IO::Uncompress::RawInflate 2.044 ;';
+ eval ' use IO::Uncompress::Unzip 2.044 ;';
+ eval ' use IO::Uncompress::UnLzf 2.044 ;';
+ eval ' use IO::Uncompress::UnLzma 2.044 ;';
+ eval ' use IO::Uncompress::UnXz 2.044 ;';
}
sub new
@@ -60,7 +60,7 @@ sub anyuncompress
sub getExtraParams
{
- use IO::Compress::Base::Common 2.043 qw(:Parse);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
return ( 'RawInflate' => [1, 1, Parse_boolean, 0] ,
'UnLzma' => [1, 1, Parse_boolean, 0] ) ;
}
@@ -995,7 +995,7 @@ Same as doing this
L<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<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Base.pm b/cpan/IO-Compress/lib/IO/Uncompress/Base.pm
index 988f22e379..21acad7400 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Base.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Base.pm
@@ -9,12 +9,12 @@ our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS);
@ISA = qw(Exporter IO::File);
-$VERSION = '2.043';
+$VERSION = '2.044';
use constant G_EOF => 0 ;
use constant G_ERR => -1 ;
-use IO::Compress::Base::Common 2.043 ;
+use IO::Compress::Base::Common 2.044 ;
use IO::File ;
use Symbol;
@@ -1043,6 +1043,13 @@ sub streamCount
return scalar @{ *$self->{InfoList} } ;
}
+#sub read
+#{
+# my $status = myRead(@_);
+# return undef if $status < 0;
+# return $status;
+#}
+
sub read
{
# return codes
@@ -1496,7 +1503,7 @@ purpose if to to be sub-classed by IO::Uncompress modules.
L<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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm b/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
index d33b3204e6..659e87ef8e 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
@@ -4,15 +4,15 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
-use IO::Uncompress::Base 2.043 ;
-use IO::Uncompress::Adapter::Bunzip2 2.043 ;
+use IO::Uncompress::Base 2.044 ;
+use IO::Uncompress::Adapter::Bunzip2 2.044 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error);
-$VERSION = '2.043';
+$VERSION = '2.044';
$Bunzip2Error = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -40,7 +40,7 @@ sub getExtraParams
{
my $self = shift ;
- use IO::Compress::Base::Common 2.043 qw(:Parse);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
return (
'Verbosity' => [1, 1, Parse_boolean, 0],
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm b/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm
index 31290645f0..d6c1ce4b97 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm
@@ -9,12 +9,12 @@ use strict ;
use warnings;
use bytes;
-use IO::Uncompress::RawInflate 2.043 ;
+use IO::Uncompress::RawInflate 2.044 ;
-use Compress::Raw::Zlib 2.043 qw( crc32 ) ;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::Gzip::Constants 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
+use Compress::Raw::Zlib 2.044 qw( crc32 ) ;
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
require Exporter ;
@@ -28,7 +28,7 @@ Exporter::export_ok_tags('all');
$GunzipError = '';
-$VERSION = '2.043';
+$VERSION = '2.044';
sub new
{
@@ -47,7 +47,7 @@ sub gunzip
sub getExtraParams
{
- use IO::Compress::Base::Common 2.043 qw(:Parse);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
return ( 'ParseExtra' => [1, 1, Parse_boolean, 0] ) ;
}
@@ -1075,7 +1075,7 @@ See L<IO::Uncompress::Gunzip::FAQ|IO::Uncompress::Gunzip::FAQ/"Compressed files
L<Compress::Zlib>, L<IO::Compress::Gzip>, 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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm b/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm
index 7451fe582b..951fc66660 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm
@@ -5,15 +5,15 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::Zlib::Constants 2.043 ;
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
+use IO::Compress::Zlib::Constants 2.044 ;
-use IO::Uncompress::RawInflate 2.043 ;
+use IO::Uncompress::RawInflate 2.044 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$InflateError = '';
@ISA = qw( Exporter IO::Uncompress::RawInflate );
@@ -946,7 +946,7 @@ See L<IO::Uncompress::Inflate::FAQ|IO::Uncompress::Inflate::FAQ/"Compressed file
L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, 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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm b/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm
index 078eeecba6..f24d1dac42 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm
@@ -5,16 +5,16 @@ use strict ;
use warnings;
use bytes;
-use Compress::Raw::Zlib 2.043 ;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
+use Compress::Raw::Zlib 2.044 ;
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
-use IO::Uncompress::Base 2.043 ;
-use IO::Uncompress::Adapter::Inflate 2.043 ;
+use IO::Uncompress::Base 2.044 ;
+use IO::Uncompress::Adapter::Inflate 2.044 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
-$VERSION = '2.043';
+$VERSION = '2.044';
$RawInflateError = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -1074,7 +1074,7 @@ See L<IO::Uncompress::RawInflate::FAQ|IO::Uncompress::RawInflate::FAQ/"Compresse
L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, 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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm b/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm
index acab6b928b..89d0703ca8 100644
--- a/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm
+++ b/cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm
@@ -9,14 +9,14 @@ use warnings;
use bytes;
use IO::File;
-use IO::Uncompress::RawInflate 2.043 ;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
-use IO::Uncompress::Adapter::Inflate 2.043 ;
-use IO::Uncompress::Adapter::Identity 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
-use IO::Compress::Zip::Constants 2.043 ;
+use IO::Uncompress::RawInflate 2.044 ;
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
+use IO::Uncompress::Adapter::Inflate 2.044 ;
+use IO::Uncompress::Adapter::Identity 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
+use IO::Compress::Zip::Constants 2.044 ;
-use Compress::Raw::Zlib 2.043 qw(crc32) ;
+use Compress::Raw::Zlib 2.044 qw(crc32) ;
BEGIN
{
@@ -31,7 +31,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
-$VERSION = '2.043';
+$VERSION = '2.044';
$UnzipError = '';
@ISA = qw(Exporter IO::Uncompress::RawInflate);
@@ -64,7 +64,7 @@ sub unzip
sub getExtraParams
{
- use IO::Compress::Base::Common 2.043 qw(:Parse);
+ use IO::Compress::Base::Common 2.044 qw(:Parse);
return (
@@ -1812,7 +1812,7 @@ skipping to the next one.
L<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>
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
L<Archive::Tar|Archive::Tar>,
diff --git a/cpan/IO-Compress/t/000prereq.t b/cpan/IO-Compress/t/000prereq.t
index b5ff655a87..5a44df9010 100644
--- a/cpan/IO-Compress/t/000prereq.t
+++ b/cpan/IO-Compress/t/000prereq.t
@@ -25,7 +25,7 @@ BEGIN
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- my $VERSION = '2.043';
+ my $VERSION = '2.044';
my @NAMES = qw(
Compress::Raw::Bzip2
Compress::Raw::Zlib
diff --git a/cpan/IO-Compress/t/105oneshot-zip-bzip2-only.t b/cpan/IO-Compress/t/105oneshot-zip-bzip2-only.t
index bd7393a445..ed3f8c74dc 100644
--- a/cpan/IO-Compress/t/105oneshot-zip-bzip2-only.t
+++ b/cpan/IO-Compress/t/105oneshot-zip-bzip2-only.t
@@ -28,7 +28,7 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 152 + $extra ;
+ plan tests => 248 + $extra ;
#use_ok('IO::Compress::Zip', qw(zip $ZipError :zip_method)) ;
use_ok('IO::Compress::Zip', qw(:all)) ;
@@ -67,41 +67,55 @@ sub zipGetHeader
}
-for my $stream (0, 1)
+for my $input (0, 1)
{
- for my $zip64 (0, 1)
+ for my $stream (0, 1)
{
- #next if $zip64 && ! $stream;
-
- for my $method (ZIP_CM_STORE, ZIP_CM_DEFLATE, ZIP_CM_BZIP2)
+ for my $zip64 (0, 1)
{
- title "Stream $stream, Zip64 $zip64, Method $method";
+ #next if $zip64 && ! $stream;
- my $lex = new LexFile my $file1;
+ for my $method (ZIP_CM_STORE, ZIP_CM_DEFLATE, ZIP_CM_BZIP2)
+ {
+ title "Input $input, Stream $stream, Zip64 $zip64, Method $method";
- my $content = "hello ";
- #writeFile($file1, $content);
+ my $lex1 = new LexFile my $file1;
+ my $lex2 = new LexFile my $file2;
+ my $content = "hello ";
+ my $in ;
- ok zip(\$content => $file1 , Method => $method,
- Zip64 => $zip64,
- Stream => $stream), " zip ok"
- or diag $ZipError ;
+ if ($input)
+ {
+ writeFile($file2, $content);
+ $in = $file2;
+ }
+ else
+ {
+ $in = \$content;
+ }
- my $got ;
- ok unzip($file1 => \$got), " unzip ok"
- or diag $UnzipError ;
- is $got, $content, " content ok";
+ ok zip($in => $file1 , Method => $method,
+ Zip64 => $zip64,
+ Stream => $stream), " zip ok"
+ or diag $ZipError ;
- my $u = new IO::Uncompress::Unzip $file1
- or diag $ZipError ;
+ my $got ;
+ ok unzip($file1 => \$got), " unzip ok"
+ or diag $UnzipError ;
- my $hdr = $u->getHeaderInfo();
- ok $hdr, " got header";
+ is $got, $content, " content ok";
- is $hdr->{Stream}, $stream, " stream is $stream" ;
- is $hdr->{MethodID}, $method, " MethodID is $method" ;
- is $hdr->{Zip64}, $zip64, " Zip64 is $zip64" ;
+ my $u = new IO::Uncompress::Unzip $file1
+ or diag $ZipError ;
+
+ my $hdr = $u->getHeaderInfo();
+ ok $hdr, " got header";
+
+ is $hdr->{Stream}, $stream, " stream is $stream" ;
+ is $hdr->{MethodID}, $method, " MethodID is $method" ;
+ is $hdr->{Zip64}, $zip64, " Zip64 is $zip64" ;
+ }
}
}
}
diff --git a/installperl b/installperl
index 7ce56c31d1..a67cd6d00e 100755
--- a/installperl
+++ b/installperl
@@ -707,8 +707,9 @@ sub installlib {
# scripts in lib/ExtUtils, the prove script in lib/Test/Harness,
# the corelist script from lib/Module/CoreList/bin and ptar* in
# lib/Archive/Tar/bin, the config_data script in lib/Module/Build/scripts
+ # and zipdetails in cpan/IO-Compress/bin
# (they're installed later with other utils)
- return if $name =~ /^(?:cpan|instmodsh|prove|corelist|ptar|cpan2dist|cpanp|cpanp-run-perl|ptardiff|ptargrep|config_data)\z/;
+ return if $name =~ /^(?:cpan|instmodsh|prove|corelist|ptar|cpan2dist|cpanp|cpanp-run-perl|ptardiff|ptargrep|config_data|zipdetails)\z/;
# ignore the Makefiles
return if $name =~ /^makefile$/i;
# ignore the test extensions
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index 8a2ed126db..f9242233de 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -119,7 +119,9 @@ L<Compress::Raw::Bzip2> has been upgraded from version 2.042 to version 2.044.
=item *
-L<IO::Compress::Base> has been upgraded from version 2.042 to version 2.043.
+L<IO::Compress::Base> has been upgraded from version 2.042 to version 2.044.
+
+Added zipdetails utility.
=item *
@@ -260,13 +262,14 @@ here. Most of these are built within the directories F<utils> and F<x2p>.
entries for each change
Use L<XXX> with program names to get proper documentation linking. ]
-=head3 L<XXX>
+=head3 L<zipdetails>
=over 4
=item *
-XXX
+L<zipdetails> displays information about the internal record structure of the zip file.
+It is not concerned with displaying any details of the compressed data stored in the zip file.
=back
diff --git a/pod/perlutil.pod b/pod/perlutil.pod
index c6520ac109..1cc381cd62 100644
--- a/pod/perlutil.pod
+++ b/pod/perlutil.pod
@@ -256,6 +256,11 @@ in a tar archive.
This utility, that comes with the C<Digest::SHA> module, is used to print
or verify SHA checksums.
+=item L<zipdetails>
+
+L<zipdetails> displays information about the internal record structure of the zip file.
+It is not concerned with displaying any details of the compressed data stored in the zip file.
+
=back
=head2 Installation
@@ -301,6 +306,6 @@ C<roffitall|roffitall>, L<a2p|a2p>, L<s2p|s2p>, L<find2perl|find2perl>,
L<File::Find|File::Find>, L<pl2pm|pl2pm>, L<perlbug|perlbug>,
L<h2ph|h2ph>, L<c2ph|c2ph>, L<h2xs|h2xs>, L<enc2xs>, L<xsubpp>,
L<cpan>, L<cpanp>, L<cpan2dist>, L<instmodsh>, L<piconv>, L<prove>,
-L<corelist>, L<ptar>, L<ptardiff>, L<shasum>
+L<corelist>, L<ptar>, L<ptardiff>, L<shasum>, L<zipdetails>
=cut
diff --git a/t/porting/known_pod_issues.dat b/t/porting/known_pod_issues.dat
index ae7ca8bf21..e4f256c53f 100644
--- a/t/porting/known_pod_issues.dat
+++ b/t/porting/known_pod_issues.dat
@@ -191,7 +191,7 @@ ext/vms-dclsym/dclsym.pm Verbatim line length including indents exceeds 79 by 1
ext/vms-stdio/stdio.pm Verbatim line length including indents exceeds 79 by 1
ext/xs-apitest/apitest.pm Verbatim line length including indents exceeds 79 by 1
install ? Should you be using F<...> or maybe L<...> instead of 1
-install Verbatim line length including indents exceeds 79 by 10
+install Verbatim line length including indents exceeds 79 by 11
installhtml Verbatim line length including indents exceeds 79 by 5
os2/os2/os2-extattr/extattr.pm ? Should you be using F<...> or maybe L<...> instead of 1
os2/os2/os2-process/process.pm Verbatim line length including indents exceeds 79 by 27
diff --git a/utils.lst b/utils.lst
index 037b3eb815..8ce291eefd 100644
--- a/utils.lst
+++ b/utils.lst
@@ -41,6 +41,7 @@ utils/cpan2dist
utils/shasum
utils/splain
utils/xsubpp
+utils/zipdetails
x2p/a2p # pod = x2p/a2p.pod
x2p/find2perl
x2p/s2p # link = x2p/psed
diff --git a/utils/Makefile b/utils/Makefile
index a3a5540f48..bf6bc804a2 100644
--- a/utils/Makefile
+++ b/utils/Makefile
@@ -10,9 +10,9 @@ RUN = # Used mainly cross-compilation setups.
# Files to be built with variable substitution after miniperl is
# available. Dependencies handled manually below (for now).
-pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL
-plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html
-plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html
+pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL zipdetails.PL
+plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html zipdetails
+plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html ./zipdetails
all: $(plextract)
@@ -69,6 +69,8 @@ enc2xs: enc2xs.PL ../config.sh
xsubpp: xsubpp.PL ../config.sh
+zipdetails: zipdetails.PL ../config.sh
+
pod2html: pod2html.PL ../config.sh ../ext/Pod-Html/bin/pod2html
clean:
diff --git a/utils/Makefile.SH b/utils/Makefile.SH
index 1942ec88ad..ca683c2e14 100644
--- a/utils/Makefile.SH
+++ b/utils/Makefile.SH
@@ -48,9 +48,9 @@ cat >>Makefile <<'!NO!SUBS!'
# Files to be built with variable substitution after miniperl is
# available. Dependencies handled manually below (for now).
-pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL
-plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html
-plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html
+pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL zipdetails.PL
+plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html zipdetails
+plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html ./zipdetails
all: $(plextract)
@@ -107,6 +107,8 @@ enc2xs: enc2xs.PL ../config.sh
xsubpp: xsubpp.PL ../config.sh
+zipdetails: zipdetails.PL ../config.sh
+
pod2html: pod2html.PL ../config.sh ../ext/Pod-Html/bin/pod2html
clean:
diff --git a/utils/zipdetails.PL b/utils/zipdetails.PL
new file mode 100644
index 0000000000..a905c4befb
--- /dev/null
+++ b/utils/zipdetails.PL
@@ -0,0 +1,51 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate. Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries. Thus you write
+# $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+my $origdir = cwd;
+chdir dirname($0);
+my $file = basename($0, '.PL');
+$file .= '.com' if $^O eq 'VMS';
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{startperl}
+ eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
+ if \$running_under_some_shell;
+!GROK!THIS!
+
+use File::Spec;
+
+my $script = File::Spec->catfile(
+ File::Spec->catdir(
+ File::Spec->updir, qw[ cpan IO-Compress bin ]
+ ), "zipdetails");
+
+if (open(IN, $script)) {
+ print OUT <IN>;
+ close IN;
+} else {
+ die "$0: cannot find '$script'\n";
+}
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
diff --git a/vms/descrip_mms.template b/vms/descrip_mms.template
index f31fe7e740..9a3c83143a 100644
--- a/vms/descrip_mms.template
+++ b/vms/descrip_mms.template
@@ -313,7 +313,7 @@ utils1 = [.utils]perldoc.com [.lib.ExtUtils]Miniperl.pm [.utils]c2ph.com [.utils
utils2 = [.utils]h2xs.com [.utils]libnetcfg.com [.lib]perlbug.com [.utils]json_pp.com
utils3 = [.utils]perlivp.com [.lib]splain.com [.utils]pl2pm.com [.utils]xsubpp.com [.utils]pod2html.com [.utils]instmodsh.com
utils4 = [.utils]enc2xs.com [.utils]piconv.com [.utils]cpan.com [.utils]prove.com [.utils]ptar.com [.utils]ptardiff.com [.utils]shasum.com
-utils5 = [.utils]corelist.com [.utils]config_data.com [.utils]cpanp.com [.utils]cpan2dist.com [.utils]cpanp-run-perl.com [.utils]ptargrep.com
+utils5 = [.utils]corelist.com [.utils]config_data.com [.utils]cpanp.com [.utils]cpan2dist.com [.utils]cpanp-run-perl.com [.utils]ptargrep.com [.utils]zipdetails.com
.ifdef NOX2P
all : base extras archcorefiles preplibrary [.pod]perltoc.pod
@@ -561,6 +561,9 @@ nonxsext : $(LIBPREREQ) preplibrary $(MINIPERL_EXE)
[.utils]xsubpp.com : [.utils]xsubpp.PL $(ARCHDIR)Config.pm nonxsext
$(MINIPERL) -"I[-.lib]" $(MMS$SOURCE)
+[.utils]zipdetails.com : [.utils]zipdetails.PL $(ARCHDIR)Config.pm nonxsext
+ $(MINIPERL) -"I[-.lib]" $(MMS$SOURCE)
+
[.utils]pod2html.com : [.utils]pod2html.PL $(ARCHDIR)Config.pm nonxsext
$(MINIPERL) -"I[-.lib]" $(MMS$SOURCE)
diff --git a/win32/Makefile b/win32/Makefile
index 9063c25e13..426cbcbad2 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -583,6 +583,7 @@ UTILS = \
..\utils\ptar \
..\utils\ptardiff \
..\utils\ptargrep \
+ ..\utils\zipdetails \
..\utils\cpanp-run-perl \
..\utils\cpanp \
..\utils\cpan2dist \
@@ -1180,7 +1181,7 @@ distclean: realclean
perlvos.pod perlwin32.pod
-cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph pstruct h2xs \
perldoc perlivp libnetcfg enc2xs piconv cpan *.bat \
- xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data
+ xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data zipdetails
-cd ..\x2p && del /f find2perl s2p psed *.bat
-del /f ..\config.sh perlmain.c dlutils.c config.h.new \
perlmainst.c
diff --git a/win32/makefile.mk b/win32/makefile.mk
index fc89ad2de0..03d7276e2f 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -675,6 +675,7 @@ UTILS = \
..\utils\ptar \
..\utils\ptardiff \
..\utils\ptargrep \
+ ..\utils\zipdetails \
..\utils\cpanp-run-perl \
..\utils\cpanp \
..\utils\cpan2dist \
@@ -1365,7 +1366,7 @@ distclean: realclean
perlvos.pod perlwin32.pod
-cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph pstruct h2xs \
perldoc perlivp libnetcfg enc2xs piconv cpan *.bat \
- xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data
+ xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data zipdetails
-cd ..\x2p && del /f find2perl s2p psed *.bat
-del /f ..\config.sh perlmain.c dlutils.c config.h.new \
perlmainst.c