diff options
Diffstat (limited to 'ftp/ftpmirror/files/patch-FTP.pm')
-rw-r--r-- | ftp/ftpmirror/files/patch-FTP.pm | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/ftp/ftpmirror/files/patch-FTP.pm b/ftp/ftpmirror/files/patch-FTP.pm new file mode 100644 index 000000000000..dd580e099080 --- /dev/null +++ b/ftp/ftpmirror/files/patch-FTP.pm @@ -0,0 +1,108 @@ +Index: Fan/FTP/FTP.pm +=================================================================== +RCS file: /usr/home/ume/ncvs/src/ftpmirror/Fan/FTP/FTP.pm,v +retrieving revision 1.1.1.2 +retrieving revision 1.6 +diff -u -r1.1.1.2 -r1.6 +--- Fan/FTP/FTP.pm 2000/03/03 07:35:58 1.1.1.2 ++++ Fan/FTP/FTP.pm 2000/03/09 13:32:04 1.6 +@@ -60,6 +60,9 @@ + + use Carp; + use Socket; ++BEGIN { ++ eval 'use Socket6' unless (eval '&AF_INET6'); # IPv6 patched Perl ++} + use Fan::TCP; + use AutoLoader 'AUTOLOAD'; + +@@ -390,7 +393,7 @@ + $self->clearerror || return undef; + $self->cleardataconn; # always success + +- my($port, $addr) = $self->sockname; ++ my ($port, $addr, $family) = $self->sockname; + + my $acpt = Fan::TCP->new(); + unless (defined($acpt)) { +@@ -398,20 +401,28 @@ + return undef; + } + +- unless ($acpt->do_server(tcp_bindaddr => $addr)) { ++ unless ($acpt->do_server(tcp_family => $family, ++ tcp_bindaddr => $addr)) { + warn("Fan::TCP->do_server failed"); + return undef; + } + +- ($port, $addr) = $acpt->sockname; +- unless ($addr =~ tr/./,/ == 3) { +- warn("ADDRESS=$addr must have just 3 dots"); +- return undef; ++ ($port, $addr, $family) = $acpt->sockname; ++ my $command; ++ if ($family == AF_INET) { ++ unless ($addr =~ tr/./,/ == 3) { ++ warn("ADDRESS=$addr must have just 3 dots"); ++ return undef; ++ } ++ $addr .= sprintf(",%d,%d", ($port >> 8) & 0xff, $port & 0xff); ++ $command = 'PORT'; ++ } else { ++ $addr = "|2|$addr|$port|"; ++ $command = 'EPRT'; + } +- $addr .= sprintf(",%d,%d", ($port >> 8) & 0xff, $port & 0xff); + +- unless ($self->putreq("PORT $addr") =~ /^2/) { +- warn("PORT command failed\n") if $LOG > 5; ++ unless ($self->putreq("$command $addr") =~ /^2/) { ++ warn("$command command failed\n") if $LOG > 5; + $self->error($self->{lastmesg}); + return undef; + } +@@ -437,12 +448,20 @@ + ;# + sub pasv ($) { + my $self = shift; +- my $a_regexp = '\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)'; + + $self->clearerror && + $self->cleardataconn || return undef; + +- if ($self->putreq("PASV") !~ /^2/) { ++ my $family = ($self->sockname)[2]; ++ my ($a_regexp, $command); ++ if ($family == AF_INET) { ++ $a_regexp = '\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)'; ++ $command = 'PASV'; ++ } else { ++ $a_regexp = '\([^\d\s]{3}(\d+)[^\d\s]\)'; ++ $command = 'EPSV'; ++ } ++ if ($self->putreq($command) !~ /^2/) { + $self->error($self->{lastmesg}); + return undef; + } +@@ -452,11 +471,18 @@ + } + + my $bindaddr = $self->{ftp_bindaddr}; +- my $port = $5 * 256 + $6; +- my $addr = join('.', $1, $2, $3, $4); ++ my ($port, $addr); ++ if ($family == AF_INET) { ++ $port = $5 * 256 + $6; ++ $addr = join('.', $1, $2, $3, $4); ++ } else { ++ $port = $1; ++ $addr = ($self->peername)[1]; ++ } + my $data = Fan::TCP->new(); + + $data && $data->do_client( ++ tcp_family => $family, + tcp_bindaddr => $bindaddr, + tcp_host => $addr, + tcp_port => $port |