Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / perl-5.8.0 / lib / 5.8.0 / Net / FTP.pm
CommitLineData
86530b38
AT
1# Net::FTP.pm
2#
3# Copyright (c) 1995-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
4# This program is free software; you can redistribute it and/or
5# modify it under the same terms as Perl itself.
6#
7# Documentation (at end) improved 1996 by Nathan Torkington <gnat@frii.com>.
8
9package Net::FTP;
10
11require 5.001;
12
13use strict;
14use vars qw(@ISA $VERSION);
15use Carp;
16
17use Socket 1.3;
18use IO::Socket;
19use Time::Local;
20use Net::Cmd;
21use Net::Config;
22use Fcntl qw(O_WRONLY O_RDONLY O_APPEND O_CREAT O_TRUNC);
23# use AutoLoader qw(AUTOLOAD);
24
25$VERSION = "2.65"; # $Id: //depot/libnet/Net/FTP.pm#68 $
26@ISA = qw(Exporter Net::Cmd IO::Socket::INET);
27
28# Someday I will "use constant", when I am not bothered to much about
29# compatability with older releases of perl
30
31use vars qw($TELNET_IAC $TELNET_IP $TELNET_DM);
32($TELNET_IAC,$TELNET_IP,$TELNET_DM) = (255,244,242);
33
34# Name is too long for AutoLoad, it clashes with pasv_xfer
35sub pasv_xfer_unique {
36 my($sftp,$sfile,$dftp,$dfile) = @_;
37 $sftp->pasv_xfer($sfile,$dftp,$dfile,1);
38}
39
40BEGIN {
41 # make a constant so code is fast'ish
42 my $is_os390 = $^O eq 'os390';
43 *trEBCDIC = sub () { $is_os390 }
44}
45
461;
47# Having problems with AutoLoader
48#__END__
49
50sub new
51{
52 my $pkg = shift;
53 my $peer = shift;
54 my %arg = @_;
55
56 my $host = $peer;
57 my $fire = undef;
58 my $fire_type = undef;
59
60 if(exists($arg{Firewall}) || Net::Config->requires_firewall($peer))
61 {
62 $fire = $arg{Firewall}
63 || $ENV{FTP_FIREWALL}
64 || $NetConfig{ftp_firewall}
65 || undef;
66
67 if(defined $fire)
68 {
69 $peer = $fire;
70 delete $arg{Port};
71 $fire_type = $arg{FirewallType}
72 || $ENV{FTP_FIREWALL_TYPE}
73 || undef;
74 }
75 }
76
77 my $ftp = $pkg->SUPER::new(PeerAddr => $peer,
78 PeerPort => $arg{Port} || 'ftp(21)',
79 Proto => 'tcp',
80 Timeout => defined $arg{Timeout}
81 ? $arg{Timeout}
82 : 120
83 ) or return undef;
84
85 ${*$ftp}{'net_ftp_host'} = $host; # Remote hostname
86 ${*$ftp}{'net_ftp_type'} = 'A'; # ASCII/binary/etc mode
87 ${*$ftp}{'net_ftp_blksize'} = abs($arg{'BlockSize'} || 10240);
88
89 ${*$ftp}{'net_ftp_firewall'} = $fire
90 if(defined $fire);
91 ${*$ftp}{'net_ftp_firewall_type'} = $fire_type
92 if(defined $fire_type);
93
94 ${*$ftp}{'net_ftp_passive'} = int
95 exists $arg{Passive}
96 ? $arg{Passive}
97 : exists $ENV{FTP_PASSIVE}
98 ? $ENV{FTP_PASSIVE}
99 : defined $fire
100 ? $NetConfig{ftp_ext_passive}
101 : $NetConfig{ftp_int_passive}; # Whew! :-)
102
103 $ftp->hash(exists $arg{Hash} ? $arg{Hash} : 0, 1024);
104
105 $ftp->autoflush(1);
106
107 $ftp->debug(exists $arg{Debug} ? $arg{Debug} : undef);
108
109 unless ($ftp->response() == CMD_OK)
110 {
111 $ftp->close();
112 $@ = $ftp->message;
113 undef $ftp;
114 }
115
116 $ftp;
117}
118
119##
120## User interface methods
121##
122
123sub hash {
124 my $ftp = shift; # self
125
126 my($h,$b) = @_;
127 unless($h) {
128 delete ${*$ftp}{'net_ftp_hash'};
129 return [\*STDERR,0];
130 }
131 ($h,$b) = (ref($h)? $h : \*STDERR, $b || 1024);
132 select((select($h), $|=1)[0]);
133 $b = 512 if $b < 512;
134 ${*$ftp}{'net_ftp_hash'} = [$h, $b];
135}
136
137sub quit
138{
139 my $ftp = shift;
140
141 $ftp->_QUIT;
142 $ftp->close;
143}
144
145sub DESTROY {}
146
147sub ascii { shift->type('A',@_); }
148sub binary { shift->type('I',@_); }
149
150sub ebcdic
151{
152 carp "TYPE E is unsupported, shall default to I";
153 shift->type('E',@_);
154}
155
156sub byte
157{
158 carp "TYPE L is unsupported, shall default to I";
159 shift->type('L',@_);
160}
161
162# Allow the user to send a command directly, BE CAREFUL !!
163
164sub quot
165{
166 my $ftp = shift;
167 my $cmd = shift;
168
169 $ftp->command( uc $cmd, @_);
170 $ftp->response();
171}
172
173sub site
174{
175 my $ftp = shift;
176
177 $ftp->command("SITE", @_);
178 $ftp->response();
179}
180
181sub mdtm
182{
183 my $ftp = shift;
184 my $file = shift;
185
186 # Server Y2K bug workaround
187 #
188 # sigh; some idiotic FTP servers use ("19%d",tm.tm_year) instead of
189 # ("%d",tm.tm_year+1900). This results in an extra digit in the
190 # string returned. To account for this we allow an optional extra
191 # digit in the year. Then if the first two digits are 19 we use the
192 # remainder, otherwise we subtract 1900 from the whole year.
193
194 $ftp->_MDTM($file) && $ftp->message =~ /((\d\d)(\d\d\d?))(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/
195 ? timegm($8,$7,$6,$5,$4-1,$2 eq '19' ? $3 : ($1-1900))
196 : undef;
197}
198
199sub size {
200 my $ftp = shift;
201 my $file = shift;
202 my $io;
203 if($ftp->supported("SIZE")) {
204 return $ftp->_SIZE($file)
205 ? ($ftp->message =~ /(\d+)$/)[0]
206 : undef;
207 }
208 elsif($ftp->supported("STAT")) {
209 my @msg;
210 return undef
211 unless $ftp->_STAT($file) && (@msg = $ftp->message) == 3;
212 my $line;
213 foreach $line (@msg) {
214 return (split(/\s+/,$line))[4]
215 if $line =~ /^[-rwx]{10}/
216 }
217 }
218 else {
219 my @files = $ftp->dir($file);
220 if(@files) {
221 return (split(/\s+/,$1))[4]
222 if $files[0] =~ /^([-rwx]{10}.*)$/;
223 }
224 }
225 undef;
226}
227
228sub login {
229 my($ftp,$user,$pass,$acct) = @_;
230 my($ok,$ruser,$fwtype);
231
232 unless (defined $user) {
233 require Net::Netrc;
234
235 my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'});
236
237 ($user,$pass,$acct) = $rc->lpa()
238 if ($rc);
239 }
240
241 $user ||= "anonymous";
242 $ruser = $user;
243
244 $fwtype = ${*$ftp}{'net_ftp_firewall_type'}
245 || $NetConfig{'ftp_firewall_type'}
246 || 0;
247
248 if ($fwtype && defined ${*$ftp}{'net_ftp_firewall'}) {
249 if ($fwtype == 1 || $fwtype == 7) {
250 $user .= '@' . ${*$ftp}{'net_ftp_host'};
251 }
252 else {
253 require Net::Netrc;
254
255 my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'});
256
257 my($fwuser,$fwpass,$fwacct) = $rc ? $rc->lpa() : ();
258
259 if ($fwtype == 5) {
260 $user = join('@',$user,$fwuser,${*$ftp}{'net_ftp_host'});
261 $pass = $pass . '@' . $fwpass;
262 }
263 else {
264 if ($fwtype == 2) {
265 $user .= '@' . ${*$ftp}{'net_ftp_host'};
266 }
267 elsif ($fwtype == 6) {
268 $fwuser .= '@' . ${*$ftp}{'net_ftp_host'};
269 }
270
271 $ok = $ftp->_USER($fwuser);
272
273 return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
274
275 $ok = $ftp->_PASS($fwpass || "");
276
277 return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
278
279 $ok = $ftp->_ACCT($fwacct)
280 if defined($fwacct);
281
282 if ($fwtype == 3) {
283 $ok = $ftp->command("SITE",${*$ftp}{'net_ftp_host'})->response;
284 }
285 elsif ($fwtype == 4) {
286 $ok = $ftp->command("OPEN",${*$ftp}{'net_ftp_host'})->response;
287 }
288
289 return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
290 }
291 }
292 }
293
294 $ok = $ftp->_USER($user);
295
296 # Some dumb firewalls don't prefix the connection messages
297 $ok = $ftp->response()
298 if ($ok == CMD_OK && $ftp->code == 220 && $user =~ /\@/);
299
300 if ($ok == CMD_MORE) {
301 unless(defined $pass) {
302 require Net::Netrc;
303
304 my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'}, $ruser);
305
306 ($ruser,$pass,$acct) = $rc->lpa()
307 if ($rc);
308
309 $pass = '-anonymous@'
310 if (!defined $pass && (!defined($ruser) || $ruser =~ /^anonymous/o));
311 }
312
313 $ok = $ftp->_PASS($pass || "");
314 }
315
316 $ok = $ftp->_ACCT($acct)
317 if (defined($acct) && ($ok == CMD_MORE || $ok == CMD_OK));
318
319 if ($fwtype == 7 && $ok == CMD_OK && defined ${*$ftp}{'net_ftp_firewall'}) {
320 my($f,$auth,$resp) = _auth_id($ftp);
321 $ftp->authorize($auth,$resp) if defined($resp);
322 }
323
324 $ok == CMD_OK;
325}
326
327sub account
328{
329 @_ == 2 or croak 'usage: $ftp->account( ACCT )';
330 my $ftp = shift;
331 my $acct = shift;
332 $ftp->_ACCT($acct) == CMD_OK;
333}
334
335sub _auth_id {
336 my($ftp,$auth,$resp) = @_;
337
338 unless(defined $resp)
339 {
340 require Net::Netrc;
341
342 $auth ||= eval { (getpwuid($>))[0] } || $ENV{NAME};
343
344 my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'}, $auth)
345 || Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'});
346
347 ($auth,$resp) = $rc->lpa()
348 if ($rc);
349 }
350 ($ftp,$auth,$resp);
351}
352
353sub authorize
354{
355 @_ >= 1 || @_ <= 3 or croak 'usage: $ftp->authorize( [AUTH [, RESP]])';
356
357 my($ftp,$auth,$resp) = &_auth_id;
358
359 my $ok = $ftp->_AUTH($auth || "");
360
361 $ok = $ftp->_RESP($resp || "")
362 if ($ok == CMD_MORE);
363
364 $ok == CMD_OK;
365}
366
367sub rename
368{
369 @_ == 3 or croak 'usage: $ftp->rename(FROM, TO)';
370
371 my($ftp,$from,$to) = @_;
372
373 $ftp->_RNFR($from)
374 && $ftp->_RNTO($to);
375}
376
377sub type
378{
379 my $ftp = shift;
380 my $type = shift;
381 my $oldval = ${*$ftp}{'net_ftp_type'};
382
383 return $oldval
384 unless (defined $type);
385
386 return undef
387 unless ($ftp->_TYPE($type,@_));
388
389 ${*$ftp}{'net_ftp_type'} = join(" ",$type,@_);
390
391 $oldval;
392}
393
394sub abort
395{
396 my $ftp = shift;
397
398 send($ftp,pack("CCC", $TELNET_IAC, $TELNET_IP, $TELNET_IAC),MSG_OOB);
399
400 $ftp->command(pack("C",$TELNET_DM) . "ABOR");
401
402 ${*$ftp}{'net_ftp_dataconn'}->close()
403 if defined ${*$ftp}{'net_ftp_dataconn'};
404
405 $ftp->response();
406
407 $ftp->status == CMD_OK;
408}
409
410sub get
411{
412 my($ftp,$remote,$local,$where) = @_;
413
414 my($loc,$len,$buf,$resp,$data);
415 local *FD;
416
417 my $localfd = ref($local) || ref(\$local) eq "GLOB";
418
419 ($local = $remote) =~ s#^.*/##
420 unless(defined $local);
421
422 croak("Bad remote filename '$remote'\n")
423 if $remote =~ /[\r\n]/s;
424
425 ${*$ftp}{'net_ftp_rest'} = $where
426 if ($where);
427
428 delete ${*$ftp}{'net_ftp_port'};
429 delete ${*$ftp}{'net_ftp_pasv'};
430
431 $data = $ftp->retr($remote) or
432 return undef;
433
434 if($localfd)
435 {
436 $loc = $local;
437 }
438 else
439 {
440 $loc = \*FD;
441
442 unless(sysopen($loc, $local, O_CREAT | O_WRONLY | ($where ? O_APPEND : O_TRUNC)))
443 {
444 carp "Cannot open Local file $local: $!\n";
445 $data->abort;
446 return undef;
447 }
448 }
449
450 if($ftp->type eq 'I' && !binmode($loc))
451 {
452 carp "Cannot binmode Local file $local: $!\n";
453 $data->abort;
454 close($loc) unless $localfd;
455 return undef;
456 }
457
458 $buf = '';
459 my($count,$hashh,$hashb,$ref) = (0);
460
461 ($hashh,$hashb) = @$ref
462 if($ref = ${*$ftp}{'net_ftp_hash'});
463
464 my $blksize = ${*$ftp}{'net_ftp_blksize'};
465
466 while(1)
467 {
468 last unless $len = $data->read($buf,$blksize);
469
470 if (trEBCDIC && $ftp->type ne 'I')
471 {
472 $buf = $ftp->toebcdic($buf);
473 $len = length($buf);
474 }
475
476 if($hashh) {
477 $count += $len;
478 print $hashh "#" x (int($count / $hashb));
479 $count %= $hashb;
480 }
481 my $written = syswrite($loc,$buf,$len);
482 unless(defined($written) && $written == $len)
483 {
484 carp "Cannot write to Local file $local: $!\n";
485 $data->abort;
486 close($loc)
487 unless $localfd;
488 return undef;
489 }
490 }
491
492 print $hashh "\n" if $hashh;
493
494 unless ($localfd)
495 {
496 unless (close($loc))
497 {
498 carp "Cannot close file $local (perhaps disk space) $!\n";
499 return undef;
500 }
501 }
502
503 unless ($data->close()) # implied $ftp->response
504 {
505 carp "Unable to close datastream";
506 return undef;
507 }
508
509 return $local;
510}
511
512sub cwd
513{
514 @_ == 1 || @_ == 2 or croak 'usage: $ftp->cwd( [ DIR ] )';
515
516 my($ftp,$dir) = @_;
517
518 $dir = "/" unless defined($dir) && $dir =~ /\S/;
519
520 $dir eq ".."
521 ? $ftp->_CDUP()
522 : $ftp->_CWD($dir);
523}
524
525sub cdup
526{
527 @_ == 1 or croak 'usage: $ftp->cdup()';
528 $_[0]->_CDUP;
529}
530
531sub pwd
532{
533 @_ == 1 || croak 'usage: $ftp->pwd()';
534 my $ftp = shift;
535
536 $ftp->_PWD();
537 $ftp->_extract_path;
538}
539
540# rmdir( $ftp, $dir, [ $recurse ] )
541#
542# Removes $dir on remote host via FTP.
543# $ftp is handle for remote host
544#
545# If $recurse is TRUE, the directory and deleted recursively.
546# This means all of its contents and subdirectories.
547#
548# Initial version contributed by Dinkum Software
549#
550sub rmdir
551{
552 @_ == 2 || @_ == 3 or croak('usage: $ftp->rmdir( DIR [, RECURSE ] )');
553
554 # Pick off the args
555 my ($ftp, $dir, $recurse) = @_ ;
556 my $ok;
557
558 return $ok
559 if $ok = $ftp->_RMD( $dir ) or !$recurse;
560
561 # Try to delete the contents
562 # Get a list of all the files in the directory
563 my $filelist = $ftp->ls($dir);
564
565 return undef
566 unless $filelist && @$filelist; # failed, it is probably not a directory
567
568 # Go thru and delete each file or the directory
569 my $file;
570 foreach $file (map { m,/, ? $_ : "$dir/$_" } @$filelist)
571 {
572 next # successfully deleted the file
573 if $ftp->delete($file);
574
575 # Failed to delete it, assume its a directory
576 # Recurse and ignore errors, the final rmdir() will
577 # fail on any errors here
578 return $ok
579 unless $ok = $ftp->rmdir($file, 1) ;
580 }
581
582 # Directory should be empty
583 # Try to remove the directory again
584 # Pass results directly to caller
585 # If any of the prior deletes failed, this
586 # rmdir() will fail because directory is not empty
587 return $ftp->_RMD($dir) ;
588}
589
590sub restart
591{
592 @_ == 2 || croak 'usage: $ftp->restart( BYTE_OFFSET )';
593
594 my($ftp,$where) = @_;
595
596 ${*$ftp}{'net_ftp_rest'} = $where;
597
598 return undef;
599}
600
601
602sub mkdir
603{
604 @_ == 2 || @_ == 3 or croak 'usage: $ftp->mkdir( DIR [, RECURSE ] )';
605
606 my($ftp,$dir,$recurse) = @_;
607
608 $ftp->_MKD($dir) || $recurse or
609 return undef;
610
611 my $path = $dir;
612
613 unless($ftp->ok)
614 {
615 my @path = split(m#(?=/+)#, $dir);
616
617 $path = "";
618
619 while(@path)
620 {
621 $path .= shift @path;
622
623 $ftp->_MKD($path);
624
625 $path = $ftp->_extract_path($path);
626 }
627
628 # If the creation of the last element was not sucessful, see if we
629 # can cd to it, if so then return path
630
631 unless($ftp->ok)
632 {
633 my($status,$message) = ($ftp->status,$ftp->message);
634 my $pwd = $ftp->pwd;
635
636 if($pwd && $ftp->cwd($dir))
637 {
638 $path = $dir;
639 $ftp->cwd($pwd);
640 }
641 else
642 {
643 undef $path;
644 }
645 $ftp->set_status($status,$message);
646 }
647 }
648
649 $path;
650}
651
652sub delete
653{
654 @_ == 2 || croak 'usage: $ftp->delete( FILENAME )';
655
656 $_[0]->_DELE($_[1]);
657}
658
659sub put { shift->_store_cmd("stor",@_) }
660sub put_unique { shift->_store_cmd("stou",@_) }
661sub append { shift->_store_cmd("appe",@_) }
662
663sub nlst { shift->_data_cmd("NLST",@_) }
664sub list { shift->_data_cmd("LIST",@_) }
665sub retr { shift->_data_cmd("RETR",@_) }
666sub stor { shift->_data_cmd("STOR",@_) }
667sub stou { shift->_data_cmd("STOU",@_) }
668sub appe { shift->_data_cmd("APPE",@_) }
669
670sub _store_cmd
671{
672 my($ftp,$cmd,$local,$remote) = @_;
673 my($loc,$sock,$len,$buf);
674 local *FD;
675
676 my $localfd = ref($local) || ref(\$local) eq "GLOB";
677
678 unless(defined $remote)
679 {
680 croak 'Must specify remote filename with stream input'
681 if $localfd;
682
683 require File::Basename;
684 $remote = File::Basename::basename($local);
685 }
686
687 croak("Bad remote filename '$remote'\n")
688 if $remote =~ /[\r\n]/s;
689
690 if($localfd)
691 {
692 $loc = $local;
693 }
694 else
695 {
696 $loc = \*FD;
697
698 unless(sysopen($loc, $local, O_RDONLY))
699 {
700 carp "Cannot open Local file $local: $!\n";
701 return undef;
702 }
703 }
704
705 if($ftp->type eq 'I' && !binmode($loc))
706 {
707 carp "Cannot binmode Local file $local: $!\n";
708 return undef;
709 }
710
711 delete ${*$ftp}{'net_ftp_port'};
712 delete ${*$ftp}{'net_ftp_pasv'};
713
714 $sock = $ftp->_data_cmd($cmd, $remote) or
715 return undef;
716
717 my $blksize = ${*$ftp}{'net_ftp_blksize'};
718
719 my($count,$hashh,$hashb,$ref) = (0);
720
721 ($hashh,$hashb) = @$ref
722 if($ref = ${*$ftp}{'net_ftp_hash'});
723
724 while(1)
725 {
726 last unless $len = sysread($loc,$buf="",$blksize);
727
728 if (trEBCDIC && $ftp->type ne 'I')
729 {
730 $buf = $ftp->toascii($buf);
731 $len = length($buf);
732 }
733
734 if($hashh) {
735 $count += $len;
736 print $hashh "#" x (int($count / $hashb));
737 $count %= $hashb;
738 }
739
740 my $wlen;
741 unless(defined($wlen = $sock->write($buf,$len)) && $wlen == $len)
742 {
743 $sock->abort;
744 close($loc)
745 unless $localfd;
746 print $hashh "\n" if $hashh;
747 return undef;
748 }
749 }
750
751 print $hashh "\n" if $hashh;
752
753 close($loc)
754 unless $localfd;
755
756 $sock->close() or
757 return undef;
758
759 if ('STOU' eq uc $cmd and $ftp->message =~ m/unique\s+file\s*name\s*:\s*(.*)\)|"(.*)"/)
760 {
761 require File::Basename;
762 $remote = File::Basename::basename($+)
763 }
764
765 return $remote;
766}
767
768sub port
769{
770 @_ == 1 || @_ == 2 or croak 'usage: $ftp->port([PORT])';
771
772 my($ftp,$port) = @_;
773 my $ok;
774
775 delete ${*$ftp}{'net_ftp_intern_port'};
776
777 unless(defined $port)
778 {
779 # create a Listen socket at same address as the command socket
780
781 ${*$ftp}{'net_ftp_listen'} ||= IO::Socket::INET->new(Listen => 5,
782 Proto => 'tcp',
783 Timeout => $ftp->timeout,
784 LocalAddr => $ftp->sockhost,
785 );
786
787 my $listen = ${*$ftp}{'net_ftp_listen'};
788
789 my($myport, @myaddr) = ($listen->sockport, split(/\./,$listen->sockhost));
790
791 $port = join(',', @myaddr, $myport >> 8, $myport & 0xff);
792
793 ${*$ftp}{'net_ftp_intern_port'} = 1;
794 }
795
796 $ok = $ftp->_PORT($port);
797
798 ${*$ftp}{'net_ftp_port'} = $port;
799
800 $ok;
801}
802
803sub ls { shift->_list_cmd("NLST",@_); }
804sub dir { shift->_list_cmd("LIST",@_); }
805
806sub pasv
807{
808 @_ == 1 or croak 'usage: $ftp->pasv()';
809
810 my $ftp = shift;
811
812 delete ${*$ftp}{'net_ftp_intern_port'};
813
814 $ftp->_PASV && $ftp->message =~ /(\d+(,\d+)+)/
815 ? ${*$ftp}{'net_ftp_pasv'} = $1
816 : undef;
817}
818
819sub unique_name
820{
821 my $ftp = shift;
822 ${*$ftp}{'net_ftp_unique'} || undef;
823}
824
825sub supported {
826 @_ == 2 or croak 'usage: $ftp->supported( CMD )';
827 my $ftp = shift;
828 my $cmd = uc shift;
829 my $hash = ${*$ftp}{'net_ftp_supported'} ||= {};
830
831 return $hash->{$cmd}
832 if exists $hash->{$cmd};
833
834 return $hash->{$cmd} = 0
835 unless $ftp->_HELP($cmd);
836
837 my $text = $ftp->message;
838 if($text =~ /following\s+commands/i) {
839 $text =~ s/^.*\n//;
840 while($text =~ /(\*?)(\w+)(\*?)/sg) {
841 $hash->{"\U$2"} = !length("$1$3");
842 }
843 }
844 else {
845 $hash->{$cmd} = $text !~ /unimplemented/i;
846 }
847
848 $hash->{$cmd} ||= 0;
849}
850
851##
852## Deprecated methods
853##
854
855sub lsl
856{
857 carp "Use of Net::FTP::lsl deprecated, use 'dir'"
858 if $^W;
859 goto &dir;
860}
861
862sub authorise
863{
864 carp "Use of Net::FTP::authorise deprecated, use 'authorize'"
865 if $^W;
866 goto &authorize;
867}
868
869
870##
871## Private methods
872##
873
874sub _extract_path
875{
876 my($ftp, $path) = @_;
877
878 # This tries to work both with and without the quote doubling
879 # convention (RFC 959 requires it, but the first 3 servers I checked
880 # didn't implement it). It will fail on a server which uses a quote in
881 # the message which isn't a part of or surrounding the path.
882 $ftp->ok &&
883 $ftp->message =~ /(?:^|\s)\"(.*)\"(?:$|\s)/ &&
884 ($path = $1) =~ s/\"\"/\"/g;
885
886 $path;
887}
888
889##
890## Communication methods
891##
892
893sub _dataconn
894{
895 my $ftp = shift;
896 my $data = undef;
897 my $pkg = "Net::FTP::" . $ftp->type;
898
899 eval "require " . $pkg;
900
901 $pkg =~ s/ /_/g;
902
903 delete ${*$ftp}{'net_ftp_dataconn'};
904
905 if(defined ${*$ftp}{'net_ftp_pasv'})
906 {
907 my @port = split(/,/,${*$ftp}{'net_ftp_pasv'});
908
909 $data = $pkg->new(PeerAddr => join(".",@port[0..3]),
910 PeerPort => $port[4] * 256 + $port[5],
911 Proto => 'tcp'
912 );
913 }
914 elsif(defined ${*$ftp}{'net_ftp_listen'})
915 {
916 $data = ${*$ftp}{'net_ftp_listen'}->accept($pkg);
917 close(delete ${*$ftp}{'net_ftp_listen'});
918 }
919
920 if($data)
921 {
922 ${*$data} = "";
923 $data->timeout($ftp->timeout);
924 ${*$ftp}{'net_ftp_dataconn'} = $data;
925 ${*$data}{'net_ftp_cmd'} = $ftp;
926 ${*$data}{'net_ftp_blksize'} = ${*$ftp}{'net_ftp_blksize'};
927 }
928
929 $data;
930}
931
932sub _list_cmd
933{
934 my $ftp = shift;
935 my $cmd = uc shift;
936
937 delete ${*$ftp}{'net_ftp_port'};
938 delete ${*$ftp}{'net_ftp_pasv'};
939
940 my $data = $ftp->_data_cmd($cmd,@_);
941
942 return
943 unless(defined $data);
944
945 require Net::FTP::A;
946 bless $data, "Net::FTP::A"; # Force ASCII mode
947
948 my $databuf = '';
949 my $buf = '';
950 my $blksize = ${*$ftp}{'net_ftp_blksize'};
951
952 while($data->read($databuf,$blksize)) {
953 $buf .= $databuf;
954 }
955
956 my $list = [ split(/\n/,$buf) ];
957
958 $data->close();
959
960 if (trEBCDIC)
961 {
962 for (@$list) { $_ = $ftp->toebcdic($_) }
963 }
964
965 wantarray ? @{$list}
966 : $list;
967}
968
969sub _data_cmd
970{
971 my $ftp = shift;
972 my $cmd = uc shift;
973 my $ok = 1;
974 my $where = delete ${*$ftp}{'net_ftp_rest'} || 0;
975 my $arg;
976
977 for $arg (@_) {
978 croak("Bad argument '$arg'\n")
979 if $arg =~ /[\r\n]/s;
980 }
981
982 if(${*$ftp}{'net_ftp_passive'} &&
983 !defined ${*$ftp}{'net_ftp_pasv'} &&
984 !defined ${*$ftp}{'net_ftp_port'})
985 {
986 my $data = undef;
987
988 $ok = defined $ftp->pasv;
989 $ok = $ftp->_REST($where)
990 if $ok && $where;
991
992 if($ok)
993 {
994 $ftp->command($cmd,@_);
995 $data = $ftp->_dataconn();
996 $ok = CMD_INFO == $ftp->response();
997 if($ok)
998 {
999 $data->reading
1000 if $data && $cmd =~ /RETR|LIST|NLST/;
1001 return $data
1002 }
1003 $data->_close
1004 if $data;
1005 }
1006 return undef;
1007 }
1008
1009 $ok = $ftp->port
1010 unless (defined ${*$ftp}{'net_ftp_port'} ||
1011 defined ${*$ftp}{'net_ftp_pasv'});
1012
1013 $ok = $ftp->_REST($where)
1014 if $ok && $where;
1015
1016 return undef
1017 unless $ok;
1018
1019 $ftp->command($cmd,@_);
1020
1021 return 1
1022 if(defined ${*$ftp}{'net_ftp_pasv'});
1023
1024 $ok = CMD_INFO == $ftp->response();
1025
1026 return $ok
1027 unless exists ${*$ftp}{'net_ftp_intern_port'};
1028
1029 if($ok) {
1030 my $data = $ftp->_dataconn();
1031
1032 $data->reading
1033 if $data && $cmd =~ /RETR|LIST|NLST/;
1034
1035 return $data;
1036 }
1037
1038
1039 close(delete ${*$ftp}{'net_ftp_listen'});
1040
1041 return undef;
1042}
1043
1044##
1045## Over-ride methods (Net::Cmd)
1046##
1047
1048sub debug_text { $_[2] =~ /^(pass|resp|acct)/i ? "$1 ....\n" : $_[2]; }
1049
1050sub command
1051{
1052 my $ftp = shift;
1053
1054 delete ${*$ftp}{'net_ftp_port'};
1055 $ftp->SUPER::command(@_);
1056}
1057
1058sub response
1059{
1060 my $ftp = shift;
1061 my $code = $ftp->SUPER::response();
1062
1063 delete ${*$ftp}{'net_ftp_pasv'}
1064 if ($code != CMD_MORE && $code != CMD_INFO);
1065
1066 $code;
1067}
1068
1069sub parse_response
1070{
1071 return ($1, $2 eq "-")
1072 if $_[1] =~ s/^(\d\d\d)(.?)//o;
1073
1074 my $ftp = shift;
1075
1076 # Darn MS FTP server is a load of CRAP !!!!
1077 return ()
1078 unless ${*$ftp}{'net_cmd_code'} + 0;
1079
1080 (${*$ftp}{'net_cmd_code'},1);
1081}
1082
1083##
1084## Allow 2 servers to talk directly
1085##
1086
1087sub pasv_xfer {
1088 my($sftp,$sfile,$dftp,$dfile,$unique) = @_;
1089
1090 ($dfile = $sfile) =~ s#.*/##
1091 unless(defined $dfile);
1092
1093 my $port = $sftp->pasv or
1094 return undef;
1095
1096 $dftp->port($port) or
1097 return undef;
1098
1099 return undef
1100 unless($unique ? $dftp->stou($dfile) : $dftp->stor($dfile));
1101
1102 unless($sftp->retr($sfile) && $sftp->response == CMD_INFO) {
1103 $sftp->retr($sfile);
1104 $dftp->abort;
1105 $dftp->response();
1106 return undef;
1107 }
1108
1109 $dftp->pasv_wait($sftp);
1110}
1111
1112sub pasv_wait
1113{
1114 @_ == 2 or croak 'usage: $ftp->pasv_wait(NON_PASV_FTP)';
1115
1116 my($ftp, $non_pasv) = @_;
1117 my($file,$rin,$rout);
1118
1119 vec($rin='',fileno($ftp),1) = 1;
1120 select($rout=$rin, undef, undef, undef);
1121
1122 $ftp->response();
1123 $non_pasv->response();
1124
1125 return undef
1126 unless $ftp->ok() && $non_pasv->ok();
1127
1128 return $1
1129 if $ftp->message =~ /unique file name:\s*(\S*)\s*\)/;
1130
1131 return $1
1132 if $non_pasv->message =~ /unique file name:\s*(\S*)\s*\)/;
1133
1134 return 1;
1135}
1136
1137sub cmd { shift->command(@_)->response() }
1138
1139########################################
1140#
1141# RFC959 commands
1142#
1143
1144sub _ABOR { shift->command("ABOR")->response() == CMD_OK }
1145sub _CDUP { shift->command("CDUP")->response() == CMD_OK }
1146sub _NOOP { shift->command("NOOP")->response() == CMD_OK }
1147sub _PASV { shift->command("PASV")->response() == CMD_OK }
1148sub _QUIT { shift->command("QUIT")->response() == CMD_OK }
1149sub _DELE { shift->command("DELE",@_)->response() == CMD_OK }
1150sub _CWD { shift->command("CWD", @_)->response() == CMD_OK }
1151sub _PORT { shift->command("PORT",@_)->response() == CMD_OK }
1152sub _RMD { shift->command("RMD", @_)->response() == CMD_OK }
1153sub _MKD { shift->command("MKD", @_)->response() == CMD_OK }
1154sub _PWD { shift->command("PWD", @_)->response() == CMD_OK }
1155sub _TYPE { shift->command("TYPE",@_)->response() == CMD_OK }
1156sub _RNTO { shift->command("RNTO",@_)->response() == CMD_OK }
1157sub _RESP { shift->command("RESP",@_)->response() == CMD_OK }
1158sub _MDTM { shift->command("MDTM",@_)->response() == CMD_OK }
1159sub _SIZE { shift->command("SIZE",@_)->response() == CMD_OK }
1160sub _HELP { shift->command("HELP",@_)->response() == CMD_OK }
1161sub _STAT { shift->command("STAT",@_)->response() == CMD_OK }
1162sub _APPE { shift->command("APPE",@_)->response() == CMD_INFO }
1163sub _LIST { shift->command("LIST",@_)->response() == CMD_INFO }
1164sub _NLST { shift->command("NLST",@_)->response() == CMD_INFO }
1165sub _RETR { shift->command("RETR",@_)->response() == CMD_INFO }
1166sub _STOR { shift->command("STOR",@_)->response() == CMD_INFO }
1167sub _STOU { shift->command("STOU",@_)->response() == CMD_INFO }
1168sub _RNFR { shift->command("RNFR",@_)->response() == CMD_MORE }
1169sub _REST { shift->command("REST",@_)->response() == CMD_MORE }
1170sub _USER { shift->command("user",@_)->response() } # A certain brain dead firewall :-)
1171sub _PASS { shift->command("PASS",@_)->response() }
1172sub _ACCT { shift->command("ACCT",@_)->response() }
1173sub _AUTH { shift->command("AUTH",@_)->response() }
1174
1175sub _ALLO { shift->unsupported(@_) }
1176sub _SMNT { shift->unsupported(@_) }
1177sub _MODE { shift->unsupported(@_) }
1178sub _SYST { shift->unsupported(@_) }
1179sub _STRU { shift->unsupported(@_) }
1180sub _REIN { shift->unsupported(@_) }
1181
11821;
1183
1184__END__
1185
1186=head1 NAME
1187
1188Net::FTP - FTP Client class
1189
1190=head1 SYNOPSIS
1191
1192 use Net::FTP;
1193
1194 $ftp = Net::FTP->new("some.host.name", Debug => 0);
1195 $ftp->login("anonymous",'-anonymous@');
1196 $ftp->cwd("/pub");
1197 $ftp->get("that.file");
1198 $ftp->quit;
1199
1200=head1 DESCRIPTION
1201
1202C<Net::FTP> is a class implementing a simple FTP client in Perl as
1203described in RFC959. It provides wrappers for a subset of the RFC959
1204commands.
1205
1206=head1 OVERVIEW
1207
1208FTP stands for File Transfer Protocol. It is a way of transferring
1209files between networked machines. The protocol defines a client
1210(whose commands are provided by this module) and a server (not
1211implemented in this module). Communication is always initiated by the
1212client, and the server responds with a message and a status code (and
1213sometimes with data).
1214
1215The FTP protocol allows files to be sent to or fetched from the
1216server. Each transfer involves a B<local file> (on the client) and a
1217B<remote file> (on the server). In this module, the same file name
1218will be used for both local and remote if only one is specified. This
1219means that transferring remote file C</path/to/file> will try to put
1220that file in C</path/to/file> locally, unless you specify a local file
1221name.
1222
1223The protocol also defines several standard B<translations> which the
1224file can undergo during transfer. These are ASCII, EBCDIC, binary,
1225and byte. ASCII is the default type, and indicates that the sender of
1226files will translate the ends of lines to a standard representation
1227which the receiver will then translate back into their local
1228representation. EBCDIC indicates the file being transferred is in
1229EBCDIC format. Binary (also known as image) format sends the data as
1230a contiguous bit stream. Byte format transfers the data as bytes, the
1231values of which remain the same regardless of differences in byte size
1232between the two machines (in theory - in practice you should only use
1233this if you really know what you're doing).
1234
1235=head1 CONSTRUCTOR
1236
1237=over 4
1238
1239=item new (HOST [,OPTIONS])
1240
1241This is the constructor for a new Net::FTP object. C<HOST> is the
1242name of the remote host to which an FTP connection is required.
1243
1244C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
1245Possible options are:
1246
1247B<Firewall> - The name of a machine which acts as an FTP firewall. This can be
1248overridden by an environment variable C<FTP_FIREWALL>. If specified, and the
1249given host cannot be directly connected to, then the
1250connection is made to the firewall machine and the string C<@hostname> is
1251appended to the login identifier. This kind of setup is also refered to
1252as an ftp proxy.
1253
1254B<FirewallType> - The type of firewall running on the machine indicated by
1255B<Firewall>. This can be overridden by an environment variable
1256C<FTP_FIREWALL_TYPE>. For a list of permissible types, see the description of
1257ftp_firewall_type in L<Net::Config>.
1258
1259B<BlockSize> - This is the block size that Net::FTP will use when doing
1260transfers. (defaults to 10240)
1261
1262B<Port> - The port number to connect to on the remote machine for the
1263FTP connection
1264
1265B<Timeout> - Set a timeout value (defaults to 120)
1266
1267B<Debug> - debug level (see the debug method in L<Net::Cmd>)
1268
1269B<Passive> - If set to a non-zero value then all data transfers will be done
1270using passive mode. This is not usually required except for some I<dumb>
1271servers, and some firewall configurations. This can also be set by the
1272environment variable C<FTP_PASSIVE>.
1273
1274B<Hash> - If given a reference to a file handle (e.g., C<\*STDERR>),
1275print hash marks (#) on that filehandle every 1024 bytes. This
1276simply invokes the C<hash()> method for you, so that hash marks
1277are displayed for all transfers. You can, of course, call C<hash()>
1278explicitly whenever you'd like.
1279
1280If the constructor fails undef will be returned and an error message will
1281be in $@
1282
1283=back
1284
1285=head1 METHODS
1286
1287Unless otherwise stated all methods return either a I<true> or I<false>
1288value, with I<true> meaning that the operation was a success. When a method
1289states that it returns a value, failure will be returned as I<undef> or an
1290empty list.
1291
1292=over 4
1293
1294=item login ([LOGIN [,PASSWORD [, ACCOUNT] ] ])
1295
1296Log into the remote FTP server with the given login information. If
1297no arguments are given then the C<Net::FTP> uses the C<Net::Netrc>
1298package to lookup the login information for the connected host.
1299If no information is found then a login of I<anonymous> is used.
1300If no password is given and the login is I<anonymous> then I<anonymous@>
1301will be used for password.
1302
1303If the connection is via a firewall then the C<authorize> method will
1304be called with no arguments.
1305
1306=item authorize ( [AUTH [, RESP]])
1307
1308This is a protocol used by some firewall ftp proxies. It is used
1309to authorise the user to send data out. If both arguments are not specified
1310then C<authorize> uses C<Net::Netrc> to do a lookup.
1311
1312=item site (ARGS)
1313
1314Send a SITE command to the remote server and wait for a response.
1315
1316Returns most significant digit of the response code.
1317
1318=item type (TYPE [, ARGS])
1319
1320This method will send the TYPE command to the remote FTP server
1321to change the type of data transfer. The return value is the previous
1322value.
1323
1324=item ascii ([ARGS]) binary([ARGS]) ebcdic([ARGS]) byte([ARGS])
1325
1326Synonyms for C<type> with the first arguments set correctly
1327
1328B<NOTE> ebcdic and byte are not fully supported.
1329
1330=item rename ( OLDNAME, NEWNAME )
1331
1332Rename a file on the remote FTP server from C<OLDNAME> to C<NEWNAME>. This
1333is done by sending the RNFR and RNTO commands.
1334
1335=item delete ( FILENAME )
1336
1337Send a request to the server to delete C<FILENAME>.
1338
1339=item cwd ( [ DIR ] )
1340
1341Attempt to change directory to the directory given in C<$dir>. If
1342C<$dir> is C<"..">, the FTP C<CDUP> command is used to attempt to
1343move up one directory. If no directory is given then an attempt is made
1344to change the directory to the root directory.
1345
1346=item cdup ()
1347
1348Change directory to the parent of the current directory.
1349
1350=item pwd ()
1351
1352Returns the full pathname of the current directory.
1353
1354=item restart ( WHERE )
1355
1356Set the byte offset at which to begin the next data transfer. Net::FTP simply
1357records this value and uses it when during the next data transfer. For this
1358reason this method will not return an error, but setting it may cause
1359a subsequent data transfer to fail.
1360
1361=item rmdir ( DIR )
1362
1363Remove the directory with the name C<DIR>.
1364
1365=item mkdir ( DIR [, RECURSE ])
1366
1367Create a new directory with the name C<DIR>. If C<RECURSE> is I<true> then
1368C<mkdir> will attempt to create all the directories in the given path.
1369
1370Returns the full pathname to the new directory.
1371
1372=item ls ( [ DIR ] )
1373
1374Get a directory listing of C<DIR>, or the current directory.
1375
1376In an array context, returns a list of lines returned from the server. In
1377a scalar context, returns a reference to a list.
1378
1379=item dir ( [ DIR ] )
1380
1381Get a directory listing of C<DIR>, or the current directory in long format.
1382
1383In an array context, returns a list of lines returned from the server. In
1384a scalar context, returns a reference to a list.
1385
1386=item get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )
1387
1388Get C<REMOTE_FILE> from the server and store locally. C<LOCAL_FILE> may be
1389a filename or a filehandle. If not specified, the file will be stored in
1390the current directory with the same leafname as the remote file.
1391
1392If C<WHERE> is given then the first C<WHERE> bytes of the file will
1393not be transfered, and the remaining bytes will be appended to
1394the local file if it already exists.
1395
1396Returns C<LOCAL_FILE>, or the generated local file name if C<LOCAL_FILE>
1397is not given. If an error was encountered undef is returned.
1398
1399=item put ( LOCAL_FILE [, REMOTE_FILE ] )
1400
1401Put a file on the remote server. C<LOCAL_FILE> may be a name or a filehandle.
1402If C<LOCAL_FILE> is a filehandle then C<REMOTE_FILE> must be specified. If
1403C<REMOTE_FILE> is not specified then the file will be stored in the current
1404directory with the same leafname as C<LOCAL_FILE>.
1405
1406Returns C<REMOTE_FILE>, or the generated remote filename if C<REMOTE_FILE>
1407is not given.
1408
1409B<NOTE>: If for some reason the transfer does not complete and an error is
1410returned then the contents that had been transfered will not be remove
1411automatically.
1412
1413=item put_unique ( LOCAL_FILE [, REMOTE_FILE ] )
1414
1415Same as put but uses the C<STOU> command.
1416
1417Returns the name of the file on the server.
1418
1419=item append ( LOCAL_FILE [, REMOTE_FILE ] )
1420
1421Same as put but appends to the file on the remote server.
1422
1423Returns C<REMOTE_FILE>, or the generated remote filename if C<REMOTE_FILE>
1424is not given.
1425
1426=item unique_name ()
1427
1428Returns the name of the last file stored on the server using the
1429C<STOU> command.
1430
1431=item mdtm ( FILE )
1432
1433Returns the I<modification time> of the given file
1434
1435=item size ( FILE )
1436
1437Returns the size in bytes for the given file as stored on the remote server.
1438
1439B<NOTE>: The size reported is the size of the stored file on the remote server.
1440If the file is subsequently transfered from the server in ASCII mode
1441and the remote server and local machine have different ideas about
1442"End Of Line" then the size of file on the local machine after transfer
1443may be different.
1444
1445=item supported ( CMD )
1446
1447Returns TRUE if the remote server supports the given command.
1448
1449=item hash ( [FILEHANDLE_GLOB_REF],[ BYTES_PER_HASH_MARK] )
1450
1451Called without parameters, or with the first argument false, hash marks
1452are suppressed. If the first argument is true but not a reference to a
1453file handle glob, then \*STDERR is used. The second argument is the number
1454of bytes per hash mark printed, and defaults to 1024. In all cases the
1455return value is a reference to an array of two: the filehandle glob reference
1456and the bytes per hash mark.
1457
1458=back
1459
1460The following methods can return different results depending on
1461how they are called. If the user explicitly calls either
1462of the C<pasv> or C<port> methods then these methods will
1463return a I<true> or I<false> value. If the user does not
1464call either of these methods then the result will be a
1465reference to a C<Net::FTP::dataconn> based object.
1466
1467=over 4
1468
1469=item nlst ( [ DIR ] )
1470
1471Send an C<NLST> command to the server, with an optional parameter.
1472
1473=item list ( [ DIR ] )
1474
1475Same as C<nlst> but using the C<LIST> command
1476
1477=item retr ( FILE )
1478
1479Begin the retrieval of a file called C<FILE> from the remote server.
1480
1481=item stor ( FILE )
1482
1483Tell the server that you wish to store a file. C<FILE> is the
1484name of the new file that should be created.
1485
1486=item stou ( FILE )
1487
1488Same as C<stor> but using the C<STOU> command. The name of the unique
1489file which was created on the server will be available via the C<unique_name>
1490method after the data connection has been closed.
1491
1492=item appe ( FILE )
1493
1494Tell the server that we want to append some data to the end of a file
1495called C<FILE>. If this file does not exist then create it.
1496
1497=back
1498
1499If for some reason you want to have complete control over the data connection,
1500this includes generating it and calling the C<response> method when required,
1501then the user can use these methods to do so.
1502
1503However calling these methods only affects the use of the methods above that
1504can return a data connection. They have no effect on methods C<get>, C<put>,
1505C<put_unique> and those that do not require data connections.
1506
1507=over 4
1508
1509=item port ( [ PORT ] )
1510
1511Send a C<PORT> command to the server. If C<PORT> is specified then it is sent
1512to the server. If not, then a listen socket is created and the correct information
1513sent to the server.
1514
1515=item pasv ()
1516
1517Tell the server to go into passive mode. Returns the text that represents the
1518port on which the server is listening, this text is in a suitable form to
1519sent to another ftp server using the C<port> method.
1520
1521=back
1522
1523The following methods can be used to transfer files between two remote
1524servers, providing that these two servers can connect directly to each other.
1525
1526=over 4
1527
1528=item pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] )
1529
1530This method will do a file transfer between two remote ftp servers. If
1531C<DEST_FILE> is omitted then the leaf name of C<SRC_FILE> will be used.
1532
1533=item pasv_xfer_unique ( SRC_FILE, DEST_SERVER [, DEST_FILE ] )
1534
1535Like C<pasv_xfer> but the file is stored on the remote server using
1536the STOU command.
1537
1538=item pasv_wait ( NON_PASV_SERVER )
1539
1540This method can be used to wait for a transfer to complete between a passive
1541server and a non-passive server. The method should be called on the passive
1542server with the C<Net::FTP> object for the non-passive server passed as an
1543argument.
1544
1545=item abort ()
1546
1547Abort the current data transfer.
1548
1549=item quit ()
1550
1551Send the QUIT command to the remote FTP server and close the socket connection.
1552
1553=back
1554
1555=head2 Methods for the adventurous
1556
1557C<Net::FTP> inherits from C<Net::Cmd> so methods defined in C<Net::Cmd> may
1558be used to send commands to the remote FTP server.
1559
1560=over 4
1561
1562=item quot (CMD [,ARGS])
1563
1564Send a command, that Net::FTP does not directly support, to the remote
1565server and wait for a response.
1566
1567Returns most significant digit of the response code.
1568
1569B<WARNING> This call should only be used on commands that do not require
1570data connections. Misuse of this method can hang the connection.
1571
1572=back
1573
1574=head1 THE dataconn CLASS
1575
1576Some of the methods defined in C<Net::FTP> return an object which will
1577be derived from this class.The dataconn class itself is derived from
1578the C<IO::Socket::INET> class, so any normal IO operations can be performed.
1579However the following methods are defined in the dataconn class and IO should
1580be performed using these.
1581
1582=over 4
1583
1584=item read ( BUFFER, SIZE [, TIMEOUT ] )
1585
1586Read C<SIZE> bytes of data from the server and place it into C<BUFFER>, also
1587performing any <CRLF> translation necessary. C<TIMEOUT> is optional, if not
1588given, the timeout value from the command connection will be used.
1589
1590Returns the number of bytes read before any <CRLF> translation.
1591
1592=item write ( BUFFER, SIZE [, TIMEOUT ] )
1593
1594Write C<SIZE> bytes of data from C<BUFFER> to the server, also
1595performing any <CRLF> translation necessary. C<TIMEOUT> is optional, if not
1596given, the timeout value from the command connection will be used.
1597
1598Returns the number of bytes written before any <CRLF> translation.
1599
1600=item bytes_read ()
1601
1602Returns the number of bytes read so far.
1603
1604=item abort ()
1605
1606Abort the current data transfer.
1607
1608=item close ()
1609
1610Close the data connection and get a response from the FTP server. Returns
1611I<true> if the connection was closed successfully and the first digit of
1612the response from the server was a '2'.
1613
1614=back
1615
1616=head1 UNIMPLEMENTED
1617
1618The following RFC959 commands have not been implemented:
1619
1620=over 4
1621
1622=item B<ALLO>
1623
1624Allocates storage for the file to be transferred.
1625
1626=item B<SMNT>
1627
1628Mount a different file system structure without changing login or
1629accounting information.
1630
1631=item B<HELP>
1632
1633Ask the server for "helpful information" (that's what the RFC says) on
1634the commands it accepts.
1635
1636=item B<MODE>
1637
1638Specifies transfer mode (stream, block or compressed) for file to be
1639transferred.
1640
1641=item B<SYST>
1642
1643Request remote server system identification.
1644
1645=item B<STAT>
1646
1647Request remote server status.
1648
1649=item B<STRU>
1650
1651Specifies file structure for file to be transferred.
1652
1653=item B<REIN>
1654
1655Reinitialize the connection, flushing all I/O and account information.
1656
1657=back
1658
1659=head1 REPORTING BUGS
1660
1661When reporting bugs/problems please include as much information as possible.
1662It may be difficult for me to reproduce the problem as almost every setup
1663is different.
1664
1665A small script which yields the problem will probably be of help. It would
1666also be useful if this script was run with the extra options C<Debug => 1>
1667passed to the constructor, and the output sent with the bug report. If you
1668cannot include a small script then please include a Debug trace from a
1669run of your program which does yield the problem.
1670
1671=head1 AUTHOR
1672
1673Graham Barr <gbarr@pobox.com>
1674
1675=head1 SEE ALSO
1676
1677L<Net::Netrc>
1678L<Net::Cmd>
1679
1680ftp(1), ftpd(8), RFC 959
1681http://www.cis.ohio-state.edu/htbin/rfc/rfc959.html
1682
1683=head1 USE EXAMPLES
1684
1685For an example of the use of Net::FTP see
1686
1687=over 4
1688
1689=item http://www.csh.rit.edu/~adam/Progs/autoftp-2.0.tar.gz
1690
1691C<autoftp> is a program that can retrieve, send, or list files via
1692the FTP protocol in a non-interactive manner.
1693
1694=back
1695
1696=head1 CREDITS
1697
1698Henry Gabryjelski <henryg@WPI.EDU> - for the suggestion of creating directories
1699recursively.
1700
1701Nathan Torkington <gnat@frii.com> - for some input on the documentation.
1702
1703Roderick Schertler <roderick@gate.net> - for various inputs
1704
1705=head1 COPYRIGHT
1706
1707Copyright (c) 1995-1998 Graham Barr. All rights reserved.
1708This program is free software; you can redistribute it and/or modify it
1709under the same terms as Perl itself.
1710
1711=for html <hr>
1712
1713I<$Id: //depot/libnet/Net/FTP.pm#68 $>
1714
1715=cut