resolv 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3c2610a9201afa7c69fdadb89357cfe4c44e0bec4f52c430ef6328897ebda0a
4
- data.tar.gz: 06f9f301afe24165dd53683dd11c503a69cb367cc76f5885709552bab7444d61
3
+ metadata.gz: f0831b1c59e6ce967c8d36a7a5ddc962985c81ace17de45165dd7fb420398725
4
+ data.tar.gz: fab3f3c3175d01df8e15383cd83e0b4526e35e21da55fa373bc62419555c66f4
5
5
  SHA512:
6
- metadata.gz: 15dafa5ebe1d4ba98fb40a1bec5d700beee853090230b08fcfc0a8c4ebd6cebf2657e4618c6de664a17a1b0ae0c8fa183c27dd0739957389140a5d001fc2d92a
7
- data.tar.gz: e930fb5af7be91b0342d855486979f070aaf04c02ca054dd8a6dfb70313dcc2fe8037f52e0d9e61b31df21a7452c841e5c3f48889c85532155285ad7100948eb
6
+ metadata.gz: cd0445cd68e2cf4cab80734796084377eb151969df16b29a86865602604852c0830ce7cdb28bbaac8aa7f2ce3abb6c55d1fee8145799965aa385b5b522fdbbf6
7
+ data.tar.gz: 4ea52516c3cad7419b6234c6aac594894f7a723fa1e9dacffeb3ccc6d935811a7a27ecbf5db898a467cc4a19acf67866cbe0a17270dd30b830eb28bd6d3820a2
@@ -23,24 +23,24 @@ jobs:
23
23
 
24
24
  steps:
25
25
  - name: Harden Runner
26
- uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
26
+ uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1
27
27
  with:
28
28
  egress-policy: audit
29
29
 
30
- - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
30
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
31
31
 
32
32
  - name: Set up Ruby
33
- uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 # v1.190.0
33
+ uses: ruby/setup-ruby@a4effe49ee8ee5b8b5091268c473a4628afb5651 # v1.245.0
34
34
  with:
35
35
  bundler-cache: true
36
36
  ruby-version: ruby
37
37
 
38
38
  - name: Publish to RubyGems
39
- uses: rubygems/release-gem@612653d273a73bdae1df8453e090060bb4db5f31 # v1
39
+ uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1
40
40
 
41
41
  - name: Create GitHub release
42
42
  run: |
43
43
  tag_name="$(git describe --tags --abbrev=0)"
44
44
  gh release create "${tag_name}" --verify-tag --generate-notes
45
45
  env:
46
- GITHUB_TOKEN: ${{ secrets.MATZBOT_GITHUB_WORKFLOW_TOKEN }}
46
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -6,7 +6,7 @@ jobs:
6
6
  ruby-versions:
7
7
  uses: ruby/actions/.github/workflows/ruby_versions.yml@master
8
8
  with:
9
- engine: cruby
9
+ engine: cruby-jruby
10
10
  min_version: 2.5
11
11
 
12
12
  build:
@@ -32,3 +32,21 @@ jobs:
32
32
  bundler-cache: true
33
33
  - name: Run test
34
34
  run: bundle exec rake test
35
+ timeout-minutes: 3
36
+ continue-on-error: ${{ startsWith(matrix.ruby, 'jruby') }}
37
+ - name: Build package
38
+ id: build
39
+ shell: bash
40
+ run: |
41
+ if ruby -e 'exit RUBY_VERSION>="3.0."'; then
42
+ bundle exec rake build
43
+ set pkg/*.gem
44
+ echo pkg=$1 >> $GITHUB_OUTPUT
45
+ fi
46
+ - name: Install gem
47
+ run: |
48
+ gem install ${{ steps.build.outputs.pkg }}
49
+ ruby -rresolv -e 'puts $LOADED_FEATURES.grep(/resolv/)'
50
+ ruby -rresolv -e 'puts Resolv::VERSION'
51
+ if: ${{ steps.build.outputs.pkg }}
52
+ continue-on-error: ${{ startsWith(matrix.ruby, 'jruby') }}
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ /.build/
1
2
  /.bundle/
2
3
  /.yardoc
3
4
  /_yardoc/
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gemspec
5
5
  gem "rake"
6
6
  gem "test-unit"
7
7
  gem "test-unit-ruby-core"
8
+ gem "ruby-core-tasks", github: "ruby/ruby-core-tasks"
data/README.md CHANGED
@@ -14,15 +14,18 @@ gem 'resolv'
14
14
 
15
15
  And then execute:
16
16
 
17
- $ bundle install
17
+ ```bash
18
+ bundle install
19
+ ```
18
20
 
19
21
  Or install it yourself as:
20
22
 
21
- $ gem install resolv
23
+ ```bash
24
+ gem install resolv
25
+ ```
22
26
 
23
27
  ## Usage
24
28
 
25
-
26
29
  ```ruby
27
30
  p Resolv.getaddress "www.ruby-lang.org"
28
31
  p Resolv.getname "210.251.121.214"
@@ -44,4 +47,3 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
44
47
  ## Contributing
45
48
 
46
49
  Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/resolv.
47
-
data/Rakefile CHANGED
@@ -1,7 +1,15 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
+ if RUBY_ENGINE == "ruby"
5
+ require "ruby-core/extensiontask"
6
+ helper = Bundler::GemHelper.instance
7
+ extask = RubyCore::ExtensionTask.new(helper.gemspec)
8
+ task :test => :compile
9
+ end
10
+
4
11
  Rake::TestTask.new(:test) do |t|
12
+ t.libs.unshift(*extask.libs) if extask
5
13
  t.libs << "test/lib"
6
14
  t.ruby_opts << "-rhelper"
7
15
  t.test_files = FileList["test/**/test_*.rb"]
@@ -1,5 +1,5 @@
1
1
  require 'mkmf'
2
- if have_library('iphlpapi', 'GetNetworkParams')
2
+ if RUBY_ENGINE == "ruby" and have_library('iphlpapi', 'GetNetworkParams')
3
3
  create_makefile('win32/resolv')
4
4
  else
5
5
  File.write('Makefile', "all clean install:\n\t@echo Done: $(@)\n")
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: false
2
+ =begin
3
+ = Win32 DNS and DHCP I/F
4
+
5
+ =end
6
+
7
+ module Win32
8
+ module Resolv
9
+ def self.get_hosts_path
10
+ path = get_hosts_dir
11
+ path = File.expand_path('hosts', path)
12
+ File.exist?(path) ? path : nil
13
+ end
14
+
15
+ def self.get_resolv_info
16
+ search, nameserver = get_info
17
+ if search.empty?
18
+ search = nil
19
+ else
20
+ search.delete("")
21
+ search.uniq!
22
+ end
23
+ if nameserver.empty?
24
+ nameserver = nil
25
+ else
26
+ nameserver.delete("")
27
+ nameserver.delete("0.0.0.0")
28
+ nameserver.uniq!
29
+ end
30
+ [ search, nameserver ]
31
+ end
32
+ end
33
+ end
34
+
35
+ begin
36
+ require 'win32/resolv.so'
37
+ rescue LoadError
38
+ end
39
+
40
+ module Win32
41
+ #====================================================================
42
+ # Windows NT
43
+ #====================================================================
44
+ module Resolv
45
+ begin
46
+ require 'win32/registry'
47
+ module SZ
48
+ refine Registry do
49
+ # ad hoc workaround for broken registry
50
+ def read_s(key)
51
+ type, str = read(key)
52
+ unless type == Registry::REG_SZ
53
+ warn "Broken registry, #{name}\\#{key} was #{Registry.type2name(type)}, ignored"
54
+ return String.new
55
+ end
56
+ str
57
+ end
58
+ end
59
+ end
60
+ using SZ
61
+ rescue LoadError
62
+ require "open3"
63
+ end
64
+
65
+ TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'
66
+
67
+ class << self
68
+ private
69
+ def get_hosts_dir
70
+ get_item_property(TCPIP_NT, 'DataBasePath', expand: true)
71
+ end
72
+
73
+ def get_info
74
+ search = nil
75
+ nameserver = get_dns_server_list
76
+
77
+ slist = get_item_property(TCPIP_NT, 'SearchList')
78
+ search = slist.split(/,\s*/) unless slist.empty?
79
+
80
+ if add_search = search.nil?
81
+ search = []
82
+ nvdom = get_item_property(TCPIP_NT, 'NV Domain')
83
+
84
+ unless nvdom.empty?
85
+ @search = [ nvdom ]
86
+ udmnd = get_item_property(TCPIP_NT, 'UseDomainNameDevolution').to_i
87
+ if udmnd != 0
88
+ if /^\w+\./ =~ nvdom
89
+ devo = $'
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ ifs = if defined?(Win32::Registry)
96
+ Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT + '\Interfaces') do |reg|
97
+ reg.keys
98
+ rescue Registry::Error
99
+ []
100
+ end
101
+ else
102
+ cmd = "Get-ChildItem 'HKLM:\\#{TCPIP_NT}\\Interfaces' | ForEach-Object { $_.PSChildName }"
103
+ output, _ = Open3.capture2('powershell', '-Command', cmd)
104
+ output.split(/\n+/)
105
+ end
106
+
107
+ ifs.each do |iface|
108
+ next unless ns = %w[NameServer DhcpNameServer].find do |key|
109
+ ns = get_item_property(TCPIP_NT + '\Interfaces' + "\\#{iface}", key)
110
+ break ns.split(/[,\s]\s*/) unless ns.empty?
111
+ end
112
+
113
+ next if (nameserver & ns).empty?
114
+
115
+ if add_search
116
+ [ 'Domain', 'DhcpDomain' ].each do |key|
117
+ dom = get_item_property(TCPIP_NT + '\Interfaces' + "\\#{iface}", key)
118
+ unless dom.empty?
119
+ search.concat(dom.split(/,\s*/))
120
+ break
121
+ end
122
+ end
123
+ end
124
+ end
125
+ search << devo if add_search and devo
126
+ [ search.uniq, nameserver.uniq ]
127
+ end
128
+
129
+ def get_item_property(path, name, expand: false)
130
+ if defined?(Win32::Registry)
131
+ Registry::HKEY_LOCAL_MACHINE.open(path) do |reg|
132
+ expand ? reg.read_s_expand(name) : reg.read_s(name)
133
+ rescue Registry::Error
134
+ ""
135
+ end
136
+ else
137
+ cmd = "Get-ItemProperty -Path 'HKLM:\\#{path}' -Name '#{name}' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty '#{name}'"
138
+ output, _ = Open3.capture2('powershell', '-Command', cmd)
139
+ output.strip
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -13,6 +13,8 @@ w32error_make_error(DWORD e)
13
13
  return rb_class_new_instance(1, &code, rb_path2class("Win32::Resolv::Error"));
14
14
  }
15
15
 
16
+ NORETURN(static void w32error_raise(DWORD e));
17
+
16
18
  static void
17
19
  w32error_raise(DWORD e)
18
20
  {
data/lib/resolv.rb CHANGED
@@ -3,11 +3,7 @@
3
3
  require 'socket'
4
4
  require 'timeout'
5
5
  require 'io/wait'
6
-
7
- begin
8
- require 'securerandom'
9
- rescue LoadError
10
- end
6
+ require 'securerandom'
11
7
 
12
8
  # Resolv is a thread-aware DNS resolver library written in Ruby. Resolv can
13
9
  # handle multiple DNS requests concurrently without blocking the entire Ruby
@@ -37,7 +33,7 @@ end
37
33
 
38
34
  class Resolv
39
35
 
40
- VERSION = "0.5.0"
36
+ VERSION = "0.6.1"
41
37
 
42
38
  ##
43
39
  # Looks up the first IP address for +name+.
@@ -83,9 +79,22 @@ class Resolv
83
79
 
84
80
  ##
85
81
  # Creates a new Resolv using +resolvers+.
82
+ #
83
+ # If +resolvers+ is not given, a hash, or +nil+, uses a Hosts resolver and
84
+ # and a DNS resolver. If +resolvers+ is a hash, uses the hash as
85
+ # configuration for the DNS resolver.
86
86
 
87
- def initialize(resolvers=nil, use_ipv6: nil)
88
- @resolvers = resolvers || [Hosts.new, DNS.new(DNS::Config.default_config_hash.merge(use_ipv6: use_ipv6))]
87
+ def initialize(resolvers=(arg_not_set = true; nil), use_ipv6: (keyword_not_set = true; nil))
88
+ if !keyword_not_set && !arg_not_set
89
+ warn "Support for separate use_ipv6 keyword is deprecated, as it is ignored if an argument is provided. Do not provide a positional argument if using the use_ipv6 keyword argument.", uplevel: 1
90
+ end
91
+
92
+ @resolvers = case resolvers
93
+ when Hash, nil
94
+ [Hosts.new, DNS.new(DNS::Config.default_config_hash.merge(resolvers || {}))]
95
+ else
96
+ resolvers
97
+ end
89
98
  end
90
99
 
91
100
  ##
@@ -164,13 +173,16 @@ class Resolv
164
173
 
165
174
  class ResolvTimeout < Timeout::Error; end
166
175
 
176
+ WINDOWS = /mswin|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM || ::RbConfig::CONFIG['host_os'] =~ /mswin/
177
+ private_constant :WINDOWS
178
+
167
179
  ##
168
180
  # Resolv::Hosts is a hostname resolver that uses the system hosts file.
169
181
 
170
182
  class Hosts
171
- if /mswin|mingw|cygwin/ =~ RUBY_PLATFORM and
183
+ if WINDOWS
172
184
  begin
173
- require 'win32/resolv'
185
+ require 'win32/resolv' unless defined?(Win32::Resolv)
174
186
  DefaultFileName = Win32::Resolv.get_hosts_path || IO::NULL
175
187
  rescue LoadError
176
188
  end
@@ -615,16 +627,10 @@ class Resolv
615
627
  }
616
628
  end
617
629
 
618
- if defined? SecureRandom
619
- def self.random(arg) # :nodoc:
620
- begin
621
- SecureRandom.random_number(arg)
622
- rescue NotImplementedError
623
- rand(arg)
624
- end
625
- end
626
- else
627
- def self.random(arg) # :nodoc:
630
+ def self.random(arg) # :nodoc:
631
+ begin
632
+ SecureRandom.random_number(arg)
633
+ rescue NotImplementedError
628
634
  rand(arg)
629
635
  end
630
636
  end
@@ -656,8 +662,20 @@ class Resolv
656
662
  }
657
663
  end
658
664
 
659
- def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
660
- begin
665
+ case RUBY_PLATFORM
666
+ when *[
667
+ # https://www.rfc-editor.org/rfc/rfc6056.txt
668
+ # Appendix A. Survey of the Algorithms in Use by Some Popular Implementations
669
+ /freebsd/, /linux/, /netbsd/, /openbsd/, /solaris/,
670
+ /darwin/, # the same as FreeBSD
671
+ ] then
672
+ def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
673
+ udpsock.bind(bind_host, 0)
674
+ end
675
+ else
676
+ # Sequential port assignment
677
+ def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
678
+ # Ephemeral port number range recommended by RFC 6056
661
679
  port = random(1024..65535)
662
680
  udpsock.bind(bind_host, port)
663
681
  rescue Errno::EADDRINUSE, # POSIX
@@ -980,13 +998,13 @@ class Resolv
980
998
  next unless keyword
981
999
  case keyword
982
1000
  when 'nameserver'
983
- nameserver.concat(args)
1001
+ nameserver.concat(args.each(&:freeze))
984
1002
  when 'domain'
985
1003
  next if args.empty?
986
- search = [args[0]]
1004
+ search = [args[0].freeze]
987
1005
  when 'search'
