resolv 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d76dc1156c60da694ce1f0a96165e6d5a7e29d662ad7140b443e9aa735082f31
4
- data.tar.gz: 7b532fc449aff2e5a63cb6a31892a45da5b41b6090d454f94d3c3e5165c94271
3
+ metadata.gz: f3c2610a9201afa7c69fdadb89357cfe4c44e0bec4f52c430ef6328897ebda0a
4
+ data.tar.gz: 06f9f301afe24165dd53683dd11c503a69cb367cc76f5885709552bab7444d61
5
5
  SHA512:
6
- metadata.gz: 685ce620cc9c83f1d5827de0a374d71f98fbff7629256d2ab7ed65d66eee062a5bc081a869caba31aeb67b4c292ca6dfc53fa4d71180ce15dd82f39d6fb5992b
7
- data.tar.gz: 9897929fbfc67bc3a8133d3d9b2f99e7c9350802cf86d4cc0d8f061f397393f91308d6d1d6d35e46d497a3beb7fcf6424dc47ae92d5f7f39e572ac04b2677409
6
+ metadata.gz: 15dafa5ebe1d4ba98fb40a1bec5d700beee853090230b08fcfc0a8c4ebd6cebf2657e4618c6de664a17a1b0ae0c8fa183c27dd0739957389140a5d001fc2d92a
7
+ data.tar.gz: e930fb5af7be91b0342d855486979f070aaf04c02ca054dd8a6dfb70313dcc2fe8037f52e0d9e61b31df21a7452c841e5c3f48889c85532155285ad7100948eb
@@ -0,0 +1,7 @@
1
+ # This is a file used by GitHub to ignore the following commits on `git blame`.
2
+ #
3
+ # You can also do the same thing in your local repository with:
4
+ # $ git config --local blame.ignoreRevsFile .git-blame-ignore-revs
5
+
6
+ # Expand tabs
7
+ 9ae210665a8524554e7c868d3ec67af54b0958bb
@@ -0,0 +1,46 @@
1
+ name: Publish gem to rubygems.org
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ push:
13
+ if: github.repository == 'ruby/resolv'
14
+ runs-on: ubuntu-latest
15
+
16
+ environment:
17
+ name: rubygems.org
18
+ url: https://rubygems.org/gems/resolv
19
+
20
+ permissions:
21
+ contents: write
22
+ id-token: write
23
+
24
+ steps:
25
+ - name: Harden Runner
26
+ uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
27
+ with:
28
+ egress-policy: audit
29
+
30
+ - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
31
+
32
+ - name: Set up Ruby
33
+ uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 # v1.190.0
34
+ with:
35
+ bundler-cache: true
36
+ ruby-version: ruby
37
+
38
+ - name: Publish to RubyGems
39
+ uses: rubygems/release-gem@612653d273a73bdae1df8453e090060bb4db5f31 # v1
40
+
41
+ - name: Create GitHub release
42
+ run: |
43
+ tag_name="$(git describe --tags --abbrev=0)"
44
+ gh release create "${tag_name}" --verify-tag --generate-notes
45
+ env:
46
+ GITHUB_TOKEN: ${{ secrets.MATZBOT_GITHUB_WORKFLOW_TOKEN }}
@@ -15,7 +15,13 @@ jobs:
15
15
  strategy:
16
16
  matrix:
17
17
  ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
18
- os: [ ubuntu-latest, macos-latest ]
18
+ os: [ ubuntu-latest, macos-latest, windows-latest ]
19
+ include:
20
+ - ruby: mswin
21
+ os: windows-latest
22
+ exclude:
23
+ - ruby: 2.5
24
+ os: macos-latest
19
25
  runs-on: ${{ matrix.os }}
20
26
  steps:
21
27
  - uses: actions/checkout@v4
@@ -4,10 +4,10 @@ Redistribution and use in source and binary forms, with or without
4
4
  modification, are permitted provided that the following conditions
5
5
  are met:
6
6
  1. Redistributions of source code must retain the above copyright
7
- notice, this list of conditions and the following disclaimer.
7
+ notice, this list of conditions and the following disclaimer.
8
8
  2. Redistributions in binary form must reproduce the above copyright
9
- notice, this list of conditions and the following disclaimer in the
10
- documentation and/or other materials provided with the distribution.
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
11
 
12
12
  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
13
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
data/COPYING ADDED
@@ -0,0 +1,56 @@
1
+ Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
2
+ You can redistribute it and/or modify it under either the terms of the
3
+ 2-clause BSDL (see the file BSDL), or the conditions below:
4
+
5
+ 1. You may make and give away verbatim copies of the source form of the
6
+ software without restriction, provided that you duplicate all of the
7
+ original copyright notices and associated disclaimers.
8
+
9
+ 2. You may modify your copy of the software in any way, provided that
10
+ you do at least ONE of the following:
11
+
12
+ a. place your modifications in the Public Domain or otherwise
13
+ make them Freely Available, such as by posting said
14
+ modifications to Usenet or an equivalent medium, or by allowing
15
+ the author to include your modifications in the software.
16
+
17
+ b. use the modified software only within your corporation or
18
+ organization.
19
+
20
+ c. give non-standard binaries non-standard names, with
21
+ instructions on where to get the original software distribution.
22
+
23
+ d. make other distribution arrangements with the author.
24
+
25
+ 3. You may distribute the software in object code or binary form,
26
+ provided that you do at least ONE of the following:
27
+
28
+ a. distribute the binaries and library files of the software,
29
+ together with instructions (in the manual page or equivalent)
30
+ on where to get the original distribution.
31
+
32
+ b. accompany the distribution with the machine-readable source of
33
+ the software.
34
+
35
+ c. give non-standard binaries non-standard names, with
36
+ instructions on where to get the original software distribution.
37
+
38
+ d. make other distribution arrangements with the author.
39
+
40
+ 4. You may modify and include the part of the software into any other
41
+ software (possibly commercial). But some files in the distribution
42
+ are not written by the author, so that they are not under these terms.
43
+
44
+ For the list of those files and their copying conditions, see the
45
+ file LEGAL.
46
+
47
+ 5. The scripts and library files supplied as input to or produced as
48
+ output from the software do not automatically fall under the
49
+ copyright of the software, but belong to whomever generated them,
50
+ and may be sold commercially, and may be aggregated with this
51
+ software.
52
+
53
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
+ PURPOSE.
@@ -0,0 +1,6 @@
1
+ require 'mkmf'
2
+ if have_library('iphlpapi', 'GetNetworkParams')
3
+ create_makefile('win32/resolv')
4
+ else
5
+ File.write('Makefile', "all clean install:\n\t@echo Done: $(@)\n")
6
+ end
@@ -0,0 +1,135 @@
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
@@ -0,0 +1,65 @@
1
+ #include <ruby.h>
2
+ #include <ruby/encoding.h>
3
+ #include <windows.h>
4
+ #ifndef NTDDI_VERSION
5
+ #define NTDDI_VERSION 0x06000000
6
+ #endif
7
+ #include <iphlpapi.h>
8
+
9
+ static VALUE
10
+ w32error_make_error(DWORD e)
11
+ {
12
+ VALUE code = ULONG2NUM(e);
13
+ return rb_class_new_instance(1, &code, rb_path2class("Win32::Resolv::Error"));
14
+ }
15
+
16
+ static void
17
+ w32error_raise(DWORD e)
18
+ {
19
+ rb_exc_raise(w32error_make_error(e));
20
+ }
21
+
22
+ static VALUE
23
+ get_dns_server_list(VALUE self)
24
+ {
25
+ FIXED_INFO *fixedinfo = NULL;
26
+ ULONG buflen = 0;
27
+ DWORD ret;
28
+ VALUE buf, nameservers = Qnil;
29
+
30
+ ret = GetNetworkParams(NULL, &buflen);
31
+ if (ret != NO_ERROR && ret != ERROR_BUFFER_OVERFLOW) {
32
+ w32error_raise(ret);
33
+ }
34
+ fixedinfo = ALLOCV(buf, buflen);
35
+ ret = GetNetworkParams(fixedinfo, &buflen);
36
+ if (ret == NO_ERROR) {
37
+ const IP_ADDR_STRING *ipaddr = &fixedinfo->DnsServerList;
38
+ nameservers = rb_ary_new();
39
+ do {
40
+ const char *s = ipaddr->IpAddress.String;
41
+ if (!*s) continue;
42
+ if (strcmp(s, "0.0.0.0") == 0) continue;
43
+ rb_ary_push(nameservers, rb_str_new_cstr(s));
44
+ } while ((ipaddr = ipaddr->Next) != NULL);
45
+ }
46
+ ALLOCV_END(buf);
47
+ if (ret != NO_ERROR) w32error_raise(ret);
48
+
49
+ return nameservers;
50
+ }
51
+
52
+ void
53
+ InitVM_resolv(void)
54
+ {
55
+ VALUE mWin32 = rb_define_module("Win32");
56
+ VALUE resolv = rb_define_module_under(mWin32, "Resolv");
57
+ VALUE singl = rb_singleton_class(resolv);
58
+ rb_define_private_method(singl, "get_dns_server_list", get_dns_server_list, 0);
59
+ }
60
+
61
+ void
62
+ Init_resolv(void)
63
+ {
64
+ InitVM(resolv);
65
+ }
data/lib/resolv.rb CHANGED
@@ -37,7 +37,7 @@ end
37
37
 
38
38
  class Resolv
39
39
 
40
- VERSION = "0.3.0"
40
+ VERSION = "0.5.0"
41
41
 
42
42
  ##
43
43
  # Looks up the first IP address for +name+.
@@ -194,17 +194,10 @@ class Resolv
194
194
  File.open(@filename, 'rb') {|f|
195
195
  f.each {|line|
196
196
  line.sub!(/#.*/, '')
197
- addr, hostname, *aliases = line.split(/\s+/)
197
+ addr, *hostnames = line.split(/\s+/)
198
198
  next unless addr
199
- @addr2name[addr] = [] unless @addr2name.include? addr
200
- @addr2name[addr] << hostname
201
- @addr2name[addr].concat(aliases)
202
- @name2addr[hostname] = [] unless @name2addr.include? hostname
203
- @name2addr[hostname] << addr
204
- aliases.each {|n|
205
- @name2addr[n] = [] unless @name2addr.include? n
206
- @name2addr[n] << addr
207
- }
199
+ (@addr2name[addr] ||= []).concat(hostnames)
200
+ hostnames.each {|hostname| (@name2addr[hostname] ||= []) << addr}
208
201
  }
209
202
  }
210
203
  @name2addr.each {|name, arr| arr.reverse!}
@@ -403,13 +396,15 @@ class Resolv
403
396
  # be a Resolv::IPv4 or Resolv::IPv6
404
397
 
405
398
  def each_address(name)
406
- each_resource(name, Resource::IN::A) {|resource| yield resource.address}
407
399
  if use_ipv6?
408
400
  each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address}
409
401
  end
402
+ each_resource(name, Resource::IN::A) {|resource| yield resource.address}
410
403
  end
411
404
 
412
405
  def use_ipv6? # :nodoc:
406
+ @config.lazy_initialize unless @config.instance_variable_get(:@initialized)
407
+
413
408
  use_ipv6 = @config.use_ipv6?
414
409
  unless use_ipv6.nil?
415
410
  return use_ipv6
@@ -520,35 +515,40 @@ class Resolv
520
515
 
521
516
  def fetch_resource(name, typeclass)
522
517
  lazy_initialize
523
- begin
524
- requester = make_udp_requester
518
+ truncated = {}
519
+ requesters = {}
520
+ udp_requester = begin
521
+ make_udp_requester
525
522
  rescue Errno::EACCES
526
523
  # fall back to TCP
527
524
  end
528
525
  senders = {}
526
+
529
527
  begin
530
- @config.resolv(name) {|candidate, tout, nameserver, port|
531
- requester ||= make_tcp_requester(nameserver, port)
528
+ @config.resolv(name) do |candidate, tout, nameserver, port|
532
529
  msg = Message.new
533
530
  msg.rd = 1
534
531
  msg.add_question(candidate, typeclass)
535
- unless sender = senders[[candidate, nameserver, port]]
532
+
533
+ requester = requesters.fetch([nameserver, port]) do
534
+ if !truncated[candidate] && udp_requester
535
+ udp_requester
536
+ else
537
+ requesters[[nameserver, port]] = make_tcp_requester(nameserver, port)
538
+ end
539
+ end
540
+
541
+ unless sender = senders[[candidate, requester, nameserver, port]]
536
542
  sender = requester.sender(msg, candidate, nameserver, port)
537
543
  next if !sender
538
- senders[[candidate, nameserver, port]] = sender
544
+ senders[[candidate, requester, nameserver, port]] = sender
539
545
  end
540
546
  reply, reply_name = requester.request(sender, tout)
541
547
  case reply.rcode
542
548
  when RCode::NoError
543
549
  if reply.tc == 1 and not Requester::TCP === requester
544
- requester.close
545
550
  # Retry via TCP:
546
- requester = make_tcp_requester(nameserver, port)
547
- senders = {}
548
- # This will use TCP for all remaining candidates (assuming the
549
- # current candidate does not already respond successfully via
550
- # TCP). This makes sense because we already know the full
551
- # response will not fit in an untruncated UDP packet.
551
+ truncated[candidate] = true
552
552
  redo
553
553
  else
554
554
  yield(reply, reply_name)
@@ -559,9 +559,10 @@ class Resolv
559
559
  else
560
560
  raise Config::OtherResolvError.new(reply_name.to_s)
561
561
  end
562
- }
562
+ end
563
563
  ensure
564
- requester&.close
564
+ udp_requester&.close
565
+ requesters.each_value { |requester| requester&.close }
565
566
  end
566
567
  end
567
568
 
@@ -576,6 +577,11 @@ class Resolv
576
577
 
577
578
  def make_tcp_requester(host, port) # :nodoc:
578
579
  return Requester::TCP.new(host, port)
580
+ rescue Errno::ECONNREFUSED
581
+ # Treat a refused TCP connection attempt to a nameserver like a timeout,
582
+ # as Resolv::DNS::Config#resolv considers ResolvTimeout exceptions as a
583
+ # hint to try the next nameserver:
584
+ raise ResolvTimeout
579
585
  end
580
586
 
581
587
  def extract_resources(msg, name, typeclass) # :nodoc:
@@ -1807,7 +1813,6 @@ class Resolv
1807
1813
  end
1808
1814
  end
1809
1815
 
1810
-
1811
1816
  ##
1812
1817
  # Base class for SvcParam. [RFC9460]
1813
1818
 
@@ -2506,7 +2511,6 @@ class Resolv
2506
2511
 
2507
2512
  attr_reader :altitude
2508
2513
 
2509
-
2510
2514
  def encode_rdata(msg) # :nodoc:
2511
2515
  msg.put_bytes(@version)
2512
2516
  msg.put_bytes(@ssize.scalar)
@@ -2544,8 +2548,70 @@ class Resolv
2544
2548
  TypeValue = 255 # :nodoc:
2545
2549
  end
2546
2550
 
