xref: /openbsd-src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm (revision e068048151d29f2562a32185e21a8ba885482260)
1b8851fccSafresh1##
2b8851fccSafresh1## Generic data connection package
3b8851fccSafresh1##
4b8851fccSafresh1
5b8851fccSafresh1package Net::FTP::dataconn;
6b8851fccSafresh1
7b8851fccSafresh1use 5.008001;
8b8851fccSafresh1
9b8851fccSafresh1use strict;
10b8851fccSafresh1use warnings;
11b8851fccSafresh1
12b8851fccSafresh1use Carp;
13b8851fccSafresh1use Errno;
14b8851fccSafresh1use Net::Cmd;
15b8851fccSafresh1
16*e0680481Safresh1our $VERSION = '3.15';
17b8851fccSafresh1
18b8851fccSafresh1$Net::FTP::IOCLASS or die "please load Net::FTP before Net::FTP::dataconn";
19b8851fccSafresh1our @ISA = $Net::FTP::IOCLASS;
20b8851fccSafresh1
21b8851fccSafresh1sub reading {
22b8851fccSafresh1  my $data = shift;
23b8851fccSafresh1  ${*$data}{'net_ftp_bytesread'} = 0;
24b8851fccSafresh1}
25b8851fccSafresh1
26b8851fccSafresh1
27b8851fccSafresh1sub abort {
28b8851fccSafresh1  my $data = shift;
29b8851fccSafresh1  my $ftp  = ${*$data}{'net_ftp_cmd'};
30b8851fccSafresh1
31b8851fccSafresh1  # no need to abort if we have finished the xfer
32b8851fccSafresh1  return $data->close
33b8851fccSafresh1    if ${*$data}{'net_ftp_eof'};
34b8851fccSafresh1
35b8851fccSafresh1  # for some reason if we continuously open RETR connections and not
36b8851fccSafresh1  # read a single byte, then abort them after a while the server will
37b8851fccSafresh1  # close our connection, this prevents the unexpected EOF on the
38b8851fccSafresh1  # command channel -- GMB
39b8851fccSafresh1  if (exists ${*$data}{'net_ftp_bytesread'}
40b8851fccSafresh1    && (${*$data}{'net_ftp_bytesread'} == 0))
41b8851fccSafresh1  {
42b8851fccSafresh1    my $buf     = "";
43b8851fccSafresh1    my $timeout = $data->timeout;
44b8851fccSafresh1    $data->can_read($timeout) && sysread($data, $buf, 1);
45b8851fccSafresh1  }
46b8851fccSafresh1
47b8851fccSafresh1  ${*$data}{'net_ftp_eof'} = 1;    # fake
48b8851fccSafresh1
49b8851fccSafresh1  $ftp->abort;                     # this will close me
50b8851fccSafresh1}
51b8851fccSafresh1
52b8851fccSafresh1
53b8851fccSafresh1sub _close {
54b8851fccSafresh1  my $data = shift;
55b8851fccSafresh1  my $ftp  = ${*$data}{'net_ftp_cmd'};
56b8851fccSafresh1
57b8851fccSafresh1  $data->SUPER::close();
58b8851fccSafresh1
59b8851fccSafresh1  delete ${*$ftp}{'net_ftp_dataconn'}
60b8851fccSafresh1    if defined $ftp
61b8851fccSafresh1    && exists ${*$ftp}{'net_ftp_dataconn'}
62b8851fccSafresh1    && $data == ${*$ftp}{'net_ftp_dataconn'};
63b8851fccSafresh1}
64b8851fccSafresh1
65b8851fccSafresh1
66b8851fccSafresh1sub close {
67b8851fccSafresh1  my $data = shift;
68b8851fccSafresh1  my $ftp  = ${*$data}{'net_ftp_cmd'};
69b8851fccSafresh1
70b8851fccSafresh1  if (exists ${*$data}{'net_ftp_bytesread'} && !${*$data}{'net_ftp_eof'}) {
71b8851fccSafresh1    my $junk;
72b8851fccSafresh1    eval { local($SIG{__DIE__}); $data->read($junk, 1, 0) };
73b8851fccSafresh1    return $data->abort unless ${*$data}{'net_ftp_eof'};
74b8851fccSafresh1  }
75b8851fccSafresh1
76b8851fccSafresh1  $data->_close;
77b8851fccSafresh1
78b8851fccSafresh1  return unless defined $ftp;
79b8851fccSafresh1
80b8851fccSafresh1  $ftp->response() == CMD_OK
81b8851fccSafresh1    && $ftp->message =~ /unique file name:\s*(\S*)\s*\)/
82b8851fccSafresh1    && (${*$ftp}{'net_ftp_unique'} = $1);
83b8851fccSafresh1
84b8851fccSafresh1  $ftp->status == CMD_OK;
85b8851fccSafresh1}
86b8851fccSafresh1
87b8851fccSafresh1
88b8851fccSafresh1sub _select {
89b8851fccSafresh1  my ($data, $timeout, $do_read) = @_;
90b8851fccSafresh1  my ($rin, $rout, $win, $wout, $tout, $nfound);
91b8851fccSafresh1
92b8851fccSafresh1  vec($rin = '', fileno($data), 1) = 1;
93b8851fccSafresh1
94b8851fccSafresh1  ($win, $rin) = ($rin, $win) unless $do_read;
95b8851fccSafresh1
96b8851fccSafresh1  while (1) {
97b8851fccSafresh1    $nfound = select($rout = $rin, $wout = $win, undef, $tout = $timeout);
98b8851fccSafresh1
99b8851fccSafresh1    last if $nfound >= 0;
100b8851fccSafresh1
101b8851fccSafresh1    croak "select: $!"
102b8851fccSafresh1      unless $!{EINTR};
103b8851fccSafresh1  }
104b8851fccSafresh1
105b8851fccSafresh1  $nfound;
106b8851fccSafresh1}
107b8851fccSafresh1
108b8851fccSafresh1
109b8851fccSafresh1sub can_read {
110b8851fccSafresh1  _select(@_[0, 1], 1);
111b8851fccSafresh1}
112b8851fccSafresh1
113b8851fccSafresh1
114b8851fccSafresh1sub can_write {
115b8851fccSafresh1  _select(@_[0, 1], 0);
116b8851fccSafresh1}
117b8851fccSafresh1
118b8851fccSafresh1
119b8851fccSafresh1sub cmd {
120b8851fccSafresh1  my $ftp = shift;
121b8851fccSafresh1
122b8851fccSafresh1  ${*$ftp}{'net_ftp_cmd'};
123b8851fccSafresh1}
124b8851fccSafresh1
125b8851fccSafresh1
126b8851fccSafresh1sub bytes_read {
127b8851fccSafresh1  my $ftp = shift;
128b8851fccSafresh1
129b8851fccSafresh1  ${*$ftp}{'net_ftp_bytesread'} || 0;
130b8851fccSafresh1}
131b8851fccSafresh1
132b8851fccSafresh11;
133b8851fccSafresh1
134b8851fccSafresh1__END__
135b8851fccSafresh1
136b8851fccSafresh1=head1 NAME
137b8851fccSafresh1
138b8851fccSafresh1Net::FTP::dataconn - FTP Client data connection class
139b8851fccSafresh1
140eac174f2Safresh1=head1 SYNOPSIS
141eac174f2Safresh1
142eac174f2Safresh1    # Perform IO operations on an FTP client data connection object:
143eac174f2Safresh1
144eac174f2Safresh1    $num_bytes_read = $obj->read($buffer, $size);
145eac174f2Safresh1    $num_bytes_read = $obj->read($buffer, $size, $timeout);
146eac174f2Safresh1
147eac174f2Safresh1    $num_bytes_written = $obj->write($buffer, $size);
148eac174f2Safresh1    $num_bytes_written = $obj->write($buffer, $size, $timeout);
149eac174f2Safresh1
150eac174f2Safresh1    $num_bytes_read_so_far = $obj->bytes_read();
151eac174f2Safresh1
152eac174f2Safresh1    $obj->abort();
153eac174f2Safresh1
154eac174f2Safresh1    $closed_successfully = $obj->close();
155eac174f2Safresh1
156b8851fccSafresh1=head1 DESCRIPTION
157b8851fccSafresh1
158b8851fccSafresh1Some of the methods defined in C<Net::FTP> return an object which will
159b8851fccSafresh1be derived from this class. The dataconn class itself is derived from
160b8851fccSafresh1the C<IO::Socket::INET> class, so any normal IO operations can be performed.
161b8851fccSafresh1However the following methods are defined in the dataconn class and IO should
162b8851fccSafresh1be performed using these.
163b8851fccSafresh1
164b8851fccSafresh1=over 4
165b8851fccSafresh1
166eac174f2Safresh1=item C<read($buffer, $size[, $timeout])>
167b8851fccSafresh1
168eac174f2Safresh1Read C<$size> bytes of data from the server and place it into C<$buffer>, also
169eac174f2Safresh1performing any <CRLF> translation necessary. C<$timeout> is optional, if not
170b8851fccSafresh1given, the timeout value from the command connection will be used.
171b8851fccSafresh1
172b8851fccSafresh1Returns the number of bytes read before any <CRLF> translation.
173b8851fccSafresh1
174eac174f2Safresh1=item C<write($buffer, $size[, $timeout])>
175b8851fccSafresh1
176eac174f2Safresh1Write C<$size> bytes of data from C<$buffer> to the server, also
177eac174f2Safresh1performing any <CRLF> translation necessary. C<$timeout> is optional, if not
178b8851fccSafresh1given, the timeout value from the command connection will be used.
179b8851fccSafresh1
180b8851fccSafresh1Returns the number of bytes written before any <CRLF> translation.
181b8851fccSafresh1
182eac174f2Safresh1=item C<bytes_read()>
183b8851fccSafresh1
184b8851fccSafresh1Returns the number of bytes read so far.
185b8851fccSafresh1
186eac174f2Safresh1=item C<abort()>
187b8851fccSafresh1
188b8851fccSafresh1Abort the current data transfer.
189b8851fccSafresh1
190eac174f2Safresh1=item C<close()>
191b8851fccSafresh1
192b8851fccSafresh1Close the data connection and get a response from the FTP server. Returns
193b8851fccSafresh1I<true> if the connection was closed successfully and the first digit of
194b8851fccSafresh1the response from the server was a '2'.
195b8851fccSafresh1
196b8851fccSafresh1=back
197b8851fccSafresh1
198eac174f2Safresh1=head1 EXPORTS
199eac174f2Safresh1
200eac174f2Safresh1I<None>.
201eac174f2Safresh1
202eac174f2Safresh1=head1 KNOWN BUGS
203eac174f2Safresh1
204eac174f2Safresh1I<None>.
205eac174f2Safresh1
206eac174f2Safresh1=head1 AUTHOR
207eac174f2Safresh1
208eac174f2Safresh1Graham Barr E<lt>L<gbarr@pobox.com|mailto:gbarr@pobox.com>E<gt>.
209eac174f2Safresh1
210eac174f2Safresh1Steve Hay E<lt>L<shay@cpan.org|mailto:shay@cpan.org>E<gt> is now maintaining
211eac174f2Safresh1libnet as of version 1.22_02.
212eac174f2Safresh1
213eac174f2Safresh1=head1 COPYRIGHT
214eac174f2Safresh1
215eac174f2Safresh1Copyright (C) 1997-2010 Graham Barr.  All rights reserved.
216eac174f2Safresh1
217eac174f2Safresh1Copyright (C) 2013-2014, 2020 Steve Hay.  All rights reserved.
218eac174f2Safresh1
219eac174f2Safresh1=head1 LICENCE
220eac174f2Safresh1
221eac174f2Safresh1This module is free software; you can redistribute it and/or modify it under the
222eac174f2Safresh1same terms as Perl itself, i.e. under the terms of either the GNU General Public
223eac174f2Safresh1License or the Artistic License, as specified in the F<LICENCE> file.
224eac174f2Safresh1
225eac174f2Safresh1=head1 VERSION
226eac174f2Safresh1
227*e0680481Safresh1Version 3.15
228eac174f2Safresh1
229eac174f2Safresh1=head1 DATE
230eac174f2Safresh1
231*e0680481Safresh120 March 2023
232eac174f2Safresh1
233eac174f2Safresh1=head1 HISTORY
234eac174f2Safresh1
235eac174f2Safresh1See the F<Changes> file.
236eac174f2Safresh1
237b8851fccSafresh1=cut
238