Replaced Compress::Zlib with IO::Compress::Gzip and IO::Uncompress::Gunzip. Replaced Compress::Bzip2 with IO::Compress::Bzip2 and IO::Uncompress::Bunzip2.

This commit is contained in:
依瑪貓 2022-03-19 09:23:39 +08:00
parent e3bf856e8a
commit 3b2e2d0fa5
6 changed files with 159 additions and 164 deletions

View File

@ -62,8 +62,8 @@ my $build = Module::Build->new(
}, },
recommends => { recommends => {
"File::MMagic" => 0, "File::MMagic" => 0,
"Compress::Zlib" => 0, "IO::Compress::Gzip" => 0,
"Compress::Bzip2" => 2, "IO::Compress::Bzip2" => 2,
"IO::Compress::Xz" => 0, "IO::Compress::Xz" => 0,
"Term::ReadKey" => 0, "Term::ReadKey" => 0,
}, },

View File

@ -1,7 +1,11 @@
arclog change log arclog change log
2022-03-19 2022-03-19
Added support for the xz compression. 1. Added support for the xz compression.
2. Replaced Compress::Zlib with IO::Compress::Gzip and
IO::Uncompress::Gunzip.
2. Replaced Compress::Bzip2 with IO::Compress::Bzip2 and
IO::Uncompress::Bunzip2.
2020-02-06 version 3.05 2020-02-06 version 3.05
1. Replaced the messy GNU-styled, multi-lingual documents with a 1. Replaced the messy GNU-styled, multi-lingual documents with a

View File

@ -52,8 +52,8 @@ EOT
our (%OPT_PREREQ); our (%OPT_PREREQ);
%OPT_PREREQ = ( %OPT_PREREQ = (
"File::MMagic" => 0, "File::MMagic" => 0,
"Compress::Zlib" => 0, "IO::Compress::Gzip" => 0,
"Compress::Bzip2" => 2, "IO::Compress::Bzip2" => 2,
"IO::Compress::Xz" => 0, "IO::Compress::Xz" => 0,
"Term::ReadKey" => 0, "Term::ReadKey" => 0,
); );

View File

