1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
--- im-140/IM/TcpTransaction.pm.orig Mon Mar 6 19:39:35 2000
+++ im-140/IM/TcpTransaction.pm Wed Mar 8 22:16:24 2000
@@ -15,6 +15,9 @@
require Exporter;
use IM::Config qw(dns_timeout connect_timeout command_timeout rcv_buf_siz);
use Socket;
+BEGIN {
+ eval 'use Socket6' unless (eval '&AF_INET6'); # IPv6 patched Perl
+}
use IM::Util;
use IM::Ssh;
use integer;
@@ -120,8 +123,8 @@
$remoteport = $serv;
$Cur_server = $s;
}
- $0 = progname() . ": im_getaddrinfo($s)";
- @he_infos = im_getaddrinfo($s, $remoteport, AF_UNSPEC, SOCK_STREAM);
+ $0 = progname() . ": getaddrinfo($s)";
+ @he_infos = getaddrinfo($s, $remoteport, AF_UNSPEC, SOCK_STREAM);
if ($#he_infos < 1) {
im_warn("address unknown for $s\n");
@Response = ("address unknown for $s");
@@ -147,7 +150,7 @@
if ($family == AF_INET) {
$port = (unpack_sockaddr_in($sin))[0];
} else {
- $port = (inet6_unpack_sockaddr_in6($sin))[0];
+ $port = (unpack_sockaddr_in6($sin))[0];
}
*SOCK = \*{$name};
$SOCK = $port;
@@ -364,7 +367,9 @@
my $count = shift;
pool_priv_sock_af($count, AF_INET);
- pool_priv_sock_af($count, inet6_family()) if (eval '&AF_INET6');
+ if (eval 'pack_sockaddr_in6(110, pack("N4", 0, 0, 0, 0))') {
+ pool_priv_sock_af($count, AF_INET6);
+ }
}
sub pool_priv_sock_af ($$) {
@@ -391,7 +396,7 @@
$psin = pack_sockaddr_in($privport, $ANYADDR);
} else {
$ANYADDR = pack('N4', 0, 0, 0, 0);
- $psin = inet6_pack_sockaddr_in6($privport, $ANYADDR);
+ $psin = pack_sockaddr_in6($privport, $ANYADDR);
}
last if (bind (*{$TcpSockName}, $psin));
im_warn("privileged socket binding failed: $!.\n")
@@ -432,68 +437,6 @@
im_die("connection error\n");
}
-sub im_getaddrinfo ($$;$$$$) {
- return getaddrinfo(@_) if (defined &getaddrinfo);
-
- my ($node, $serv, $family, $socktype, $proto, $flags) = @_;
-
- my ($pe_name, $pe_aliases, $pe_proto, $se_port);
- if (unixp()) {
- $proto = 'tcp' unless ($proto);
- ($pe_name, $pe_aliases, $pe_proto) = getprotobyname($proto);
- }
- $pe_proto = 6 unless ($pe_name);
- return unless ($se_port = getserv($serv, $proto));
-
- my ($he_name, $he_alias, $he_type, $he_len, @he_addrs);
- if ($node =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
- @he_addrs = (pack('C4', $1, $2, $3, $4));
- $family = AF_INET;
- } elsif ($node =~ /^[\da-f:]+$/i) {
- if ($node =~ /::.*::/) {
- im_err("bad server address in IPv6 format: $node\n");
- return;
- }
- if ($node =~ /::/) {
- (my $t = $node) =~ s/[^:]//g;
- my $n = 7 - length($t);
- $t = ':0:';
- while ($n--) {
- $t .= '0:';
- }
- $node =~ s/::/$t/;
- }
- if ($node =~ /^([\da-f]*):([\da-f]*):([\da-f]*):([\da-f]*):([\da-f]*):([\da-f]*):([\da-f]*):([\da-f]*)$/i) {
- @he_addrs = (pack('n8',
- hex("0x$1"), hex("0x$2"), hex("0x$3"), hex("0x$4"),
- hex("0x$5"), hex("0x$6"), hex("0x$7"), hex("0x$8")));
- $family = inet6_family(); # AF_INET6
- } else {
- im_err("bad server address in IPv6 format: $node\n");
- return;
- }
- } else {
- alarm(dns_timeout()) unless win95p();
- ($he_name, $he_alias, $he_type, $he_len, @he_addrs)
- = gethostbyname($node);
- alarm(0) unless win95p();
- return unless ($he_name);
- $family = $he_type;
- }
-
- my ($he_addr, @infos);
- foreach $he_addr (@he_addrs) {
- my $sin;
- if ($family == AF_INET) {
- $sin = pack_sockaddr_in($se_port, $he_addr);
- } else {
- $sin = inet6_pack_sockaddr_in6($se_port, $he_addr);
- }
- push(@infos, $family, $socktype, $pe_proto, $sin, $he_name);
- }
- @infos;
-}
-
sub getserv($$) {
my ($serv, $proto) = @_;
@@ -522,28 +465,6 @@
}
}
$se_port;
-}
-
-sub inet6_pack_sockaddr_in6 ($;$) {
- return pack_sockaddr_in6(@_) if (defined &pack_sockaddr_in6);
-
- my ($port, $he_addr) = @_;
- pack('CCnN', 1+1+2+4+16+4, inet6_family(), $port, 0) . $he_addr .
- pack('N', 0);
-}
-
-sub inet6_unpack_sockaddr_in6 ($) {
- return unpack_sockaddr_in6(@_) if (defined &unpack_sockaddr_in6);
-
- my $sock = shift;
- my ($len, $family, $port, $flow, $a1, $a2, $a3, $a4)
- = unpack('CCnNN4', $sock);
- my $addr = pack('N4', $a1, $a2, $a3, $a4);
- ($port, $addr);
-}
-
-sub inet6_family () {
- return eval '&AF_INET6' || 24;
}
1;
|