about summary refs log tree commit
diff options
context:
space:
mode:
authorGraham Barr <gbarr@pobox.com>2002-04-02 16:05:12 +0000
committerGraham Barr <gbarr@pobox.com>2002-04-02 16:05:12 +0000
commitd79ae8876726e4307626602b888bb1d1a82519fa (patch)
treeb7362105c5c1a9e8fff1fc7ca3d91a1e765c4841
parent4bc0338e683fd0e2910baaeee9010f63deb3e9ab (diff)
downloadperl-libnet-d79ae8876726e4307626602b888bb1d1a82519fa.tar.gz
Net::FTP::dataconn
- Fix for select to avoid occasional hangups

-rw-r--r--Net/FTP/dataconn.pm43
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