| Class | Resolv::Hosts |
| In: |
lib/resolv.rb
|
| Parent: | Object |
| DefaultFileName | = | Win32::Resolv.get_hosts_path |
| DefaultFileName | = | '/etc/hosts' |
# File lib/resolv.rb, line 293
293: def initialize(filename = DefaultFileName)
294: @filename = filename
295: @mutex = Mutex.new
296: @initialized = nil
297: end
# File lib/resolv.rb, line 341
341: def each_address(name, &proc)
342: lazy_initialize
343: if @name2addr.include?(name)
344: @name2addr[name].each(&proc)
345: end
346: end
# File lib/resolv.rb, line 359
359: def each_name(address, &proc)
360: lazy_initialize
361: if @addr2name.include?(address)
362: @addr2name[address].each(&proc)
363: end
364: end
# File lib/resolv.rb, line 330
330: def getaddress(name)
331: each_address(name) {|address| return address}
332: raise ResolvError.new("#{@filename} has no name: #{name}")
333: end
# File lib/resolv.rb, line 335
335: def getaddresses(name)
336: ret = []
337: each_address(name) {|address| ret << address}
338: return ret
339: end
# File lib/resolv.rb, line 348
348: def getname(address)
349: each_name(address) {|name| return name}
350: raise ResolvError.new("#{@filename} has no address: #{address}")
351: end
# File lib/resolv.rb, line 353
353: def getnames(address)
354: ret = []
355: each_name(address) {|name| ret << name}
356: return ret
357: end
# File lib/resolv.rb, line 299
299: def lazy_initialize
300: @mutex.synchronize {
301: unless @initialized
302: @name2addr = {}
303: @addr2name = {}
304: open(@filename) {|f|
305: f.each {|line|
306: line.sub!(/#.*/, '')
307: addr, hostname, *aliases = line.split(/\s+/)
308: next unless addr
309: addr.untaint
310: hostname.untaint
311: @addr2name[addr] = [] unless @addr2name.include? addr
312: @addr2name[addr] << hostname
313: @addr2name[addr] += aliases
314: @name2addr[hostname] = [] unless @name2addr.include? hostname
315: @name2addr[hostname] << addr
316: aliases.each {|n|
317: n.untaint
318: @name2addr[n] = [] unless @name2addr.include? n
319: @name2addr[n] << addr
320: }
321: }
322: }
323: @name2addr.each {|name, arr| arr.reverse!}
324: @initialized = true
325: end
326: }
327: self
328: end