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