xref: /openbsd-src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm (revision e068048151d29f2562a32185e21a8ba885482260)
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