@ -174,22 +174,23 @@ System Requirement
the [GnuWin32] home page. Be sure to save it as `file.exe` the [GnuWin32] home page. Be sure to save it as `file.exe`
somewhere in your `PATH`. somewhere in your `PATH`.
* [Compress::Zlib] * [IO::Compress::Gzip] and [IO::Uncompress::Gunzip]
This is used to support reading/writing the gzip compressed They are used to support reading/writing the gzip compressed
files. It is only needed when gzip compressed files are files. It is only needed when gzip compressed files are
encountered. If it is not available, `arclog` tries the `gzip` encountered. If they are not available, `arclog` tries the
executable instead. If that is not available, too, `arclog` `gzip` executable instead. If that is not available, too,
fails. You should not worry about Compress::Zlib since it comes `arclog` fails. You should not worry about IO::Compress::Gzip
with Perl since version 5.9.3. If not, it is contained in the since it comes with Perl since version 5.9.3. If not, it is
[IO-Compress] distribution. You can download and install it from contained in the [IO-Compress] distribution. You can download
the CPAN archive, or install it with the CPAN shell: and install it from the CPAN archive, or install it with the
CPAN shell:
cpan Compress::Zlib cpan IO::Compress::Gzip
or with the CPANPLUS shell: or with the CPANPLUS shell:
cpanp i Compress::Zlib cpanp i IO::Compress::Gzip
For Debian/Ubuntu: For Debian/Ubuntu:
@ -211,38 +212,39 @@ System Requirement
[the gzip website]. Be sure to save it as `gzip.exe` somewhere [the gzip website]. Be sure to save it as `gzip.exe` somewhere
in your `PATH`. in your `PATH`.
* [Compress::Bzip2] version 2 or above. * [IO::Compress::Bzip2] and [IO::Uncompress::Bunzip2]
This is used to support reading/writing the bzip2 compressed They are used to support reading/writing the bzip2 compressed
files. It is only needed when bzip2 compressed files are files. They are only needed when bzip2 compressed files are
encountered. If it is not available, `arclog` tries the `bzip2` encountered. If they are not available, `arclog` tries the
executable instead. If that is not available, too, `arclog` `bzip2` executable instead. If that is not available, too,
fails. Notice that older versions before 2 does not work, since `arclog` fails. You should not worry about IO::Compress::Bzip2
the file I/O compression was not implemented yet. You can since it comes with Perl since version 5.10.1. If not, it is
download and install Compress::Bzip2 from the CPAN archive, or contained in the [IO-Compress] distribution. You can download
install it with the CPAN shell: and install it from the CPAN archive, or install it with the
CPAN shell:
cpan Compress::Bzip2 cpan IO::Compress::Bzip2
or with the CPANPLUS shell: or with the CPANPLUS shell:
cpanp i Compress::Bzip2 cpanp i IO::Compress::Bzip2
For Debian/Ubuntu: For Debian/Ubuntu:
sudo apt install libcompress-bzip2-perl sudo apt install libio-compress-perl
For Red Hat/Fedora/CentOS: For Red Hat/Fedora/CentOS:
sudo yum install perl-Compress-Bzip2 sudo yum install perl-IO-Compress
For FreeBSD: For FreeBSD:
ports install p5-Compress-Bzip2 ports install p5-IO-Compress
For ActivePerl: For ActivePerl:
ppm install Compress-Bzip2 ppm install IO-Compress
The alternative `bzip2.exe` for MS-Windows can be obtained from The alternative `bzip2.exe` for MS-Windows can be obtained from
[the bzip2 website]. Be sure to save it as `bzip2.exe` somewhere [the bzip2 website]. Be sure to save it as `bzip2.exe` somewhere
@ -320,10 +322,12 @@ System Requirement
[Date::Parse]: https://metacpan.org/pod/Date::Parse [Date::Parse]: https://metacpan.org/pod/Date::Parse
[File::MMagic]: https://metacpan.org/pod/File::MMagic [File::MMagic]: https://metacpan.org/pod/File::MMagic
[GnuWin32]: http://gnuwin32.sourceforge.net [GnuWin32]: http://gnuwin32.sourceforge.net
[Compress::Zlib]: https://metacpan.org/pod/Compress::Zlib [IO::Compress::Gzip]: https://metacpan.org/pod/IO::Compress::Gzip
[IO::Uncompress::Gunzip]: https://metacpan.org/pod/IO::Uncompress::Gunzip
[the gzip website]: https://www.gzip.org [the gzip website]: https://www.gzip.org
[IO-Compress]: https://metacpan.org/dist/IO-Compress [IO-Compress]: https://metacpan.org/dist/IO-Compress
[Compress::Bzip2]: https://metacpan.org/pod/Compress::Bzip2 [IO::Compress::Bzip2]: https://metacpan.org/pod/IO::Compress::Bzip2
[IO::Uncompress::Bunzip2]: https://metacpan.org/pod/IO::Uncompress::Bunzip2
[the bzip2 website]: http://www.bzip.org [the bzip2 website]: http://www.bzip.org
[IO::Compress::Xz]: https://metacpan.org/pod/IO::Compress::Xz [IO::Compress::Xz]: https://metacpan.org/pod/IO::Compress::Xz
[IO::Uncompress::UnXz]: https://metacpan.org/pod/IO::Uncompress::UnXz [IO::Uncompress::UnXz]: https://metacpan.org/pod/IO::Uncompress::UnXz
@ -492,18 +496,18 @@ Options
* `g`, `gzip` * `g`, `gzip`
Compress with `gzip`. This is the default. `arclog` can use Compress with `gzip`. This is the default. `arclog` can use
`Compress::Zlib` to compress instead of calling `gzip`. This can `IO::Compress::Gzip` to compress instead of calling `gzip`.
be safer and faster for not calling foreign binaries. If This can be safer and faster for not calling foreign binaries.
`Compress::Zlib` is not installed, it tries `gzip` instead. If If `IO::Compress::Gzip` is not installed, it tries `gzip`
`gzip` is not available, either, it fails. instead. If `gzip` is not available, either, it fails.
* `b`, `bzip2` * `b`, `bzip2`
Compress with `bzip2`. `arclog` can use `Compress::Bzip2` to Compress with `bzip2`. `arclog` can use `IO::Compress::Bzip2`
compress instead of calling `bzip2`. This can be safer and faster to compress instead of calling `bzip2`. This can be safer and
for not calling foreign binaries. If `Compress::Bzip2` is not faster for not calling foreign binaries. If
installed, it tries `bzip2` instead. If `bzip2` is not available, `IO::Compress::Bzip2` is not installed, it tries `bzip2`
either, it fails. instead. If `bzip2` is not available, either, it fails.
* `x`, `xz` * `x`, `xz`

162
arclog
View File

