1b8851fccSafresh1## 2b8851fccSafresh1## Package to read/write on BINARY data connections 3b8851fccSafresh1## 4b8851fccSafresh1 5b8851fccSafresh1package Net::FTP::I; 6b8851fccSafresh1 7b8851fccSafresh1use 5.008001; 8b8851fccSafresh1 9b8851fccSafresh1use strict; 10b8851fccSafresh1use warnings; 11b8851fccSafresh1 12b8851fccSafresh1use Carp; 13b8851fccSafresh1use Net::FTP::dataconn; 14b8851fccSafresh1 15b8851fccSafresh1our @ISA = qw(Net::FTP::dataconn); 16*e0680481Safresh1our $VERSION = "3.15"; 17b8851fccSafresh1 18b8851fccSafresh1our $buf; 19b8851fccSafresh1 20b8851fccSafresh1sub read { 21b8851fccSafresh1 my $data = shift; 22b8851fccSafresh1 local *buf = \$_[0]; 23b8851fccSafresh1 shift; 24b8851fccSafresh1 my $size = shift || croak 'read($buf,$size,[$timeout])'; 25b8851fccSafresh1 my $timeout = @_ ? shift: $data->timeout; 26b8851fccSafresh1 27b8851fccSafresh1 my $n; 28b8851fccSafresh1 29b8851fccSafresh1 if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) { 30b8851fccSafresh1 $data->can_read($timeout) 31b8851fccSafresh1 or croak "Timeout"; 32b8851fccSafresh1 33b8851fccSafresh1 my $blksize = ${*$data}{'net_ftp_blksize'}; 34b8851fccSafresh1 $blksize = $size if $size > $blksize; 35b8851fccSafresh1 36b8851fccSafresh1 unless ($n = sysread($data, ${*$data}, $blksize, length ${*$data})) { 37b8851fccSafresh1 return unless defined $n; 38b8851fccSafresh1 ${*$data}{'net_ftp_eof'} = 1; 39b8851fccSafresh1 } 40b8851fccSafresh1 } 41b8851fccSafresh1 42b8851fccSafresh1 $buf = substr(${*$data}, 0, $size); 43b8851fccSafresh1 44b8851fccSafresh1 $n = length($buf); 45b8851fccSafresh1 46b8851fccSafresh1 substr(${*$data}, 0, $n) = ''; 47b8851fccSafresh1 48b8851fccSafresh1 ${*$data}{'net_ftp_bytesread'} += $n; 49b8851fccSafresh1 50b8851fccSafresh1 $n; 51b8851fccSafresh1} 52b8851fccSafresh1 53b8851fccSafresh1 54b8851fccSafresh1sub write { 55b8851fccSafresh1 my $data = shift; 56b8851fccSafresh1 local *buf = \$_[0]; 57b8851fccSafresh1 shift; 58b8851fccSafresh1 my $size = shift || croak 'write($buf,$size,[$timeout])'; 59b8851fccSafresh1 my $timeout = @_ ? shift: $data->timeout; 60b8851fccSafresh1 61b8851fccSafresh1 # If the remote server has closed the connection we will be signal'd 62b8851fccSafresh1 # when we write. This can happen if the disk on the remote server fills up 63b8851fccSafresh1 64b8851fccSafresh1 local $SIG{PIPE} = 'IGNORE' 65b8851fccSafresh1 unless ($SIG{PIPE} || '') eq 'IGNORE' 66b8851fccSafresh1 or $^O eq 'MacOS'; 67b8851fccSafresh1 my $sent = $size; 68b8851fccSafresh1 my $off = 0; 69b8851fccSafresh1 70b8851fccSafresh1 my $blksize = ${*$data}{'net_ftp_blksize'}; 71b8851fccSafresh1 while ($sent > 0) { 72b8851fccSafresh1 $data->can_write($timeout) 73b8851fccSafresh1 or croak "Timeout"; 74b8851fccSafresh1 75b8851fccSafresh1 my $n = syswrite($data, $buf, $sent > $blksize ? $blksize : $sent, $off); 76b8851fccSafresh1 return unless defined($n); 77b8851fccSafresh1 $sent -= $n; 78b8851fccSafresh1 $off += $n; 79b8851fccSafresh1 } 80b8851fccSafresh1 81b8851fccSafresh1 $size; 82b8851fccSafresh1} 83b8851fccSafresh1 84b8851fccSafresh11; 85