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