if ($^O eq "MSWin32") {
$fh = $_[0];
}
where later on, this is done with it:
$fh = Compress::Zlib::gzdopen_ ($fh, $mode, 0)
gzdopen_ is a low level function in Compress::Zlib. Well, guess what: this function expect a fileno, not a handle. So this fails. This does _drat() (it should either goto &_drat; or return _drat();, but not just call _drat()). $! is not set, so $error isn't set to a true value, and that's why it fails in such an ungraceful way. But I digress.
The solution is simple: set
if ($^O eq "MSWin32") {
$fh = fileno($_[0]);
}
instead. And now all tests succeed.
Here's the whole diff (for Archive-Tar-0.22.tar.gz):
--- Tar.pm Fri Apr 28 00:50:16 2000
+++ blib/lib/Archive/Tar.pm Sat Aug 24 15:06:04 2002
@@ -79,7 +79,7 @@
my $error;
sub _drat {
- $error = $! . '';
+ $error = $! . '' || 'unknown error';
return;
}
@@ -235,7 +235,7 @@
or goto &_drat;
if ($^O eq "MSWin32") {
- $fh = $_[0];
+ $fh = fileno($_[0]);
}
else {
$fh = fcntl ($_[0], F_DUPFD, 0)
@@ -248,7 +248,7 @@
# $fh = Compress::Zlib::gzopen ($_[0], $mode)
# or &_drat;
$fh = Compress::Zlib::gzdopen_ ($fh, $mode, 0)
- or &_drat;
+ or goto &_drat;
}
else {
$flags = fcntl ($_[0], F_GETFL, 0) & (O_RDONLY | O_WRONLY | O_RDWR
+);
I'll try to warn the maintainer. |