@ -824,7 +824,6 @@ sub check_type : method {
# Check by file name suffix # Check by file name suffix
# Check by file name suffix on empty files, too. # Check by file name suffix on empty files, too.
# Compress::Bzip2 2 creates empty files that confuses further processing.
if (-z $FH || $MAGIC_METHOD eq MAGIC_SUFFIX) { if (-z $FH || $MAGIC_METHOD eq MAGIC_SUFFIX) {
return TYPE_GZIP if $file =~ /\.gz$/; return TYPE_GZIP if $file =~ /\.gz$/;
return TYPE_BZIP2 if $file =~ /\.bz2$/; return TYPE_BZIP2 if $file =~ /\.bz2$/;
@ -1265,13 +1264,13 @@ sub check_gzip : method {
# Checked before # Checked before
return ref($GZIP_IO)->new if defined $GZIP_IO; return ref($GZIP_IO)->new if defined $GZIP_IO;
# See whether Compress::Zlib or gzip # See whether IO::Compress::Gzip or gzip
print STDERR "Checking gzip I/O handler to use ... " if $VERBOSE > 1; print STDERR "Checking gzip I/O handler to use ... " if $VERBOSE > 1;
print STDERR "\n Checking Compress::Zlib ... " if $VERBOSE > 2; print STDERR "\n Checking IO::Compress::Gzip ... " if $VERBOSE > 2;
# Check if we have Compress::Zlib # Check if we have IO::Compress::Gzip
if (eval { require Compress::Zlib; 1; }) { if (eval { require IO::Compress::Gzip; require IO::Uncompress::Gunzip; 1; }) {
print STDERR "OK\nfound " if $VERBOSE > 2; print STDERR "OK\nfound " if $VERBOSE > 2;
print STDERR "Compress::Zlib\n" if $VERBOSE > 1; print STDERR "IO::Compress::Gzip\n" if $VERBOSE > 1;
return ($GZIP_IO = _private::IO::Gzip::PM->new); return ($GZIP_IO = _private::IO::Gzip::PM->new);
} }
# Not found # Not found
@ -1290,7 +1289,7 @@ sub check_gzip : method {
print STDERR "no\n" if $VERBOSE > 2; print STDERR "no\n" if $VERBOSE > 2;
print STDERR "not found\n" if $VERBOSE > 1; print STDERR "not found\n" if $VERBOSE > 1;
die "$THIS_FILE: Necessary Compress::Zlib or gzip not available.\n$SHORT_HELP\n"; die "$THIS_FILE: Necessary IO::Compress::Gzip or gzip not available.\n$SHORT_HELP\n";
} }
# Check for compression method of bzip2 # Check for compression method of bzip2
@ -1300,13 +1299,13 @@ sub check_bzip2 : method {
# Checked before # Checked before
return ref($BZIP2_IO)->new if defined $BZIP2_IO; return ref($BZIP2_IO)->new if defined $BZIP2_IO;
# See whether Compress::Bzip2 or bzip2 # See whether IO::Compress::Bzip2 or bzip2
print STDERR "Checking bzip2 I/O handler to use ... " if $VERBOSE > 1; print STDERR "Checking bzip2 I/O handler to use ... " if $VERBOSE > 1;
print STDERR "\n Checking Compress::Bzip2 ... " if $VERBOSE > 2; print STDERR "\n Checking IO::Compress::Bzip2 ... " if $VERBOSE > 2;
# Check if we have Compress::Bzip2 # Check if we have IO::Compress::Bzip2
if (eval { require Compress::Bzip2; import Compress::Bzip2 2.00; 1; }) { if (eval { require IO::Compress::Bzip2; require IO::Uncompress::Bunzip2; 1; }) {
print STDERR "OK\nfound " if $VERBOSE > 2; print STDERR "OK\nfound " if $VERBOSE > 2;
print STDERR "Compress::Bzip2\n" if $VERBOSE > 1; print STDERR "IO::Compress::Bzip2\n" if $VERBOSE > 1;
return ($BZIP2_IO = _private::IO::Bzip2::PM->new); return ($BZIP2_IO = _private::IO::Bzip2::PM->new);
} }
# Not found # Not found
@ -1325,7 +1324,7 @@ sub check_bzip2 : method {
print STDERR "no\n" if $VERBOSE > 2; print STDERR "no\n" if $VERBOSE > 2;
print STDERR "not found\n" if $VERBOSE > 1; print STDERR "not found\n" if $VERBOSE > 1;
die "$THIS_FILE: Necessary Compress::Bzip2 or bzip2 not available.\n$SHORT_HELP\n"; die "$THIS_FILE: Necessary IO::Compress::Bzip2 or bzip2 not available.\n$SHORT_HELP\n";
} }
# Check for compression method of xz # Check for compression method of xz
@ -1599,9 +1598,9 @@ sub open_read : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
($self->{"file"}, $self->{"FH"}) = ($file, $FH); ($self->{"file"}, $self->{"FH"}) = ($file, $FH);
import Compress::Zlib qw(gzopen); print STDERR " Attaching file with IO::Uncompress::Gunzip ... " if $VERBOSE > 2;
print STDERR " Attaching file with gzopen(..., \"rb\") ... " if $VERBOSE > 2; $self->{"gz"} = IO::Uncompress::Gunzip->new($FH)
$self->{"gz"} = gzopen($FH, "rb") or die "$THIS_FILE: $file: $!"; or die "$THIS_FILE: $file: $IO::Uncompress::Gunzip::GunzipError";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
return; return;
} }
@ -1620,9 +1619,9 @@ sub open_write : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
($self->{"file"}, $self->{"FH"}) = ($file, $FH); ($self->{"file"}, $self->{"FH"}) = ($file, $FH);
import Compress::Zlib qw(gzopen); print STDERR " Attaching file with IO::Compress::Gzip ... " if $VERBOSE > 2;
print STDERR " Attaching file with gzopen(..., \"wb9\") ... " if $VERBOSE > 2; $self->{"gz"} = IO::Compress::Gzip->new($FH)
$self->{"gz"} = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
return; return;
} }
@ -1641,7 +1640,6 @@ sub open_append : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
($self->{"file"}, $self->{"FH"}) = ($file, $FH); ($self->{"file"}, $self->{"FH"}) = ($file, $FH);
import Compress::Zlib qw(gzopen);
# Save the original data if file has content so that file size is # Save the original data if file has content so that file size is
# greater than 0. STDOUT is always of size 0. # greater than 0. STDOUT is always of size 0.
@ -1662,18 +1660,20 @@ sub open_append : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
# Decompress the buffer and save to our file # Decompress the buffer and save to our file
print STDERR " Attaching buffer with gzopen(..., \"rb\") ... " if $VERBOSE > 2; print STDERR " Attaching buffer with IO::Uncompress::Gunzip ... " if $VERBOSE > 2;
$gzt = gzopen($FHT, "rb") or die "$THIS_FILE: tempfile: $!"; $gzt = IO::Uncompress::Gunzip->new($FHT)
or die "$THIS_FILE: tempfile: $IO::Uncompress::Gunzip::GunzipError";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
print STDERR " Attaching file with gzopen(..., \"wb9\") ... " if $VERBOSE > 2; print STDERR " Attaching file with IO::Compress::Gzip ... " if $VERBOSE > 2;
$gz = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; $gz = IO::Compress::Gzip->new($FH)
or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
print STDERR " Reading old records back from the buffer ... " if $VERBOSE > 2; print STDERR " Reading old records back from the buffer ... " if $VERBOSE > 2;
$count = 0; $count = 0;
while (($n = $gzt->gzreadline($_)) != 0) { while (defined($_ = $gzt->getline)) {
die "$THIS_FILE: tempfile: " . $gz->gzerror if $n == -1; ($gz->write($_) == length $_)
($gz->gzwrite($_) == $n) or die "$THIS_FILE: $file: " . $gz->gzerror; or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
$count++; $count++;
} }
close $FHT or die "$THIS_FILE: tempfile: $!"; close $FHT or die "$THIS_FILE: tempfile: $!";
@ -1681,8 +1681,9 @@ sub open_append : method {
# A whole new file # A whole new file
} else { } else {
print STDERR " Attaching file with gzopen(..., \"wb9\") ... " if $VERBOSE > 2; print STDERR " Attaching file with IO::Compress::Gzip ... " if $VERBOSE > 2;
$gz = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; $gz = IO::Compress::Gzip->new($FH)
or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
@ -1692,13 +1693,7 @@ sub open_append : method {
# Read a line from the I/O stream # Read a line from the I/O stream
sub readline : method { sub readline : method {
local ($_, %_); return $_[0]->{"gz"}->getline();
my ($self, $file, $gz, $n);
$self = $_[0];
($file, $gz) = ($self->{"file"}, $self->{"gz"});
(($n = $gz->gzreadline($_)) != -1) or die "$THIS_FILE: $file: " . $gz->gzerror;
return undef if $n == 0;
return $_;
} }
# Output data to the I/O stream # Output data to the I/O stream
@ -1707,7 +1702,7 @@ sub write : method {
my ($self, $file, $gz); my ($self, $file, $gz);
($self, $_) = @_; ($self, $_) = @_;
($file, $gz) = ($self->{"file"}, $self->{"gz"}); ($file, $gz) = ($self->{"file"}, $self->{"gz"});
($gz->gzwrite($_) == length $_) or die "$THIS_FILE: $file: " . $gz->gzerror; ($gz->write($_) == length $_) or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
return; return;
} }
@ -1729,15 +1724,16 @@ sub close : method {
# Create empty compressed content # Create empty compressed content
print STDERR " Applying empty compressed content ... " if $VERBOSE > 2; print STDERR " Applying empty compressed content ... " if $VERBOSE > 2;
$_ = gzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; $_ = IO::Compress::Gzip->new($FH, Append => 0)
$_->gzclose and die "$THIS_FILE: $file: " . $_->gzerror; or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
$_->close or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
undef $_; undef $_;
undef $gz; undef $gz;
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
if (defined $gz) { if (defined $gz) {
$gz->gzclose and die "$THIS_FILE: $file: " . $gz->gzerror; $gz->close or die "$THIS_FILE: $file: $IO::Compress::Gzip::GzipError";
} }
CORE::close $self->{"FH"} if $self->{"FH"}->opened; CORE::close $self->{"FH"} if $self->{"FH"}->opened;
delete $self->{"gz"}; delete $self->{"gz"};
@ -2059,9 +2055,9 @@ sub open_read : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
($self->{"file"}, $self->{"FH"}) = ($file, $FH); ($self->{"file"}, $self->{"FH"}) = ($file, $FH);
import Compress::Bzip2 qw(bzopen); print STDERR " Attaching file with IO::Uncompress::Bunzip2 ... " if $VERBOSE > 2;
print STDERR " Attaching file with bzopen(..., \"rb\") ... " if $VERBOSE > 2; $self->{"bz"} = IO::Uncompress::Bunzip2->new($FH)
$self->{"bz"} = bzopen($FH, "rb") or die "$THIS_FILE: $file: $!"; or die "$THIS_FILE: $file: $IO::Uncompress::Bunzip2::Bunzip2Error";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
return; return;
} }
@ -2080,9 +2076,9 @@ sub open_write : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
($self->{"file"}, $self->{"FH"}) = ($file, $FH); ($self->{"file"}, $self->{"FH"}) = ($file, $FH);
import Compress::Bzip2 qw(bzopen); print STDERR " Attaching file with IO::Compress::Bzip2 ... " if $VERBOSE > 2;
print STDERR " Attaching file with bzopen(..., \"wb9\") ... " if $VERBOSE > 2; $self->{"bz"} = IO::Compress::Bzip2->new($FH)
$self->{"bz"} = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
return; return;
} }
@ -2101,7 +2097,6 @@ sub open_append : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
($self->{"file"}, $self->{"FH"}) = ($file, $FH); ($self->{"file"}, $self->{"FH"}) = ($file, $FH);
import Compress::Bzip2 qw(bzopen);
# Save the original data if file has content so that file size is # Save the original data if file has content so that file size is
# greater than 0. STDOUT is always of size 0. # greater than 0. STDOUT is always of size 0.
@ -2122,19 +2117,20 @@ sub open_append : method {
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
# Decompress the buffer and save to our file # Decompress the buffer and save to our file
print STDERR " Attaching buffer with bzopen(..., \"rb\") ... " if $VERBOSE > 2; print STDERR " Attaching buffer with IO::Uncompress::Bunzip2 ... " if $VERBOSE > 2;
$bzt = bzopen($FHT, "rb") or die "$THIS_FILE: tempfile: $!"; $bzt = IO::Uncompress::Bunzip2->new($FHT)
or die "$THIS_FILE: $file: $IO::Uncompress::Bunzip2::Bunzip2Error";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
print STDERR " Attaching file with bzopen(..., \"wb9\") ... " if $VERBOSE > 2; print STDERR " Attaching file with IO::Compress::Bzip2 ... " if $VERBOSE > 2;
$bz = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; $bz = IO::Compress::Bzip2->new($FH)
or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
print STDERR " Reading old records back from the buffer ... " if $VERBOSE > 2; print STDERR " Reading old records back from the buffer ... " if $VERBOSE > 2;
$count = 0; $count = 0;
while (($n = $bzt->bzreadline($_)) != 0) { while (defined($_ = $bzt->getline)) {
die "$THIS_FILE: tempfile: " . $bz->bzerror if $n == -1; ($bz->write($_) == length $_)
($bz->bzwrite($_, length $_) == length $_) or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
or die "$THIS_FILE: $file: " . $bz->bzerror;
$count++; $count++;
} }
close $FHT or die "$THIS_FILE: tempfile: $!"; close $FHT or die "$THIS_FILE: tempfile: $!";
@ -2142,8 +2138,9 @@ sub open_append : method {
# A whole new file # A whole new file
} else { } else {
print STDERR " Attaching file with bzopen(..., \"wb9\") ... " if $VERBOSE > 2; print STDERR " Attaching file with IO::Compress::Bzip2 ... " if $VERBOSE > 2;
$bz = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; $bz = IO::Compress::Bzip2->new($FH)
or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
@ -2153,13 +2150,7 @@ sub open_append : method {
# Read a line from the I/O stream # Read a line from the I/O stream
sub readline : method { sub readline : method {
local ($_, %_); return $_[0]->{"bz"}->getline();
my ($self, $file, $bz, $n);
$self = $_[0];
($file, $bz) = ($self->{"file"}, $self->{"bz"});
(($n = $bz->bzreadline($_)) != -1) or die "$THIS_FILE: $file: " . $bz->bzerror;
return undef if $n == 0;
return $_;
} }
# Output data to the I/O stream # Output data to the I/O stream
@ -2168,8 +2159,7 @@ sub write : method {
my ($self, $file, $bz); my ($self, $file, $bz);
($self, $_) = @_; ($self, $_) = @_;
($file, $bz) = ($self->{"file"}, $self->{"bz"}); ($file, $bz) = ($self->{"file"}, $self->{"bz"});
($bz->bzwrite($_, length $_) == length $_) ($bz->write($_) == length $_) or die "$THIS_FILE: $file: $IO::Compress::Xz::XzError";
or die "$THIS_FILE: $file: " . $bz->bzerror;
return; return;
} }
@ -2191,15 +2181,16 @@ sub close : method {
# Create empty compressed content # Create empty compressed content
print STDERR " Applying empty compressed content ... " if $VERBOSE > 2; print STDERR " Applying empty compressed content ... " if $VERBOSE > 2;
$_ = bzopen($FH, "wb9") or die "$THIS_FILE: $file: $!"; $_ = IO::Compress::Bzip2->new($FH)
$_->bzclose and die "$THIS_FILE: $file: " . $_->bzerror; or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
$_->close or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
undef $_; undef $_;
undef $bz; undef $bz;
print STDERR "done\n" if $VERBOSE > 2; print STDERR "done\n" if $VERBOSE > 2;
} }
if (defined $bz) { if (defined $bz) {
$bz->bzclose and die "$THIS_FILE: $file: " . $bz->bzerror; $bz->close or die "$THIS_FILE: $file: $IO::Compress::Bzip2::Bzip2Error";
} }
CORE::close $self->{"FH"} if $self->{"FH"}->opened; CORE::close $self->{"FH"} if $self->{"FH"}->opened;
delete $self->{"bz"}; delete $self->{"bz"};
@ -3201,20 +3192,22 @@ them.) The following compression methods are supported:
=item g, gzip =item g, gzip
Compress with L<gzip(1)|gzip/1>. This is the default. F<arclog> Compress with L<gzip(1)|gzip/1>. This is the default. F<arclog>
can use L<Compress::Zlib(3)|Compress::Zlib/3> to compress instead of can use L<IO::Compress::Gzip(3)|IO::Compress::Gzip/3> to compress
calling L<gzip(1)|gzip/1>. This can be safer and faster for not instead of calling L<gzip(1)|gzip/1>. This can be safer and faster
calling foreign binaries. if L<Compress::Zlib(3)|Compress::Zlib/3> for not calling foreign binaries. if
is not installed, it tries L<gzip(1)|gzip/1> instead. If L<IO::Compress::Gzip(3)|IO::Compress::Gzip/3> is not installed, it
L<gzip(1)|gzip/1> is not available, either, it fails. tries L<gzip(1)|gzip/1> instead. If L<gzip(1)|gzip/1> is not
available, either, it fails.
=item b, bzip2 =item b, bzip2
Compress with L<bzip2(1)|bzip2/1>. F<arclog> can use Compress with L<bzip2(1)|bzip2/1>. F<arclog> can use
L<Compress::Bzip2(3)|Compress::Bzip2/3> to compress instead of L<IO::Compress::Bzip2(3)|IO::Compress::Bzip2/3> to compress
calling L<bzip2(1)|bzip2/1>. This can be safer and faster for not instead of calling L<bzip2(1)|bzip2/1>. This can be safer and faster
calling foreign binaries. If L<Compress::Bzip2(3)|Compress::Bzip2/3> for not calling foreign binaries. If
is not installed, it will try to use L<bzip2(1)|bzip2/1> instead. If L<IO::Compress::Bzip2(3)|IO::Compress::Bzip2/3> is not installed, it
L<bzip2(1)|bzip2/1> is not available, either, it fails. will try to use L<bzip2(1)|bzip2/1> instead. If L<bzip2(1)|bzip2/1>
is not available, either, it fails.
=item x, xz =item x, xz
@ -3377,11 +3370,12 @@ messages.
=head1 SEE ALSO =head1 SEE ALSO
L<gzip(1)|gzip/1>, L<bzip2(1)|bzip2/1>, L<xz(1)|xz/1>, L<gzip(1)|gzip/1>, L<IO::Compress::Gzip(3)|IO::Compress::Gzip/3>,
L<Compress::Zlib(3)|Compress::Zlib/3>, L<syslog(1)|syslog/1>, L<IO::Uncompress::Gunzip(3)|IO::Uncompress::Gunzip/3>,
L<Compress::Bzip2(3)|Compress::Bzip2/3>, L<bzip2(1)|bzip2/1>, L<IO::Compress::Bzip2(3)|IO::Compress::Bzip2/3>,
L<IO::Compress::Xz(3)|IO::Compress::Xz/3>, L<IO::Uncompress::Bunzip2(3)|IO::Uncompress::Bunzip2/3>,
L<xz(1)|xz/1>, L<IO::Compress::Xz(3)|IO::Compress::Xz/3>,
L<IO::Uncompress::UnXz(3)|IO::Uncompress::UnXz/3>, L<IO::Uncompress::UnXz(3)|IO::Uncompress::UnXz/3>,
L<syslog(2)|syslog/2> L<syslog(1)|syslog/1>, L<syslog(2)|syslog/2>
=cut =cut

