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