Skip to content

Commit 83ad87c

Browse files
committed
Merge pull request #32 from zsprackett/master
Add support for passing in sockets
2 parents 0c8bce8 + df26ff3 commit 83ad87c

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

lib/rubydns/server.rb

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,29 @@ def run(options = {})
122122

123123
# Setup server sockets
124124
interfaces.each do |spec|
125-
@logger.info "Listening on #{spec.join(':')}"
126-
if spec[0] == :udp
127-
EventMachine.open_datagram_socket(spec[1], spec[2], UDPHandler, self)
128-
elsif spec[0] == :tcp
129-
EventMachine.start_server(spec[1], spec[2], TCPHandler, self)
125+
if spec.is_a?(BasicSocket)
126+
spec.do_not_reverse_lookup
127+
optval = spec.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE)
128+
protocol = optval.unpack("i")[0]
129+
ip = spec.local_address.ip_address
130+
port = spec.local_address.ip_port
131+
case protocol
132+
when Socket::SOCK_DGRAM
133+
@logger.info "Attaching to pre-existing UDP socket #{ip}:#{port}"
134+
EventMachine.attach(spec, UDPHandler, self)
135+
when Socket::SOCK_STREAM
136+
@logger.info "Attaching to pre-existing TCP socket #{ip}:#{port}"
137+
EventMachine.attach(spec, TCPHandler, self)
138+
else
139+
@logger.error "Ignoring unknown socket protocol: #{protocol}"
140+
end
141+
else
142+
@logger.info "Listening on #{spec.join(':')}"
143+
if spec[0] == :udp
144+
EventMachine.open_datagram_socket(spec[1], spec[2], UDPHandler, self)
145+
elsif spec[0] == :tcp
146+
EventMachine.start_server(spec[1], spec[2], TCPHandler, self)
147+
end
130148
end
131149
end
132150

0 commit comments

Comments
 (0)