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