class Resolv

Windows NT

Constants

API
DHCP_9X
Error
TCPIP_9X
TCPIP_NT
WINDOWS

Public Class Methods

get_dhcpinfo() click to toggle source
# File win32/lib/win32/resolv9x.rb, line 42
def get_dhcpinfo
  macaddrs = {}
  ipaddrs = {}
  WsControl.get_iflist.each do |index, macaddr, *ipaddr|
    macaddrs[macaddr] = 1
    ipaddr.each { |ipaddr| ipaddrs[ipaddr] = 1 }
  end
  iflist = [ macaddrs, ipaddrs ]

  search = []
  nameserver = []
  version = -1
  Registry::HKEY_LOCAL_MACHINE.open(DHCP_9X) do |reg|
    begin
      version = API.unpackdw(reg.read_bin("Version"))
    rescue Registry::Error
    end

    reg.each_key do |key, |
      catch(:not_used) do
        reg.open(key) do |regdi|
          dom, ns = get_dhcpinfo_key(version, regdi, iflist)
          search << dom if dom
          nameserver.concat(ns) if ns
        end
      end
    end
  end
  [ search, nameserver ]
end
get_dhcpinfo_95(reg) click to toggle source
# File win32/lib/win32/resolv9x.rb, line 73
def get_dhcpinfo_95(reg)
  dhcp = reg.read_bin("DhcpInfo")
  [
    API.unpackdw(dhcp[4..7]),
    API.unpackdw(dhcp[8..11]),
    1,
    dhcp[45..50],
    reg.read_bin("OptionInfo"),
  ]
end
get_dhcpinfo_98(reg) click to toggle source
# File win32/lib/win32/resolv9x.rb, line 84
def get_dhcpinfo_98(reg)
  [
    API.unpackdw(reg.read_bin("DhcpIPAddress")),
    API.unpackdw(reg.read_bin("DhcpSubnetMask")),
    API.unpackdw(reg.read_bin("HardwareType")),
    reg.read_bin("HardwareAddress"),
    reg.read_bin("OptionInfo"),
  ]
end
get_dhcpinfo_key(version, reg, iflist) click to toggle source
# File win32/lib/win32/resolv9x.rb, line 94
def get_dhcpinfo_key(version, reg, iflist)
  info = case version
         when 1
           get_dhcpinfo_95(reg)
         when 2
           get_dhcpinfo_98(reg)
         else
           begin
             get_dhcpinfo_98(reg)
           rescue Registry::Error
             get_dhcpinfo_95(reg)
           end
         end
  ipaddr, netmask, hwtype, macaddr, opt = info
  throw :not_used unless
    ipaddr and ipaddr != 0 and
    netmask and netmask != 0 and
    macaddr and macaddr.size == 6 and
    hwtype == 1 and
    iflist[0][macaddr] and iflist[1][ipaddr]

  size = opt.size
  idx = 0
  while idx <= size
    opttype = opt[idx]
    optsize = opt[idx + 1]
    optval  = opt[idx + 2, optsize]
    case opttype
    when 0xFF    ## term
      break
    when 0x0F    ## domain
      domain = optval.chomp("\0")
    when 0x06    ## dns
      nameserver = optval.scan(/..../).collect { |addr|
        "%d.%d.%d.%d" % addr.unpack('C4')
      }
    end
    idx += optsize + 2
  end
  [ domain, nameserver ]
rescue Registry::Error
  throw :not_used
end
get_hosts_path() click to toggle source
# File win32/lib/win32/resolv.rb, line 14
def self.get_hosts_path
  path = get_hosts_dir
  path = File.expand_path('hosts', path)
  File.exist?(path) ? path : nil
end
get_resolv_info() click to toggle source
# File win32/lib/win32/resolv.rb, line 20
def self.get_resolv_info
  search, nameserver = get_info
  if search.empty?
    search = nil
  else
    search.delete("")
    search.uniq!
  end
  if nameserver.empty?
    nameserver = nil
  else
    nameserver.delete("")
    nameserver.delete("0.0.0.0")
    nameserver.uniq!
  end
  [ search, nameserver ]
end

Private Class Methods

get_dns_server_list() click to toggle source
static VALUE
get_dns_server_list(VALUE self)
{
    FIXED_INFO *fixedinfo = NULL;
    ULONG buflen = 0;
    DWORD ret;
    VALUE buf, nameservers = Qnil;

    ret = GetNetworkParams(NULL, &buflen);
    if (ret != NO_ERROR && ret != ERROR_BUFFER_OVERFLOW) {
        w32error_raise(ret);
    }
    fixedinfo = ALLOCV(buf, buflen);
    ret = GetNetworkParams(fixedinfo, &buflen);
    if (ret == NO_ERROR) {
        const IP_ADDR_STRING *ipaddr = &fixedinfo->DnsServerList;
        nameservers = rb_ary_new();
        do {
            const char *s = ipaddr->IpAddress.String;
            if (!*s) continue;
            if (strcmp(s, "0.0.0.0") == 0) continue;
            rb_ary_push(nameservers, rb_str_new_cstr(s));
        } while ((ipaddr = ipaddr->Next) != NULL);
    }
    ALLOCV_END(buf);
    if (ret != NO_ERROR) w32error_raise(ret);

    return nameservers;
}
get_hosts_dir() click to toggle source
# File win32/lib/win32/resolv.rb, line 82
def get_hosts_dir
  Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
    reg.read_s_expand('DataBasePath')
  end
end
get_info() click to toggle source
# File win32/lib/win32/resolv.rb, line 88
def get_info
  search = nil
  nameserver = get_dns_server_list
  Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
    begin
      slist = reg.read_s('SearchList')
      search = slist.split(/,\s*/) unless slist.empty?
    rescue Registry::Error
    end

    if add_search = search.nil?
      search = []
      begin
        nvdom = reg.read_s('NV Domain')
        unless nvdom.empty?
          @search = [ nvdom ]
          if reg.read_i('UseDomainNameDevolution') != 0
            if /^\w+\./ =~ nvdom
              devo = $'
            end
          end
        end
      rescue Registry::Error
      end
    end

    reg.open('Interfaces') do |h|
      h.each_key do |iface, |
        h.open(iface) do |regif|
          next unless ns = %w[NameServer DhcpNameServer].find do |key|
            begin
              ns = regif.read_s(key)
            rescue Registry::Error
            else
              break ns.split(/[,\s]\s*/) unless ns.empty?
            end
          end
          next if (nameserver & ns).empty?

          if add_search
            begin
              [ 'Domain', 'DhcpDomain' ].each do |key|
                dom = regif.read_s(key)
                unless dom.empty?
                  search.concat(dom.split(/,\s*/))
                  break
                end
              end
            rescue Registry::Error
            end
          end
        end
      end
    end
    search << devo if add_search and devo
  end
  [ search.uniq, nameserver.uniq ]
end