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