[Mew-dist 11476] Re: im-133

Hajimu UMEMOTO ( 梅本 肇 ) ume at example.com
1999年 11月 26日 (金) 02:38:06 JST


  梅本@IMASYです。

>>> Thu, 25 Nov 1999 20:03:17 +0900 の刻に「うめ」、すなわち
>>> Hajimu UMEMOTO (梅本 肇) <ume at example.com> 氏曰く

うめ>   Perl だと、アドレスの長さを length() で見れば IPv4 アドレスか IPv6 ア
うめ> ドレスか判定がつくので、@he_addrs に IPv4 アドレスと IPv6 アドレスをその
うめ> まま突っ込んじゃっても何とかなるという、単に手抜きなコードを書いてるだけ
うめ> です。^^;

  取り敢えず投げちゃいます。

    1) IPv6 Perl の場合、gethostbyname2() を使って、AAAA と A を見る。

    2) IPv6 Perl でない場合、RPOP の IPv6 サポートを無効にする。

となってます。
-------------- next part --------------
Index: IM/TcpTransaction.pm
===================================================================
RCS file: /usr/home/ume/ncvs/src/im/IM/TcpTransaction.pm,v
retrieving revision 1.1.1.15
retrieving revision 1.4
diff -u -r1.1.1.15 -r1.4
--- TcpTransaction.pm	1999/11/10 18:13:09	1.1.1.15
+++ TcpTransaction.pm	1999/11/25 17:21:40	1.4
@@ -101,8 +101,8 @@
 	    return '';
 	}
     }
-    my ($he_name, $he_alias, $he_type, $he_len, $he_addr, @he_addrs);
-    my ($family, $s, $localport, $remoteport, $sin);
+    my ($he_addr, @he_addrs);
+    my ($s, $localport, $remoteport, $sin);
     while ($s = shift(@$servers)) {
 	my ($r) = ($#$servers >= 0) ? 'skipped' : 'failed';
 	# manage server[/remoteport]%localport
@@ -145,7 +145,6 @@
 	}
 	if ($s =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
 	    @he_addrs = (pack('C4', $1, $2, $3, $4));
-	    $family = AF_INET;
 	} elsif ($s =~ /^[\da-f:]+$/i) {
 	    if ($s =~ /::.*::/) {
 		im_err("bad server address in IPv6 format: $s\n");
@@ -164,7 +163,6 @@
 		@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: $s\n");
 		return '';
@@ -172,10 +170,17 @@
 	} else {
 	    alarm(dns_timeout()) unless win95p();
 	    $0 = progname() . ": gethostbyname($s)";
-	    ($he_name, $he_alias, $he_type, $he_len, @he_addrs)
-	      = gethostbyname ($s);
+	    if (eval '&AF_INET6') {	# perl supports IPv6
+		my @he_addrs6 = gethostbyname2($s, inet6_family());
+		@he_addrs = gethostbyname2($s, AF_INET);
+		splice(@he_addrs6, 0, 4);
+		splice(@he_addrs, 0, 4, @he_addrs6);
+	    } else {
+		@he_addrs = gethostbyname($s);
+		splice(@he_addrs, 0, 4);
+	    }
 	    alarm(0) unless win95p();
-	    unless ($he_name) {
+	    if ($#he_addrs < 0) {
 		im_warn("address unknown for $s\n");
 		@Response = ("address unknown for $s");
 		if ($proto eq 'smtp') {
@@ -187,10 +192,10 @@
 		}
 		next;
 	    }
-	    $family = $he_type;
 	}
 
 	foreach $he_addr (@he_addrs) {
+	    my $family = (length($he_addr) == 4) ? AF_INET : inet6_family();
 	    if ($root && unixp()) {
 		my $name = priv_sock($family);
 		if ($name eq '') {
@@ -413,7 +418,7 @@
     my $count = shift;
 
     pool_priv_sock_af($count, AF_INET);
-    pool_priv_sock_af($count, inet6_family());
+    pool_priv_sock_af($count, inet6_family()) if (eval '&AF_INET6');
 }
 
 sub pool_priv_sock_af ($$) {
-------------- next part --------------
梅本 肇 @ インターネット互助会横浜  http://www.imasy.org/~ume/
ume at example.com  ume at example.com  ume at example.com
プログラムは書いた人の意図ではなく書かれた通り動く


Mew-dist メーリングリストの案内