[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 メーリングリストの案内