From: "NARUSE, Yui" Date: 2007-12-28T14:57:26+09:00 Subject: [ruby-dev:32852] Resolv::DNS#getaddresses doesn't return IPv6 address 成瀬です。 Resolv::DNS#getaddresses 等が IPv6 アドレスを返しません。 たとえば、www.jprs.jp には AAAA レコードが設定してあるのですが、IPv4アド レスしか返ってきません。 % dig any www.jprs.jp ;; ANSWER SECTION: www.jprs.jp. 82163 IN A 202.11.16.167 www.jprs.jp. 82163 IN AAAA 2001:218:2003::1 % ruby -rresolv -e'p Resolv::DNS.new.getaddresses("www.jprs.jp")' [#] これは、390行目あたりの Resolv::DNS#each_address が A レコードしか取って きていないからです。 def each_address(name) each_resource(name, Resource::IN::A) {|resource| yield resource.address} end 以下のように ANY ですべて拾ってくるようにすれば解決します。この場合、 IPv6 アドレスのみのホストのときに、getaddress で今まで no address だった ところ、IPv6 アドレスが返るようになります。 なお、buf を設けない場合、ns0.v6.ntt.net のように AAAA レコードが A レ コードより先に登録されているホストの時に getaddress で IPv6 アドレスが 返ってきてしまうため、互換性に問題が生じる恐れがあります。 Index: lib/resolv.rb =================================================================== --- lib/resolv.rb (リビジョン 14750) +++ lib/resolv.rb (作業コピー) @@ -388,7 +388,16 @@ # be a Resolv::IPv4 or Resolv::IPv6 def each_address(name) - each_resource(name, Resource::IN::A) {|resource| yield resource.address} + buf = [] + each_resource(name, Resource::IN::ANY) do |resource| + case resource.address + when Resolv::IPv4 + yield resource.address + when Resolv::IPv6 + buf << resource.address + end + end + buf.each {|resource| yield resource.address} end ## @@ -445,7 +454,6 @@ # * Resolv::DNS::Resource::IN::A # * Resolv::DNS::Resource::IN::AAAA # * Resolv::DNS::Resource::IN::ANY - # * Resolv::DNS::Resource::IN::ANY # * Resolv::DNS::Resource::IN::CNAME # * Resolv::DNS::Resource::IN::HINFO # * Resolv::DNS::Resource::IN::MINFO -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA