[#15040] WeakRef and load(file, true) — Shugo Maeda <shugo@...>
前田です。
[#15043] puts array — "Akinori MUSHA" <knu@...>
puts に配列を与えたときの挙動が最新の 1.7 では変わっていて
こんにちは、なかむら(う)です。
At Wed, 7 Nov 2001 09:54:03 +0900,
[#15044] resolv.rb — Kazuhiro NISHIYAMA <zn@...>
Resolv::Hostsのデフォルトのファイル名ってWindows 9x環境だと
[#15047] can't set chomped String to environment — nobu.nakada@...
なかだです。
まつもと ゆきひろです
[#15067] rb_eval_string — OJ <oj@...7.com>
OJです。
なかだです。
OJです。
なかだです。
OJです。
わたなべです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
[#15100] Using static mark stack, GC is slow. — sheepman <sheepman@...>
こんばんは
[#15101] [bug?] pty causes segv by getting SIGINT — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#15102] Gtk::Object#flags!= — akira yamada / やまだあきら <akira@...>
[#15116] rubylib_mangle whitespace — Kazuhiro Yoshida <moriq.kazuhiro@...>
もりきゅうです。
まつもと ゆきひろです
わたなべです。
[#15132] uri.rb — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#15174] strange behavior about PTY.spawn — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#15175] ruby-mingw32 configuration — HIDAKA Takahiro <cv8t-hdk@...>
ひだかです。
わたなべです。
[#15239] gc.c (gc_mark_rest): declare work area as static — "K.Kosako" <kosako@...>
現在のGCのアルゴリズム(matz-sheepman)を少し変更しようと思って、
On Thu, 22 Nov 2001 16:21:17 +0900
sheepmanさんの<20011122202749.56b8eb49.sheepman@tcn.zaq.ne.jp>から
[#15251] Re: [ruby-ext:01999] Re: syslog module is becoming ready — "Akinori MUSHA" <knu@...>
というわけで 1.7 に syslog モジュールを入れました。
In article <86r8ql90zt.wl@archon.local.idaemons.org>,
At Mon, 26 Nov 2001 23:07:30 +0900,
あおきです。
At Wed, 28 Nov 2001 07:58:55 +0900,
あおきです。
なかだです。
ただただしです。
At Mon, 26 Nov 2001 22:30:03 +0900,
そうそう、 optparse も標準に入っていると便利だと思うのですが
まつもと ゆきひろです
In message <1007018271.960435.20342.nullmailer@ev.netlab.jp>
まつもと ゆきひろです
[#15270] ruby on NetBSD — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
In message <20011128181510.3D11.USA@osb.att.ne.jp>
こんにちは、なかむら(う)です。
In message <20011128182726.3D14.USA@osb.att.ne.jp>
なかだです。
こんにちは、なかむら(う)です。
In message <20011129183834.3790.USA@osb.att.ne.jp>
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
取り込み、ありがとうございます。
こんにちは、なかむら(う)です。
[#15292] Re: m17n ruby 特に TRON 文字コード — TOYOFUKU Chikanobu <toyofuku@...>
豊福です。
[#15298] time.rb — Tanaka Akira <akr@...17n.org>
というわけで、timex.rb 改め time.rb が rough に入ったのでご意見募集です。
In article <hvovgftkgy7.fsf@coulee.a02.aist.go.jp>,
まつもと ゆきひろです
まつもと ゆきひろです
In article <1009298477.998171.30253.nullmailer@ev.netlab.jp>,
[ruby-dev:15024] patch for resolv.rb
resolv.rb を修正してしまったのでパッチです。 -- [田中 哲][たなか あきら][Tanaka Akira] 「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)
Attachments (1)
Index: resolv.rb
===================================================================
RCS file: /src/ruby/lib/resolv.rb,v
retrieving revision 1.3
diff -u -r1.3 resolv.rb
--- resolv.rb 2001/09/08 14:17:53 1.3
+++ resolv.rb 2001/11/01 05:04:42
@@ -1,3 +1,176 @@
+=begin
+= resolv library
+resolv.rb is a resolver library written in Ruby.
+Since it is written in Ruby, it is thread-aware.
+I.e. it can resolv many hostnames concurrently.
+
+It is possible to lookup various resources of DNS using DNS module directly.
+
+== example
+ Resolv.getaddress("www.ruby-lang.org")
+ Resolv.getname("210.251.121.214").to_s
+ Resolv::DNS.new.getresources("www.ruby-lang.org", Resolv::DNS::Resource::IN::A).collect {|r| r.address}
+ Resolv::DNS.new.getresources("ruby-lang.org", Resolv::DNS::Resource::IN::MX).collect {|r| [r.exchange.to_s, r.preference]}
+
+== Resolv module
+
+=== module methods
+--- Resolv.getaddress(name)
+--- Resolv.getaddresses(name)
+--- Resolv.each_address(name) {|address| ...}
+ They lookups IP addresses of ((|name|)) which represents a hostname
+ as a string.
+
+ getaddress returns first entry of lookupped addresses.
+ getaddresses returns lookupped addresses.
+ each_address iterates over lookupped addresses.
+
+--- Resolv.getname(address)
+--- Resolv.getnames(address)
+--- Resolv.each_name(address) {|name| ...}
+ lookups hostnames of ((|address|)) which represents IP address as a string.
+
+ getname returns first entry of lookupped names.
+ getnames returns lookupped names.
+ each_names iterates over lookupped names.
+
+== Resolv::Hosts class
+hostname resolver using /etc/hosts format.
+
+=== class methods
+--- Resolv::Hosts.new(hosts='/etc/hosts')
+
+=== methods
+--- Resolv::Hosts#getaddress(name)
+--- Resolv::Hosts#getaddresses(name)
+--- Resolv::Hosts#each_address(name) {|address| ...}
+ address lookup methods.
+
+--- Resolv::Hosts#getname(address)
+--- Resolv::Hosts#getnames(address)
+--- Resolv::Hosts#each_name(address) {|name| ...}
+ hostnames lookup methods.
+
+== Resolv::DNS class
+DNS stub resolver.
+
+=== class methods
+--- Resolv::DNS.new(resolv_conf='/etc/resolv.conf')
+
+=== methods
+--- Resolv::DNS#getaddress(name)
+--- Resolv::DNS#getaddresses(name)
+--- Resolv::DNS#each_address(name) {|address| ...}
+ address lookup methods.
+
+ ((|name|)) must be a instance of Resolv::Name or String. Lookupped
+ address is represented as an instance of Resolv::IPv4 or Resolv::IPv6.
+
+--- Resolv::DNS#getname(address)
+--- Resolv::DNS#getnames(address)
+--- Resolv::DNS#each_name(address) {|name| ...}
+ hostnames lookup methods.
+
+ ((|address|)) must be a instance of Resolv::IPv4, Resolv::IPv6 or String.
+ Lookupped name is represented as an instance of Resolv::Name.
+
+--- Resolv::DNS#getresource(name, typeclass)
+--- Resolv::DNS#getresources(name, typeclass)
+--- Resolv::DNS#each_resources(name, typeclass) {|resource| ...}
+ They lookup DNS resources of ((|name|)).
+ ((|name|)) must be a instance of Resolv::Name or String.
+
+ ((|typeclass|)) should be one of follows:
+ * Resolv::DNS::Resource::IN::ANY
+ * Resolv::DNS::Resource::IN::NS
+ * Resolv::DNS::Resource::IN::CNAME
+ * Resolv::DNS::Resource::IN::SOA
+ * Resolv::DNS::Resource::IN::HINFO
+ * Resolv::DNS::Resource::IN::MINFO
+ * Resolv::DNS::Resource::IN::MX
+ * Resolv::DNS::Resource::IN::TXT
+ * Resolv::DNS::Resource::IN::ANY
+ * Resolv::DNS::Resource::IN::A
+ * Resolv::DNS::Resource::IN::WKS
+ * Resolv::DNS::Resource::IN::PTR
+ * Resolv::DNS::Resource::IN::AAAA
+
+ Lookupped resource is represented as an instance of (a subclass of)
+ Resolv::DNS::Resource.
+
+== Resolv::DNS::Resource::IN::NS class
+--- name
+== Resolv::DNS::Resource::IN::CNAME class
+--- name
+== Resolv::DNS::Resource::IN::SOA class
+--- mname
+--- rname
+--- serial
+--- refresh
+--- retry
+--- expire
+--- minimum
+== Resolv::DNS::Resource::IN::HINFO class
+--- cpu
+--- os
+== Resolv::DNS::Resource::IN::MINFO class
+--- rmailbx
+--- emailbx
+== Resolv::DNS::Resource::IN::MX class
+--- preference
+--- exchange
+== Resolv::DNS::Resource::IN::TXT class
+--- data
+== Resolv::DNS::Resource::IN::A class
+--- address
+== Resolv::DNS::Resource::IN::WKS class
+--- address
+--- protocol
+--- bitmap
+== Resolv::DNS::Resource::IN::PTR class
+--- name
+== Resolv::DNS::Resource::IN::AAAA class
+--- address
+
+== Resolv::DNS::Name class
+
+=== class methods
+--- Resolv::DNS::Name.create(name)
+
+=== methods
+--- Resolv::DNS::Name#to_s
+
+== Resolv::DNS::Resource class
+
+== Resolv::IPv4 class
+=== class methods
+--- Resolv::IPv4.create(address)
+
+=== methods
+--- Resolv::IPv4#to_s
+--- Resolv::IPv4#to_name
+
+=== constants
+--- Resolv::IPv4::Regex
+ regular expression for IPv4 address.
+
+== Resolv::IPv6 class
+=== class methods
+--- Resolv::IPv6.create(address)
+
+=== methods
+--- Resolv::IPv6#to_s
+--- Resolv::IPv6#to_name
+
+=== constants
+--- Resolv::IPv6::Regex
+ regular expression for IPv6 address.
+
+== Bugs
+NIS is not supported.
+
+=end
+
require 'socket'
require 'fcntl'
require 'timeout'
@@ -8,37 +181,78 @@
DefaultResolver.getaddress(name)
end
+ def self.getaddresses(name)
+ DefaultResolver.getaddresses(name)
+ end
+
+ def self.each_address(name, &block)
+ DefaultResolver.each_address(name, &block)
+ end
+
def self.getname(address)
DefaultResolver.getname(address)
end
+ def self.getnames(address)
+ DefaultResolver.getnames(address)
+ end
+
+ def self.each_name(address, &proc)
+ DefaultResolver.each_name(address, &proc)
+ end
+
def initialize(resolvers=[Hosts.new, DNS.new])
@resolvers = resolvers
end
def getaddress(name)
- return name if AddressRegex =~ name
- rs = @resolvers.dup
- begin
- r = rs.shift
- return r.getaddress(name)
- rescue ResolvError
- retry unless rs.empty?
- raise
- end
+ each_address(name) {|address| return address}
+ raise ResolvError.new("no address for #{name}")
+ end
+
+ def getaddresses(name)
+ ret = []
+ each_address(name) {|address| ret << address}
+ return ret
end
+ def each_address(name)
+ if AddressRegex =~ name
+ yield name
+ return
+ end
+ yielded = false
+ @resolvers.each {|r|
+ r.each_address(name) {|address|
+ yield address.to_s
+ yielded = true
+ }
+ return if yielded
+ }
+ end
+
def getname(address)
- rs = @resolvers.dup
- begin
- r = rs.shift
- return r.getname(address)
- rescue ResolvError
- retry unless rs.empty?
- raise
- end
+ each_name(address) {|name| return name}
+ raise ResolvError.new("no name for #{address}")
end
+ def getnames(address)
+ ret = []
+ each_name(address) {|name| ret << name}
+ return ret
+ end
+
+ def each_name(address)
+ yielded = false
+ @resolvers.each {|r|
+ r.each_name(address) {|name|
+ yield name.to_s
+ yielded = true
+ }
+ return if yielded
+ }
+ end
+
class ResolvError < StandardError
end
@@ -79,20 +293,38 @@
end
def getaddress(name)
+ each_address(name) {|address| return address}
+ raise ResolvError.new("#{@filename} has no name: #{name}")
+ end
+
+ def getaddresses(name)
+ ret = []
+ each_address(name) {|address| ret << address}
+ return ret
+ end
+
+ def each_address(name, &proc)
lazy_initialize
if @name2addr.include?(name)
- return @name2addr[name][0]
- else
- raise ResolvError.new("#{@filename} has no name: #{name}")
+ @name2addr[name].each(&proc)
end
end
def getname(address)
+ each_name(address) {|name| return name}
+ raise ResolvError.new("#{@filename} has no address: #{address}")
+ end
+
+ def getnames(address)
+ ret = []
+ each_name(address) {|name| ret << name}
+ return ret
+ end
+
+ def each_name(address, &proc)
lazy_initialize
if @addr2name.include?(address)
- return @addr2name[address][0]
- else
- raise ResolvError.new("#{@filename} has no address: #{address}")
+ @addr2name[address].each(&proc)
end
end
end
@@ -127,10 +359,32 @@
end
def getaddress(name)
- return getresource(name, Resource::IN::A).address
+ each_address(name) {|address| return address}
+ raise ResolvError.new("DNS result has no information for #{name}")
end
+ def getaddresses(name)
+ ret = []
+ each_address(name) {|address| ret << address}
+ return ret
+ end
+
+ def each_address(name)
+ each_resources(name, Resource::IN::A) {|resource| yield resource.address}
+ end
+
def getname(address)
+ each_name(address) {|name| return name}
+ raise ResolvError.new("DNS result has no information for #{address}")
+ end
+
+ def getnames(address)
+ ret = []
+ each_name(address) {|name| ret << name}
+ return ret
+ end
+
+ def each_name(address)
case address
when Name
ptr = address
@@ -141,10 +395,21 @@
else
raise ResolvError.new("cannot interpret as address: #{address}")
end
- return getresource(ptr, Resource::IN::PTR).name
+ each_resources(ptr, Resource::IN::PTR) {|resource| yield resource.name}
end
def getresource(name, typeclass)
+ each_resources(name, typeclass) {|resource| return resource}
+ raise ResolvError.new("DNS result has no information for #{name}")
+ end
+
+ def getresources(name, typeclass)
+ ret = []
+ each_resources(name, typeclass) {|resource| ret << resource}
+ return ret
+ end
+
+ def each_resources(name, typeclass, &proc)
lazy_initialize
q = Queue.new
senders = {}
@@ -162,7 +427,8 @@
timeout(tout) { reply, reply_name = q.pop }
case reply.rcode
when RCode::NoError
- return extract_resource(reply, reply_name, typeclass)
+ extract_resources(reply, reply_name, typeclass, &proc)
+ return
when RCode::NXDomain
raise Config::NXDomain.new(reply_name)
else
@@ -174,27 +440,35 @@
end
end
- def extract_resource(msg, name, typeclass)
+ def extract_resources(msg, name, typeclass)
+ if typeclass < Resource::ANY
+ n0 = Name.create(name)
+ msg.each_answer {|n, ttl, data|
+ yield data if n0 == n
+ }
+ end
+ yielded = false
n0 = Name.create(name)
msg.each_answer {|n, ttl, data|
if n0 == n
case data
when typeclass
- return data
+ yield data
+ yielded = true
when Resource::CNAME
n0 = data.name
end
end
}
+ return if yielded
msg.each_answer {|n, ttl, data|
if n0 == n
case data
when typeclass
- return data
+ yield data
end
end
}
- raise ResolvError.new("DNS result has no information for #{name}")
end
class Requester
@@ -551,6 +825,10 @@
return @string
end
+ def inspect
+ return "#<#{self.class} #{self.to_s}>"
+ end
+
def ==(other)
return @downcase == other.downcase
end
@@ -1101,7 +1379,7 @@
end
def self.decode_rdata(msg)
- preference = msg.get_unpack('n')
+ preference, = msg.get_unpack('n')
exchange = msg.get_name
return self.new(preference, exchange)
end
@@ -1180,7 +1458,7 @@
def self.decode_rdata(msg)
address = IPv4.new(msg.get_bytes(4))
- protocol = msg.get_unpack("n")
+ protocol, = msg.get_unpack("n")
bitmap = msg.get_bytes
return self.new(address, protocol, bitmap)
end
@@ -1239,6 +1517,10 @@
return sprintf("%d.%d.%d.%d", *@address.unpack("CCCC"))
end
+ def inspect
+ return "#<#{self.class} #{self.to_s}>"
+ end
+
def to_name
return DNS::Name.new(
@address.unpack("CCCC").reverse + ['in-addr', 'arpa'])
@@ -1326,6 +1608,10 @@
return address
end
+ def inspect
+ return "#<#{self.class} #{self.to_s}>"
+ end
+
def to_name
return DNS::Name.new(
@address.unpack("H32")[0].split(//).reverse + ['ip6', 'int'])
@@ -1345,5 +1631,5 @@
end
DefaultResolver = self.new
- AddressRegex = /(?:#{IPv4::Regex.source})|(?:#{IPv6::Regex})/
+ AddressRegex = /(?:#{IPv4::Regex.source})|(?:#{IPv6::Regex.source})/
end