def Recursor.set_hints(hints, resolver)
TheLog.debug(";; hints(#{hints.inspect})\n")
if (!hints && @@nameservers)
@@hints=(@@nameservers)
else
@@nameservers=(hints)
end
TheLog.debug(";; verifying (root) zone...\n")
resolver.recurse=(1)
packet=resolver.query_no_validation_or_recursion(".", "NS", "IN")
hints = Hash.new
if (packet)
if (ans = packet.answer)
ans.each do |rr|
if (rr.name.to_s =~ /^\.?$/ and
rr.type == Types::NS)
server = rr.nsdname.to_s.downcase
server.sub!(/\.$/,"")
TheLog.debug(";; FOUND HINT: #{server}\n")
hints[server] = AddressCache.new
end
end
packet.additional.each do |rr|
TheLog.debug(";; ADDITIONAL: "+rr.inspect+"\n")
server = rr.name.to_s.downcase
server.sub!(/\.$/,"")
if (server)
if ( rr.type == Types::A)
if (hints[server]!=nil)
TheLog.debug(";; STORING IP: #{server} IN A "+rr.address.to_s+"\n")
hints[server].push([rr.address.to_s, rr.ttl])
end
end
if ( rr.type == Types::AAAA)
if (hints[server])
TheLog.debug(";; STORING IP6: #{server} IN AAAA "+rr.address.to_s+"\n")
hints[server].push([rr.address.to_s, rr.ttl])
end
end
end
end
end
hints.keys.each do |server|
if (!hints[server] || hints[server].length == 0)
hints.delete(server)
end
end
@@hints = hints
else
@@hints = {}
end
if (@@hints.size > 0)
if (@debug)
TheLog.info(";; USING THE FOLLOWING HINT IPS:\n")
@@hints.values.each do |ips|
ips.each do |server|
TheLog.info(";; #{server}\n")
end
end
end
else
warn "Server ["+(@@nameservers)[0].to_s+".] did not give answers"
end
resolver.recurse=(0)
@@nameservers = @@hints.values
return @@nameservers
end