summaryrefslogtreecommitdiff
path: root/ftp/ftpmirror/files/patch-FTP.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ftp/ftpmirror/files/patch-FTP.pm')
-rw-r--r--ftp/ftpmirror/files/patch-FTP.pm108
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