The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
--- 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;