View File

@ -227,22 +227,20 @@ sub read_file($) {
# a gzip compressed file # a gzip compressed file
if ($file =~ /\.gz$/) { if ($file =~ /\.gz$/) {
# Compress::Zlib # IO::Uncompress::Gunzip
if (eval { require Compress::Zlib; if (eval { require IO::Uncompress::Gunzip; 1; }) {
Compress::Zlib->import(qw(gzopen));
1; }) {
use Compress::Zlib qw(gzopen);
my ($FH, $gz); my ($FH, $gz);
$content = ""; $content = "";
open $FH, $file or die this_file . ": $file: $!"; open $FH, $file or die this_file . ": $file: $!";
$gz = gzopen($FH, "rb") or die this_file . ": $file: $!"; $gz = IO::Uncompress::Gunzip->new($FH)
or die this_file . ": $file: $IO::Uncompress::Gunzip::GunzipError";
while (1) { while (1) {
($gz->gzread($_, 10240) != -1) ($gz->read($_, 10240) != -1)
or die this_file . ": $file: " . $gz->gzerror; or die this_file . ": $file: $IO::Uncompress::Gunzip::GunzipError";
$content .= $_; $content .= $_;
last if length $_ < 10240; last if length $_ < 10240;
} }
$gz->gzclose and die this_file . ": $file: " . $gz->gzerror; $gz->close or die this_file . ": $file: $IO::Uncompress::Gunzip::GunzipError";
return $content; return $content;
# gzip executable # gzip executable
@ -258,22 +256,20 @@ sub read_file($) {
# a bzip compressed file # a bzip compressed file
} elsif ($file =~ /\.bz2$/) { } elsif ($file =~ /\.bz2$/) {
# Compress::Bzip2 # IO::Uncompress::Bunzip2
if (eval { require Compress::Bzip2; if (eval { require IO::Uncompress::Bunzip2; 1; }) {
Compress::Bzip2->import(2.00);
Compress::Bzip2->import(qw(bzopen));
1; }) {
my ($FH, $bz); my ($FH, $bz);
$content = ""; $content = "";
open $FH, $file or die this_file . ": $file: $!"; open $FH, $file or die this_file . ": $file: $!";
$bz = bzopen($FH, "rb") or die this_file . ": $file: $!"; $bz = IO::Uncompress::Bunzip2->new($FH)
or die this_file . ": $file: $IO::Uncompress::Bunzip2::Bunzip2Error";
while (1) { while (1) {
($bz->bzread($_, 10240) != -1) ($bz->read($_, 10240) != -1)
or die this_file . ": $file: " . $bz->bzerror; or die this_file . ": $file: $IO::Uncompress::Bunzip2::Bunzip2Error";
$content .= $_; $content .= $_;
last if length $_ < 10240; last if length $_ < 10240;
} }
$bz->bzclose and die this_file . ": $file: " . $bz->bzerror; $bz->close or die this_file . ": $file: $IO::Uncompress::Bunzip2::Bunzip2Error";
return $content; return $content;
# bzip2 executable # bzip2 executable
@ -353,16 +349,15 @@ sub write_file($$) {
# a gzip compressed file # a gzip compressed file
if ($file =~ /\.gz$/) { if ($file =~ /\.gz$/) {
# Compress::Zlib # IO::Compress::Gzip
if (eval { require Compress::Zlib; if (eval { require IO::Compress::Gzip; 1; }) {
Compress::Zlib->import(qw(gzopen));
1; }) {
my ($FH, $gz); my ($FH, $gz);
open $FH, ">$file" or die this_file . ": $file: $!"; open $FH, ">$file" or die this_file . ": $file: $!";
$gz = gzopen($FH, "wb9") or die this_file . ": $file: $!"; $gz = IO::Compress::Gzip->new($FH)
($gz->gzwrite($content) == length $content) or die this_file . ": $file: $IO::Compress::Gzip::GzipError";
or die this_file . ": $file: " . $gz->gzerror; ($gz->write($content, length $content) == length $content)
$gz->gzclose and die this_file . ": $file: " . $gz->gzerror; or die this_file . ": $file: $IO::Compress::Gzip::GzipError";
$gz->close or die this_file . ": $file: $IO::Compress::Gzip::GzipError";
return; return;
# gzip executable # gzip executable
@ -378,17 +373,15 @@ sub write_file($$) {
# a bzip compressed file # a bzip compressed file
} elsif ($file =~ /\.bz2$/) { } elsif ($file =~ /\.bz2$/) {
# Compress::Bzip2 # IO::Compress::Bzip2
if (eval { require Compress::Bzip2; if (eval { require IO::Compress::Bzip2; 1; }) {
Compress::Bzip2->import(2.00);
Compress::Bzip2->import(qw(bzopen));
1; }) {
my ($FH, $bz); my ($FH, $bz);
open $FH, ">$file" or die this_file . ": $file: $!"; open $FH, ">$file" or die this_file . ": $file: $!";
$bz = bzopen($FH, "wb9") or die this_file . ": $file: $!"; $bz = IO::Compress::Bzip2->new($FH)
($bz->bzwrite($content, length $content) == length $content) or die this_file . ": $file: $IO::Compress::Bzip2::Bzip2Error";
or die this_file . ": $file: " . $bz->bzerror; ($bz->write($content, length $content) == length $content)
$bz->bzclose and die this_file . ": $file: " . $bz->bzerror; or die this_file . ": $file: $IO::Compress::Bzip2::Bzip2Error";
$bz->close or die this_file . ": $file: $IO::Compress::Bzip2::Bzip2Error";
return; return;
# bzip2 executable # bzip2 executable
@ -601,18 +594,18 @@ sub has_no_file() {
# If we have gzip support somewhere # If we have gzip support somewhere
sub has_no_gzip() { sub has_no_gzip() {
$HAS_NO_GZIP = eval { require Compress::Zlib; 1; } $HAS_NO_GZIP = eval { require IO::Compress::Gzip; require IO::Uncompress::Gunzip; 1; }
|| defined where_is "gzip"? || defined where_is "gzip"?
0: "Compress::Zlib or gzip executable not available" 0: "IO::Compress::Gzip or gzip executable not available"
if !defined $HAS_NO_GZIP; if !defined $HAS_NO_GZIP;
return $HAS_NO_GZIP; return $HAS_NO_GZIP;
} }
# If we have bzip2 support somewhere # If we have bzip2 support somewhere
sub has_no_bzip2() { sub has_no_bzip2() {
$HAS_NO_BZIP2 = eval { require Compress::Bzip2; Compress::Bzip2->import(2.00); 1; } $HAS_NO_BZIP2 = eval { require IO::Compress::Bzip2; require IO::Uncompress::Bunzip2; 1; }
|| defined where_is "bzip2"? || defined where_is "bzip2"?
0: "Compress::Bzip2 v2 or bzip2 executable not available" 0: "IO::Compress::Bzip2 v2 or bzip2 executable not available"
if !defined $HAS_NO_BZIP2; if !defined $HAS_NO_BZIP2;
return $HAS_NO_BZIP2; return $HAS_NO_BZIP2;
} }