From 6af4aebc954f548298559e49719aec84e8653adc Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 12 Jul 2002 16:34:02 +0000 Subject: * lib/resolv.rb (Resolv::DNS::open, close): new. * lib/optparse.rb, lib/optparse: import. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2642 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/resolv.rb | 58 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 17 deletions(-) (limited to 'lib/resolv.rb') diff --git a/lib/resolv.rb b/lib/resolv.rb index 6316909583..14ced1217e 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -59,7 +59,12 @@ DNS stub resolver. === class methods --- Resolv::DNS.new(resolv_conf='/etc/resolv.conf') +--- Resolv::DNS.open(resolv_conf='/etc/resolv.conf') +--- Resolv::DNS.open(resolv_conf='/etc/resolv.conf') {|dns| ...} + === methods +--- Resolv::DNS#close + --- Resolv::DNS#getaddress(name) --- Resolv::DNS#getaddresses(name) --- Resolv::DNS#each_address(name) {|address| ...} @@ -173,7 +178,6 @@ DNS stub resolver. * NIS is not supported. * /etc/nsswitch.conf is not supported. * IPv6 is not supported. -* There is no method to close DNS socket. =end @@ -350,6 +354,16 @@ class Resolv DNSThreadGroup = ThreadGroup.new + def self.open(*args) + dns = new(*args) + return dns unless block_given? + begin + yield dns + ensure + dns.close + end + end + def initialize(config="/etc/resolv.conf") @mutex = Mutex.new @config = Config.new(config) @@ -372,6 +386,16 @@ class Resolv } end + def close + @mutex.synchronize { + if @initialized + @requester.close if @requester + @requester = nil + @initialized = false + end + } + end + def getaddress(name) each_address(name) {|address| return address} raise ResolvError.new("DNS result has no information for #{name}") @@ -490,6 +514,18 @@ class Resolv @senders = {} end + def close + thread, sock, @thread, @sock = @thread, @sock + begin + if thread + thread.kill + thread.join + end + ensure + sock.close if sock + end + end + def delete(arg) case arg when Sender @@ -502,8 +538,10 @@ class Resolv end class Sender - def initialize(data, queue) + def initialize(msg, data, sock, queue) + @msg = msg @data = data + @sock = sock @queue = queue end attr_reader :queue @@ -552,9 +590,7 @@ class Resolv class Sender < Requester::Sender def initialize(msg, data, sock, host, port, queue) - super(data, queue) - @msg = msg - @sock = sock + super(msg, data, sock, queue) @host = host @port = port end @@ -604,12 +640,6 @@ class Resolv end class Sender < Requester::Sender - def initialize(msg, data, sock, queue) - super(data, queue) - @msg = msg - @sock = sock - end - def send @sock.send(@msg, 0) end @@ -657,12 +687,6 @@ class Resolv end class Sender < Requester::Sender - def initialize(msg, data, sock, queue) - super(data, queue) - @msg = msg - @sock = sock - end - def send @sock.print(@msg) @sock.flush -- cgit v1.2.3