CC: | jkeenan [...] cpan.org |
Subject: | [RT #113390] Net::FTP notice read() error on local file |
The following bug report was filed in the Perl 5 bug queue at https://rt.perl.org/rt3/Ticket/Display.html?id=113390 in May 2012. Net::FTP is part of the libnet distribution, which is now marked in Perl 5's Porting/Maintainers.pl as being maintained on CPAN. Accordingly, I am transferring the bug report to this queue.--jkeenan
##########
In Net::FTP version 2.77, when doing a put() if there's an error from
read() it seems to be silently treated as normal eof, where I hoped it
would gives some sort of error.
I see the code notices an error from binmode(), or socket write() and
close(), and gives an undef return, but apparently not for read()
trouble.
The foo.pl below simulates a read error with a tied file handle.
I wonder if the $ftp->put() could return undef in this case.
Dunno if it should also carp() or $ftp->message() or whatever for such local errors. Carp might be alright for interactive use, but from a program you'd prefer to get a message or something and display it in your own way. I suppose for compatibility any change to carp vs message or $! etc might have to be just an option.
Subject: | foo.pl |
use strict;
use Net::FTP;
use Tie::StdHandle;
use POSIX;
{
package MyTie;
use base 'Tie::StdHandle';
my $reads = 0;
sub READ {
if ($reads++ == 0) {
$_[1] = 'abc';
return 3;
} else {
print "Pretend read error\n";
$! = POSIX::EIO();
return undef;
}
}
}
tie *FH, 'MyTie', '</etc/motd';
my $ftp = Net::FTP->new("localhost")
or die "Cannot connect: $@";
$ftp->login("anonymous",'')
or die "Cannot login: ", $ftp->message;
$ftp->cwd("/pub")
or die "Cannot cwd: ", $ftp->message;
$ftp->delete("dummy.txt")
or die "Cannot delete: ", $ftp->message;
my $ret = $ftp->put (\*FH, 'dummy.txt');
if (defined $ret) {
print "remote filename: $ret\n";
} else {
print "Cannot put: ", $ftp->message;
}
$ftp->quit;