From: "NARUSE, Yui" Date: 2008-01-06T18:20:15+09:00 Subject: [ruby-dev:32933] Re: Resolv::DNS#getaddresses doesn't return IPv6 address 成瀬です。 Hajimu UMEMOTO wrote: > どちらを先に返すかはポリシの話になります。AAAA RR を先に返すのは、 > IPv6 を積極的に使わせようという意図があるからです。IPv6 普及という観点 > では AAAA RR を先に返して欲しいところですが、いろいろ問題が起きてるのも > 事実なので、悩ましいところです。 > クエリを行う順序については、AAAA RR を先に照会すると NXDOMAIN を返し > てくるダメなサーバも世の中には存在しますので、A RR を先に照会する今の実 > 装の方が良いと思います。 わたしが気にしていたのは IPv6 が返ってくるとエラーの出るプログラムがある 可能性と、FLETS.NET のような外に出れない環境でした。 けれども、 Ruby 1.9 においては前者は気にならないのでした。 とりあえず IPv6 Fix を参考にして、3.4.1 の AAAA RR の問い合わせを限定す るのがいいのでしょうか。3.4.2 にあるような AAAA RRの問い合わせを無視する DNS サーバーって今もかなりあるのですかね・・・? > RFC 3484 を実装している環境ならそれに従うのが格好良いのでしょうけれど、 > API が標準化されていませんので、辛いところです。 ほー、こういうものがあるのですね。標準化されていなくてもアクセスさえでき れば使える OS では使うんですが・・・。独自で実装するのも手間ですしねぇ。 Index: lib/resolv.rb =================================================================== --- lib/resolv.rb (revision 14898) +++ lib/resolv.rb (working copy) @@ -290,6 +290,12 @@ class Resolv DNSThreadGroup = ThreadGroup.new ## + # IPv6 is enabled or not + + IPv6Enabled = Socket.getaddrinfo(Socket.gethostname, nil). + any?{|x| true if x[4] == Socket::AF_INET6 && !x[3].between?('FE8', 'FEC')} + + ## # Creates a new DNS resolver. See Resolv::DNS.new for argument details. # # Yields the created DNS resolver to the block, if given, otherwise @@ -387,8 +393,12 @@ class Resolv # be a Resolv::IPv4 or Resolv::IPv6 def each_address(name) - each_resource(name, Resource::IN::A) {|resource| yield resource.address} - each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address} + if IPv6Enabled + each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address} + each_resource(name, Resource::IN::A) {|resource| yield resource.address} + else + each_resource(name, Resource::IN::A) {|resource| buf << resource.address} + end end ## -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA