Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
c9eb198
* ext/Win32API/lib/win32/resolv.rb: added.
unak Jul 24, 2003
d7a1036
* ext/Win32API/lib/win32/resolv.rb (get_info): support multiple DNS.
unak Oct 24, 2005
10ab1ff
* ext/Win32API/*: removed or moved to ext/dl/win32.
unak Dec 3, 2007
a915fe7
* lib/resolv.rb (Resolv::Hosts): should not use win32/resolv on cygwin.
nobu Mar 21, 2008
31fb6a4
* lib/resolv.rb (Resolv::Config.default_config_hash): requires
nobu Mar 31, 2008
cda2cfa
* ext/dl/win32/lib/win32/{registry,resolv}.rb: use dl/import instead
unak Mar 3, 2009
07f166a
* ext/dl/win32/lib/win32/resolv.rb: get rid of warning.
unak Mar 3, 2009
a476972
* {ext,lib,test}/**/*.rb: removed trailing spaces.
nobu Mar 6, 2009
82dcffe
* ext/dl/win32/lib/win32/resolv.rb (get_info): get rid of a warning.
unak Aug 10, 2010
ed102c6
* ext/fiddle/win32/*: library ports from DL to Fiddle.
unak Dec 10, 2012
1fd3c77
ext/win32: move
nobu Jul 13, 2013
dd4b434
handle ext/ as r53141
nurse Dec 16, 2015
364713a
split win32/resolv9x.rb
nobu Feb 15, 2016
a12319e
avoid ruby-mode.el bug
nobu Feb 15, 2016
9dec211
win32/resolv.rb: check pointer size
nobu Feb 15, 2016
5ced302
win32/resolv.rb: invert the condition
nobu Feb 15, 2016
82f4441
Explicit ".dll" suffix
nobu Jun 26, 2016
514bef0
win32/resolv: get_dns_server_list
nobu Jul 31, 2016
290d0d1
resolv.c: fix commit miss
nobu Jul 31, 2016
13761dd
win32/resolv: fix for cygwin
nobu Aug 10, 2016
65d55eb
win32/resolv: fix for cygwin
nobu Aug 10, 2016
46d4055
win32/resolv.rb: ad hoc workaround
nobu Jan 4, 2017
02f8c5d
resolv9x.rb: fix typo
nobu Feb 14, 2017
3805f76
win32/resolv.rb: call rb_w32_osid
nobu Jan 18, 2018
b2f8683
Removed win32/resolv.rb for 32bit env
hsbt Nov 10, 2020
9ae2106
Expand tabs [ci skip]
k0kubun Jul 21, 2022
48e427b
Add .git-blame-ignore-revs [ci skip]
k0kubun Jul 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# This is a file used by GitHub to ignore the following commits on `git blame`.
#
# You can also do the same thing in your local repository with:
# $ git config --local blame.ignoreRevsFile .git-blame-ignore-revs

# Expand tabs
9ae210665a8524554e7c868d3ec67af54b0958bb
3 changes: 3 additions & 0 deletions ext/win32/resolv/extconf.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
if have_library('iphlpapi', 'GetNetworkParams')
create_makefile('win32/resolv')
end
135 changes: 135 additions & 0 deletions ext/win32/resolv/lib/win32/resolv.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# frozen_string_literal: false
=begin
= Win32 DNS and DHCP I/F

=end

require 'win32/registry'

module Win32
module Resolv
API = Registry::API
Error = Registry::Error

def self.get_hosts_path
path = get_hosts_dir
path = File.expand_path('hosts', path)
File.exist?(path) ? path : nil
end

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
end
end

begin
require 'win32/resolv.so'
rescue LoadError
end

module Win32
#====================================================================
# Windows NT
#====================================================================
module Resolv
module SZ
refine Registry do
# ad hoc workaround for broken registry
def read_s(key)
type, str = read(key)
unless type == Registry::REG_SZ
warn "Broken registry, #{name}\\#{key} was #{Registry.type2name(type)}, ignored"
return String.new
end
str
end
end
end
using SZ

TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'

class << self
private
def get_hosts_dir
Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
reg.read_s_expand('DataBasePath')
end
end

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
end
end
end
65 changes: 65 additions & 0 deletions ext/win32/resolv/resolv.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#include <ruby.h>
#include <ruby/encoding.h>
#include <windows.h>
#ifndef NTDDI_VERSION
#define NTDDI_VERSION 0x06000000
#endif
#include <iphlpapi.h>

static VALUE
w32error_make_error(DWORD e)
{
VALUE code = ULONG2NUM(e);
return rb_class_new_instance(1, &code, rb_path2class("Win32::Resolv::Error"));
}

static void
w32error_raise(DWORD e)
{
rb_exc_raise(w32error_make_error(e));
}

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;
}

void
InitVM_resolv(void)
{
VALUE mWin32 = rb_define_module("Win32");
VALUE resolv = rb_define_module_under(mWin32, "Resolv");
VALUE singl = rb_singleton_class(resolv);
rb_define_private_method(singl, "get_dns_server_list", get_dns_server_list, 0);
}

void
Init_resolv(void)
{
InitVM(resolv);
}