1b8851fccSafresh1## 2b8851fccSafresh1## Package to read/write on ASCII data connections 3b8851fccSafresh1## 4b8851fccSafresh1 5b8851fccSafresh1package Net::FTP::A; 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,[$offset])'; 25b8851fccSafresh1 my $timeout = @_ ? shift: $data->timeout; 26b8851fccSafresh1 27b8851fccSafresh1 if (length(${*$data}) < $size && !${*$data}{'net_ftp_eof'}) { 28b8851fccSafresh1 my $blksize = ${*$data}{'net_ftp_blksize'}; 29b8851fccSafresh1 $blksize = $size if $size > $blksize; 30b8851fccSafresh1 31b8851fccSafresh1 my $l = 0; 32b8851fccSafresh1 my $n; 33b8851fccSafresh1 34b8851fccSafresh1 READ: 35b8851fccSafresh1 { 36b8851fccSafresh1 my $readbuf = defined(${*$data}{'net_ftp_cr'}) ? "\015" : ''; 37b8851fccSafresh1 38b8851fccSafresh1 $data->can_read($timeout) 39b8851fccSafresh1 or croak "Timeout"; 40b8851fccSafresh1 41b8851fccSafresh1 if ($n = sysread($data, $readbuf, $blksize, length $readbuf)) { 42b8851fccSafresh1 ${*$data}{'net_ftp_bytesread'} += $n; 43b8851fccSafresh1 ${*$data}{'net_ftp_cr'} = 44b8851fccSafresh1 substr($readbuf, -1) eq "\015" 45b8851fccSafresh1 ? chop($readbuf) 46b8851fccSafresh1 : undef; 47b8851fccSafresh1 } 48b8851fccSafresh1 else { 49b8851fccSafresh1 return 50b8851fccSafresh1 unless defined $n; 51b8851fccSafresh1 52b8851fccSafresh1 ${*$data}{'net_ftp_eof'} = 1; 53b8851fccSafresh1 } 54b8851fccSafresh1 55b8851fccSafresh1 $readbuf =~ s/\015\012/\n/sgo; 56b8851fccSafresh1 ${*$data} .= $readbuf; 57b8851fccSafresh1 58b8851fccSafresh1 unless (length(${*$data})) { 59b8851fccSafresh1 60b8851fccSafresh1 redo READ 61b8851fccSafresh1 if ($n > 0); 62b8851fccSafresh1 63b8851fccSafresh1 $size = length(${*$data}) 64b8851fccSafresh1 if ($n == 0); 65b8851fccSafresh1 } 66b8851fccSafresh1 } 67b8851fccSafresh1 } 68b8851fccSafresh1 69b8851fccSafresh1 $buf = substr(${*$data}, 0, $size); 70b8851fccSafresh1 substr(${*$data}, 0, $size) = ''; 71b8851fccSafresh1 72b8851fccSafresh1 length $buf; 73b8851fccSafresh1} 74b8851fccSafresh1 75b8851fccSafresh1 76b8851fccSafresh1sub write { 77b8851fccSafresh1 my $data = shift; 78b8851fccSafresh1 local *buf = \$_[0]; 79b8851fccSafresh1 shift; 80b8851fccSafresh1 my $size = shift || croak 'write($buf,$size,[$timeout])'; 81b8851fccSafresh1 my $timeout = @_ ? shift: $data->timeout; 82b8851fccSafresh1 83b8851fccSafresh1 my $nr = (my $tmp = substr($buf, 0, $size)) =~ tr/\r\n/\015\012/; 84b8851fccSafresh1 $tmp =~ s/(?<!\015)\012/\015\012/sg if $nr; 85b8851fccSafresh1 $tmp =~ s/^\015// if ${*$data}{'net_ftp_outcr'}; 86b8851fccSafresh1 ${*$data}{'net_ftp_outcr'} = substr($tmp, -1) eq "\015"; 87b8851fccSafresh1 88b8851fccSafresh1 # If the remote server has closed the connection we will be signal'd 89b8851fccSafresh1 # when we write. This can happen if the disk on the remote server fills up 90b8851fccSafresh1 91b8851fccSafresh1 local $SIG{PIPE} = 'IGNORE' 92b8851fccSafresh1 unless ($SIG{PIPE} || '') eq 'IGNORE' 93b8851fccSafresh1 or $^O eq 'MacOS'; 94b8851fccSafresh1 95b8851fccSafresh1 my $len = length($tmp); 96b8851fccSafresh1 my $off = 0; 97b8851fccSafresh1 my $wrote = 0; 98b8851fccSafresh1 99b8851fccSafresh1 my $blksize = ${*$data}{'net_ftp_blksize'}; 100b8851fccSafresh1 101b8851fccSafresh1 while ($len) { 102b8851fccSafresh1 $data->can_write($timeout) 103b8851fccSafresh1 or croak "Timeout"; 104b8851fccSafresh1 105b8851fccSafresh1 $off += $wrote; 106b8851fccSafresh1 $wrote = syswrite($data, substr($tmp, $off), $len > $blksize ? $blksize : $len); 107b8851fccSafresh1 return 108b8851fccSafresh1 unless defined($wrote); 109b8851fccSafresh1 $len -= $wrote; 110b8851fccSafresh1 } 111b8851fccSafresh1 112b8851fccSafresh1 $size; 113b8851fccSafresh1} 114b8851fccSafresh1 115b8851fccSafresh11; 116