summaryrefslogtreecommitdiff
path: root/jni/ruby/lib/resolv-replace.rb
diff options
context:
space:
mode:
authorJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-16 18:49:26 +0900
committerJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-30 00:39:06 +0900
commitfcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch)
tree64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/lib/resolv-replace.rb
Fresh start
Diffstat (limited to 'jni/ruby/lib/resolv-replace.rb')
-rw-r--r--jni/ruby/lib/resolv-replace.rb74
1 files changed, 74 insertions, 0 deletions
diff --git a/jni/ruby/lib/resolv-replace.rb b/jni/ruby/lib/resolv-replace.rb
new file mode 100644
index 0000000..3e28a84
--- /dev/null
+++ b/jni/ruby/lib/resolv-replace.rb
@@ -0,0 +1,74 @@
+require 'socket'
+require 'resolv'
+
+class << IPSocket
+ # :stopdoc:
+ alias original_resolv_getaddress getaddress
+ # :startdoc:
+ def getaddress(host)
+ begin
+ return Resolv.getaddress(host).to_s
+ rescue Resolv::ResolvError
+ raise SocketError, "Hostname not known: #{host}"
+ end
+ end
+end
+
+class TCPSocket < IPSocket
+ # :stopdoc:
+ alias original_resolv_initialize initialize
+ # :startdoc:
+ def initialize(host, serv, *rest)
+ rest[0] = IPSocket.getaddress(rest[0]) if rest[0]
+ original_resolv_initialize(IPSocket.getaddress(host), serv, *rest)
+ end
+end
+
+class UDPSocket < IPSocket
+ # :stopdoc:
+ alias original_resolv_bind bind
+ # :startdoc:
+ def bind(host, port)
+ host = IPSocket.getaddress(host) if host != ""
+ original_resolv_bind(host, port)
+ end
+
+ # :stopdoc:
+ alias original_resolv_connect connect
+ # :startdoc:
+ def connect(host, port)
+ original_resolv_connect(IPSocket.getaddress(host), port)
+ end
+
+ # :stopdoc:
+ alias original_resolv_send send
+ # :startdoc:
+ def send(mesg, flags, *rest)
+ if rest.length == 2
+ host, port = rest
+ begin
+ addrs = Resolv.getaddresses(host)
+ rescue Resolv::ResolvError
+ raise SocketError, "Hostname not known: #{host}"
+ end
+ addrs[0...-1].each {|addr|
+ begin
+ return original_resolv_send(mesg, flags, addr, port)
+ rescue SystemCallError
+ end
+ }
+ original_resolv_send(mesg, flags, addrs[-1], port)
+ else
+ original_resolv_send(mesg, flags, *rest)
+ end
+ end
+end
+
+class SOCKSSocket < TCPSocket
+ # :stopdoc:
+ alias original_resolv_initialize initialize
+ # :startdoc:
+ def initialize(host, serv)
+ original_resolv_initialize(IPSocket.getaddress(host), port)
+ end
+end if defined? SOCKSSocket