Commit | Line | Data |
b3f6f6a6 |
1 | ## |
406c51ee |
2 | ## Package to read/write on BINARY data connections |
3 | ## |
4 | |
5 | package Net::FTP::I; |
6 | |
7 | use vars qw(@ISA $buf $VERSION); |
8 | use Carp; |
9 | |
10 | require Net::FTP::dataconn; |
11 | |
b3f6f6a6 |
12 | @ISA = qw(Net::FTP::dataconn); |
13 | $VERSION = "1.12"; |
14 | |
406c51ee |
15 | |
16 | sub 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 |
50 | sub 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 | |
80 | 1; |