2551
+ ##
2552
+ # CAA resource record defined in RFC 8659
2553
+ #
2554
+ # These records identify certificate authority allowed to issue
2555
+ # certificates for the given domain.
2556
+
2557
+ class CAA < Resource
2558
+ TypeValue = 257
2559
+
2560
+ ##
2561
+ # Creates a new CAA for +flags+, +tag+ and +value+.
2562
+
2563
+ def initialize(flags, tag, value)
2564
+ unless (0..255) === flags
2565
+ raise ArgumentError.new('flags must be an Integer between 0 and 255')
2566
+ end
2567
+ unless (1..15) === tag.bytesize
2568
+ raise ArgumentError.new('length of tag must be between 1 and 15')
2569
+ end
2570
+
2571
+ @flags = flags
2572
+ @tag = tag
2573
+ @value = value
2574
+ end
2575
+
2576
+ ##
2577
+ # Flags for this proprty:
2578
+ # - Bit 0 : 0 = not critical, 1 = critical
2579
+
2580
+ attr_reader :flags
2581
+
2582
+ ##
2583
+ # Property tag ("issue", "issuewild", "iodef"...).
2584
+
2585
+ attr_reader :tag
2586
+
2587
+ ##
2588
+ # Property value.
2589
+
2590
+ attr_reader :value
2591
+
2592
+ ##
2593
+ # Whether the critical flag is set on this property.
2594
+
2595
+ def critical?
2596
+ flags & 0x80 != 0
2597
+ end
2598
+
2599
+ def encode_rdata(msg) # :nodoc:
2600
+ msg.put_pack('C', @flags)
2601
+ msg.put_string(@tag)
2602
+ msg.put_bytes(@value)
2603
+ end
2604
+
2605
+ def self.decode_rdata(msg) # :nodoc:
2606
+ flags, = msg.get_unpack('C')
2607
+ tag = msg.get_string
2608
+ value = msg.get_bytes
2609
+ self.new flags, tag, value
2610
+ end
2611
+ end
2612
+
2547
2613
  ClassInsensitiveTypes = [ # :nodoc:
2548
- NS, CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, LOC, ANY
2614
+ NS, CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, LOC, ANY, CAA
2549
2615
  ]
2550
2616
 
2551
2617
  ##
@@ -2771,7 +2837,7 @@ class Resolv
2771
2837
  attr_reader :target
2772
2838
 
2773
2839
  ##
2774
- # The service paramters for the target host.
2840
+ # The service parameters for the target host.
2775
2841
 
2776
2842
  attr_reader :params
2777
2843
 
@@ -3384,4 +3450,3 @@ class Resolv
3384
3450
  AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/
3385
3451
 
3386
3452
  end
3387
-
data/resolv.gemspec CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.homepage = "https://github.com/ruby/resolv"
17
17
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
18
18
  spec.licenses = ["Ruby", "BSD-2-Clause"]
19
+ spec.extensions << "ext/win32/resolv/extconf.rb"
19
20
 
20
21
  spec.metadata["homepage_uri"] = spec.homepage
21
22
  spec.metadata["source_code_uri"] = spec.homepage
metadata CHANGED
@@ -1,31 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resolv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanaka Akira
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-13 00:00:00.000000000 Z
11
+ date: 2024-11-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Thread-aware DNS resolver library in Ruby.
14
14
  email:
15
15
  - akr@fsij.org
16
16
  executables: []
17
- extensions: []
17
+ extensions:
18
+ - ext/win32/resolv/extconf.rb
18
19
  extra_rdoc_files: []
19
20
  files:
21
+ - ".git-blame-ignore-revs"
20
22
  - ".github/dependabot.yml"
23
+ - ".github/workflows/push_gem.yml"
21
24
  - ".github/workflows/test.yml"
22
25
  - ".gitignore"
26
+ - BSDL
27
+ - COPYING
23
28
  - Gemfile
24
- - LICENSE.txt
25
29
  - README.md
26
30
  - Rakefile
27
31
  - bin/console
28
32
  - bin/setup
33
+ - ext/win32/resolv/extconf.rb
34
+ - ext/win32/resolv/lib/win32/resolv.rb
35
+ - ext/win32/resolv/resolv.c
29
36
  - lib/resolv.rb
30
37
  - resolv.gemspec
31
38
  homepage: https://github.com/ruby/resolv
@@ -35,7 +42,7 @@ licenses:
35
42
  metadata:
36
43
  homepage_uri: https://github.com/ruby/resolv
37
44
  source_code_uri: https://github.com/ruby/resolv
38
- post_install_message:
45
+ post_install_message:
39
46
  rdoc_options: []
40
47
  require_paths:
41
48
  - lib
@@ -50,8 +57,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
57
  - !ruby/object:Gem::Version
51
58
  version: '0'
52
59
  requirements: []
53
- rubygems_version: 3.5.0.dev
54
- signing_key:
60
+ rubygems_version: 3.5.11
61
+ signing_key:
55
62
  specification_version: 4
56
63
  summary: Thread-aware DNS resolver library in Ruby.
57
64
  test_files: []