1## $Id: //depot/libnet/Net/FTP/I.pm#13 $
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
12@ISA = qw(Net::FTP::dataconn);
13$VERSION = "1.12";
14
15sub 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
47sub 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
741;
75