988
1006
  next if args.empty?
989
- search = args
1007
+ search = args.each(&:freeze)
990
1008
  when 'options'
991
1009
  args.each {|arg|
992
1010
  case arg
@@ -997,22 +1015,22 @@ class Resolv
997
1015
  end
998
1016
  }
999
1017
  }
1000
- return { :nameserver => nameserver, :search => search, :ndots => ndots }
1018
+ return { :nameserver => nameserver.freeze, :search => search.freeze, :ndots => ndots.freeze }.freeze
1001
1019
  end
1002
1020
 
1003
1021
  def Config.default_config_hash(filename="/etc/resolv.conf")
1004
1022
  if File.exist? filename
1005
- config_hash = Config.parse_resolv_conf(filename)
1023
+ Config.parse_resolv_conf(filename)
1024
+ elsif WINDOWS
1025
+ require 'win32/resolv' unless defined?(Win32::Resolv)
1026
+ search, nameserver = Win32::Resolv.get_resolv_info
1027
+ config_hash = {}
1028
+ config_hash[:nameserver] = nameserver if nameserver
1029
+ config_hash[:search] = [search].flatten if search
1030
+ config_hash
1006
1031
  else
1007
- if /mswin|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM
1008
- require 'win32/resolv'
1009
- search, nameserver = Win32::Resolv.get_resolv_info
1010
- config_hash = {}
1011
- config_hash[:nameserver] = nameserver if nameserver
1012
- config_hash[:search] = [search].flatten if search
1013
- end
1032
+ {}
1014
1033
  end
1015
- config_hash || {}
1016
1034
  end
1017
1035
 
1018
1036
  def lazy_initialize
@@ -2107,7 +2125,14 @@ class Resolv
2107
2125
 
2108
2126
  attr_reader :ttl
2109
2127
 
2110
- ClassHash = {} # :nodoc:
2128
+ ClassHash = Module.new do
2129
+ module_function
2130
+
2131
+ def []=(type_class_value, klass)
2132
+ type_value, class_value = type_class_value
2133
+ Resource.const_set(:"Type#{type_value}_Class#{class_value}", klass)
2134
+ end
2135
+ end
2111
2136
 
2112
2137
  def encode_rdata(msg) # :nodoc:
2113
2138
  raise NotImplementedError.new
@@ -2145,7 +2170,9 @@ class Resolv
2145
2170
  end
2146
2171
 
2147
2172
  def self.get_class(type_value, class_value) # :nodoc:
2148
- return ClassHash[[type_value, class_value]] ||
2173
+ cache = :"Type#{type_value}_Class#{class_value}"
2174
+
2175
+ return (const_defined?(cache) && const_get(cache)) ||
2149
2176
  Generic.create(type_value, class_value)
2150
2177
  end
2151
2178
 
@@ -2574,7 +2601,7 @@ class Resolv
2574
2601
  end
2575
2602
 
2576
2603
  ##
2577
- # Flags for this proprty:
2604
+ # Flags for this property:
2578
2605
  # - Bit 0 : 0 = not critical, 1 = critical
2579
2606
 
2580
2607
  attr_reader :flags
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resolv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanaka Akira
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-11-11 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies: []
13
12
  description: Thread-aware DNS resolver library in Ruby.
14
13
  email:
@@ -31,7 +30,7 @@ files:
31
30
  - bin/console
32
31
  - bin/setup
33
32
  - ext/win32/resolv/extconf.rb
34
- - ext/win32/resolv/lib/win32/resolv.rb
33
+ - ext/win32/resolv/lib/resolv.rb
35
34
  - ext/win32/resolv/resolv.c
36
35
  - lib/resolv.rb
37
36
  - resolv.gemspec
@@ -42,7 +41,6 @@ licenses:
42
41
  metadata:
43
42
  homepage_uri: https://github.com/ruby/resolv
44
43
  source_code_uri: https://github.com/ruby/resolv
45
- post_install_message:
46
44
  rdoc_options: []
47
45
  require_paths:
48
46
  - lib
