@@ -122,11 +122,29 @@ def run(options = {})
122122
123123# Setup server sockets
124124interfaces . 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
130148end
131149end
132150
0 commit comments