From: "U.Nakamura" Date: 2002-01-21T13:32:20+09:00 Subject: [ruby-dev:15732] Re: win32/registry.rb (Re: [patch] resolv.rb for win32 platform) こんにちは、なかむら(う)です。 In message "[ruby-dev:15731] win32/registry.rb (Re: [patch] resolv.rb for win32 platform)" on Jan.20,2002 22:12:32, wrote: | > REG_EXPAND_SZ が REG_MULTI_SZ と同じ扱いになってますけど、こ | > れって何か意図がありますか? | > REG_SZ と同じ扱いにするのが普通だと思ったのですが。 | | いいえ,私の勘違いです。REG_SZ と同じ扱いが正しいです。 | 勢いだけで書いてしまったので…と言い訳してみる(^^; あ、やっぱり。ということで納得です。 これを踏まえて、resolv.rb へのパッチを末尾に。 [ruby-dev:15573] との違いは、hosts を拾ってくるところと、いき なり win32/registry を require しないで RUBY_PLATFORM を見る ようにしたことです。 さて、そういうわけで、registry.rb を標準添付することを提案し たいのですが、課題が幾つかあります。 1.いきなりこのまま標準添付でいいのか。要レビュー? 2.原著作者の意思(Tietewさん、どうでしょう?) 3.入れる場所はどこがよいか。候補は以下の通り lib/registry.rb lib/win32/registry.rb ext/Win32API/lib/registry.rb ext/Win32API/lib/win32/registry.rb ご意見を頂きたく。 Index: resolv.rb =================================================================== RCS file: /src/ruby/lib/resolv.rb,v retrieving revision 1.7 diff -u -p -w -r1.7 resolv.rb --- resolv.rb 2002/01/16 03:36:32 1.7 +++ resolv.rb 2002/01/21 04:20:54 @@ -262,7 +262,24 @@ class Resolv end class Hosts + if /cygwin|mingw|mswin32/ =~ RUBY_PLATFORM + require 'win32/registry' + Win32::Registry.open(Win32::Registry::HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') do |reg| + type, data = reg.read('DataBasePath') + case type + when Win32::Registry::REG_EXPAND_SZ + path = data.gsub(/%([^%]+)%/) {ENV[$1]} + when Win32::Registry::REG_SZ + path = data + else + raise TypeError, "unexpected type #{type} (expect string)" + end + DefaultFileName = File.join(path.gsub(/\\/, '/'), 'hosts') + end + else DefaultFileName = '/etc/hosts' + end def initialize(filename = DefaultFileName) @filename = filename @@ -562,7 +579,7 @@ class Resolv @port = port @sock = UDPSocket.new @sock.connect(host, port) - @sock.fcntl(Fcntl::F_SETFD, 1) + @sock.fcntl(Fcntl::F_SETFD, 1) if Fcntl.const_defined? :F_SETFD @id = -1 @thread = Thread.new { loop { @@ -612,7 +629,7 @@ class Resolv @port = port @sock = TCPSocket.new @sock.connect(host, port) - @sock.fcntl(Fcntl::F_SETFD, 1) + @sock.fcntl(Fcntl::F_SETFD, 1) if Fcntl.const_defined? :F_SETFD @id = -1 @senders = {} @thread = Thread.new { @@ -692,6 +709,9 @@ class Resolv } } rescue Errno::ENOENT + if /cygwin|mingw|mswin32/ =~ RUBY_PLATFORM + initialize_win32 + end end @nameserver = ['0.0.0.0'] if @nameserver.empty? @@ -706,6 +726,71 @@ class Resolv @initialized = true end } + end + + def initialize_win32 + require 'win32/registry' + + Win32::Registry.open(Win32::Registry::HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters') do |reg| + begin + slist = reg.read_s('SearchList') + @search = slist.split(/,\s*/) unless slist.empty? + rescue Win32::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\d]+\./ =~ nvdom + devo = $' + end + end + end + rescue Win32::Registry::Error + end + end + + Win32::Registry.open(reg, 'Interfaces') do |reg| + reg.each_key do |iface,| + Win32::Registry.open(reg, iface) do |regif| + begin + [ 'NameServer', 'DhcpNameServer' ].each do |key| + ns = regif.read_s(key) + unless ns.empty? + ns.split(/,\s*/).each do |ns| + @nameserver << ns unless @nameserver.include? ns + end + break + end + end + rescue Win32::Registry::Error + end + + if add_search + begin + [ 'Domain', 'DhcpDomain' ].each do |key| + dom = regif.read_s(key) + unless dom.empty? + dom.split(/,\s*/).each do |dom| + @search << dom unless @search.include? dom + end + break + end + end + rescue Win32::Registry::Error + end + end + end + end + end + @search << devo if add_search and devo + end + @search = nil if @search.empty? end def single? それでは。 -- U.Nakamura