@@ -57,8 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
55
  - !ruby/object:Gem::Version
58
56
  version: '0'
59
57
  requirements: []
60
- rubygems_version: 3.5.11
61
- signing_key:
58
+ rubygems_version: 3.6.7
62
59
  specification_version: 4
63
60
  summary: Thread-aware DNS resolver library in Ruby.
64
61
  test_files: []
@@ -1,135 +0,0 @@
1
- # frozen_string_literal: false
2
- =begin
3
- = Win32 DNS and DHCP I/F
4
-
5
- =end
6
-
7
- require 'win32/registry'
8
-
9
- module Win32
10
- module Resolv
11
- API = Registry::API
12
- Error = Registry::Error
13
-
14
- def self.get_hosts_path
15
- path = get_hosts_dir
16
- path = File.expand_path('hosts', path)
17
- File.exist?(path) ? path : nil
18
- end
19
-
20
- def self.get_resolv_info
21
- search, nameserver = get_info
22
- if search.empty?
23
- search = nil
24
- else
25
- search.delete("")
26
- search.uniq!
27
- end
28
- if nameserver.empty?
29
- nameserver = nil
30
- else
31
- nameserver.delete("")
32
- nameserver.delete("0.0.0.0")
33
- nameserver.uniq!
34
- end
35
- [ search, nameserver ]
36
- end
37
- end
38
- end
39
-
40
- begin
41
- require 'win32/resolv.so'
42
- rescue LoadError
43
- end
44
-
45
- module Win32
46
- #====================================================================
47
- # Windows NT
48
- #====================================================================
49
- module Resolv
50
- module SZ
51
- refine Registry do
52
- # ad hoc workaround for broken registry
53
- def read_s(key)
54
- type, str = read(key)
55
- unless type == Registry::REG_SZ
56
- warn "Broken registry, #{name}\\#{key} was #{Registry.type2name(type)}, ignored"
57
- return String.new
58
- end
59
- str
60
- end
61
- end
62
- end
63
- using SZ
64
-
65
- TCPIP_NT = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'
66
-
67
- class << self
68
- private
69
- def get_hosts_dir
70
- Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
71
- reg.read_s_expand('DataBasePath')
72
- end
73
- end
74
-
75
- def get_info
76
- search = nil
77
- nameserver = get_dns_server_list
78
- Registry::HKEY_LOCAL_MACHINE.open(TCPIP_NT) do |reg|
79
- begin
80
- slist = reg.read_s('SearchList')
81
- search = slist.split(/,\s*/) unless slist.empty?
82
- rescue Registry::Error
83
- end
84
-
85
- if add_search = search.nil?
86
- search = []
87
- begin
88
- nvdom = reg.read_s('NV Domain')
89
- unless nvdom.empty?
90
- @search = [ nvdom ]
91
- if reg.read_i('UseDomainNameDevolution') != 0
92
- if /^\w+\./ =~ nvdom
93
- devo = $'
94
- end
95
- end
96
- end
97
- rescue Registry::Error
98
- end
99
- end
100
-
101
- reg.open('Interfaces') do |h|
102
- h.each_key do |iface, |
103
- h.open(iface) do |regif|
104
- next unless ns = %w[NameServer DhcpNameServer].find do |key|
105
- begin
106
- ns = regif.read_s(key)
107
- rescue Registry::Error
108
- else
109
- break ns.split(/[,\s]\s*/) unless ns.empty?
110
- end
111
- end
112
- next if (nameserver & ns).empty?
113
-
114
- if add_search
115
- begin
116
- [ 'Domain', 'DhcpDomain' ].each do |key|
117
- dom = regif.read_s(key)
118
- unless dom.empty?
119
- search.concat(dom.split(/,\s*/))
120
- break
121
- end
122
- end
123
- rescue Registry::Error
124
- end
125
- end
126
- end
127
- end
128
- end
129
- search << devo if add_search and devo
130
- end
131
- [ search.uniq, nameserver.uniq ]
132
- end
133
- end
134
- end
135
- end