class Gem::Resolv::Hosts
def each_address(name, &proc)
def each_address(name, &proc) lazy_initialize @name2addr[name]&.each(&proc) end
def each_name(address, &proc)
def each_name(address, &proc) lazy_initialize @addr2name[address]&.each(&proc) end
def getaddress(name)
def getaddress(name) each_address(name) {|address| return address} raise ResolvError.new("#{@filename} has no name: #{name}") end
def getaddresses(name)
def getaddresses(name) ret = [] each_address(name) {|address| ret << address} return ret end
def getname(address)
def getname(address) each_name(address) {|name| return name} raise ResolvError.new("#{@filename} has no address: #{address}") end
def getnames(address)
def getnames(address) ret = [] each_name(address) {|name| ret << name} return ret end
def initialize(filename = DefaultFileName)
def initialize(filename = DefaultFileName) @filename = filename @mutex = Thread::Mutex.new @initialized = nil end
def lazy_initialize # :nodoc:
def lazy_initialize # :nodoc: @mutex.synchronize { unless @initialized @name2addr = {} @addr2name = {} File.open(@filename, 'rb') {|f| f.each {|line| line.sub!(/#.*/, '') addr, *hostnames = line.split(/\s+/) next unless addr (@addr2name[addr] ||= []).concat(hostnames) hostnames.each {|hostname| (@name2addr[hostname] ||= []) << addr} } } @name2addr.each {|name, arr| arr.reverse!} @initialized = true end } self end