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