Class: Resolv::Hosts

Inherits:
Object
  • Object
show all
Defined in:
lib/resolv.rb

Constant Summary collapse

DefaultFileName =
'/etc/hosts'

Instance Method Summary collapse

Constructor Details

#initialize(filename = DefaultFileName) ⇒ Hosts

Returns a new instance of Hosts.



293
294
295
296
297
# File 'lib/resolv.rb', line 293

def initialize(filename = DefaultFileName)
  @filename = filename
  @mutex = Mutex.new
  @initialized = nil
end

Instance Method Details

#each_address(name, &proc) ⇒ Object



341
342
343
344
345
346
# File 'lib/resolv.rb', line 341

def each_address(name, &proc)
  lazy_initialize
  if @name2addr.include?(name)
    @name2addr[name].each(&proc)
  end
end

#each_name(address, &proc) ⇒ Object



359
360
361
362
363
364
# File 'lib/resolv.rb', line 359

def each_name(address, &proc)
  lazy_initialize
  if @addr2name.include?(address)
    @addr2name[address].each(&proc)
  end
end

#getaddress(name) ⇒ Object

Raises:



330
331
332
333
# File 'lib/resolv.rb', line 330

def getaddress(name)
  each_address(name) {|address| return address}
  raise ResolvError.new("#{@filename} has no name: #{name}")
end

#getaddresses(name) ⇒ Object



335
336
337
338
339
# File 'lib/resolv.rb', line 335

def getaddresses(name)
  ret = []
  each_address(name) {|address| ret << address}
  return ret
end

#getname(address) ⇒ Object

Raises:



348
349
350
351
# File 'lib/resolv.rb', line 348

def getname(address)
  each_name(address) {|name| return name}
  raise ResolvError.new("#{@filename} has no address: #{address}")
end

#getnames(address) ⇒ Object



353
354
355
356
357
# File 'lib/resolv.rb', line 353

def getnames(address)
  ret = []
  each_name(address) {|name| ret << name}
  return ret
end

#lazy_initializeObject



299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/resolv.rb', line 299

def lazy_initialize
  @mutex.synchronize {
    unless @initialized
      @name2addr = {}
      @addr2name = {}
      open(@filename) {|f|
        f.each {|line|
          line.sub!(/#.*/, '')
          addr, hostname, *aliases = line.split(/\s+/)
          next unless addr
          addr.untaint
          hostname.untaint
          @addr2name[addr] = [] unless @addr2name.include? addr
          @addr2name[addr] << hostname
          @addr2name[addr] += aliases
          @name2addr[hostname] = [] unless @name2addr.include? hostname
          @name2addr[hostname] << addr
          aliases.each {|n|
            n.untaint
            @name2addr[n] = [] unless @name2addr.include? n
            @name2addr[n] << addr
          }
        }
      }
      @name2addr.each {|name, arr| arr.reverse!}
      @initialized = true
    end
  }
  self
end