Commit | Line | Data |
12df23ee |
1 | ## $Id: //depot/libnet/Net/FTP/I.pm#13 $ |
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 | |
12 | @ISA = qw(Net::FTP::dataconn); |
12df23ee |
13 | $VERSION = "1.12"; |
406c51ee |
14 | |
15 | sub 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 | |
12df23ee |
21 | my $n; |
406c51ee |
22 | |
12df23ee |
23 | if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) { |
24 | $data->can_read($timeout) or |
25 | croak "Timeout"; |
406c51ee |
26 | |
12df23ee |
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 | } |
406c51ee |
34 | } |
35 | |
12df23ee |
36 | $buf = substr(${*$data},0,$size); |
37 | |
38 | $n = length($buf); |
406c51ee |
39 | |
406c51ee |
40 | substr(${*$data},0,$n) = ''; |
41 | |
12df23ee |
42 | ${*$data}{'net_ftp_bytesread'} += $n; |
406c51ee |
43 | |
44 | $n; |
45 | } |
46 | |
47 | sub 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 | |
406c51ee |
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 | |
686337f3 |
56 | local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS'; |
406c51ee |
57 | my $sent = $size; |
58 | my $off = 0; |
59 | |
686337f3 |
60 | my $blksize = ${*$data}{'net_ftp_blksize'}; |
406c51ee |
61 | while($sent > 0) { |
686337f3 |
62 | $data->can_write($timeout) or |
63 | croak "Timeout"; |
64 | |
65 | my $n = syswrite($data, $buf, $sent > $blksize ? $blksize : $sent ,$off); |
406c51ee |
66 | return undef unless defined($n); |
67 | $sent -= $n; |
68 | $off += $n; |
69 | } |
70 | |
71 | $size; |
72 | } |
73 | |
74 | 1; |