diff options
author | Graham Barr <gbarr@pobox.com> | 2002-04-02 16:05:12 +0000 |
---|---|---|
committer | Graham Barr <gbarr@pobox.com> | 2002-04-02 16:05:12 +0000 |
commit | d79ae8876726e4307626602b888bb1d1a82519fa (patch) | |
tree | b7362105c5c1a9e8fff1fc7ca3d91a1e765c4841 | |
parent | 4bc0338e683fd0e2910baaeee9010f63deb3e9ab (diff) | |
download | perl-libnet-d79ae8876726e4307626602b888bb1d1a82519fa.tar.gz |
Net::FTP::dataconn
- Fix for select to avoid occasional hangups
-rw-r--r-- | Net/FTP/dataconn.pm | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/Net/FTP/dataconn.pm b/Net/FTP/dataconn.pm index 6ca437b..7ec1458 100644 --- a/Net/FTP/dataconn.pm +++ b/Net/FTP/dataconn.pm @@ -7,8 +7,9 @@ package Net::FTP::dataconn; use Carp; use vars qw(@ISA $timeout $VERSION); use Net::Cmd; +use Errno; -$VERSION = '0.10'; +$VERSION = '0.11'; @ISA = qw(IO::Socket::INET); sub reading @@ -74,44 +75,34 @@ sub close $ftp->status == CMD_OK; } -sub _select -{ - my $data = shift; - local *timeout = \$_[0]; shift; - my $rw = shift; - - my($rin,$win); - - return 1 unless $timeout; +sub _select { + my ($data, $timeout, $do_read) = @_; + my ($rin,$rout,$win,$wout,$tout,$nfound); - $rin = ''; - vec($rin,fileno($data),1) = 1; + vec($rin='',fileno($data),1) = 1; - $win = $rw ? undef : $rin; - $rin = undef unless $rw; + ($win, $rin) = ($rin, $win) unless $do_read; - my $nfound = select($rin, $win, undef, $timeout); + while (1) { + $nfound = select($rout=$rin, $wout=$win, undef, $tout=$timeout); - croak "select: $!" - if $nfound < 0; + last if $nfound >= 0; + + croak "select: $!" + unless $!{EINTR}; + } - return $nfound; + $nfound; } sub can_read { - my $data = shift; - local *timeout = \$_[0]; - - $data->_select($timeout,1); + _select(@_[0,1],1); } sub can_write { - my $data = shift; - local *timeout = \$_[0]; - - $data->_select($timeout,0); + _select(@_[0,1],0); } sub cmd |