@@ -175,6 +175,65 @@ def done(self):
175
175
raise Fatal ('cleanup: %r returned %d' % (self .argv , rv ))
176
176
177
177
178
+ def onaccept (listener , mux , handlers ):
179
+ global _extra_fd
180
+ try :
181
+ sock ,srcip = listener .accept ()
182
+ except socket .error , e :
183
+ if e .args [0 ] in [errno .EMFILE , errno .ENFILE ]:
184
+ debug1 ('Rejected incoming connection: too many open files!\n ' )
185
+ # free up an fd so we can eat the connection
186
+ os .close (_extra_fd )
187
+ try :
188
+ sock ,srcip = listener .accept ()
189
+ sock .close ()
190
+ finally :
191
+ _extra_fd = os .open ('/dev/null' , os .O_RDONLY )
192
+ return
193
+ else :
194
+ raise
195
+ dstip = original_dst (sock )
196
+ debug1 ('Accept: %s:%r -> %s:%r.\n ' % (srcip [0 ],srcip [1 ],
197
+ dstip [0 ],dstip [1 ]))
198
+ if dstip [1 ] == listener .getsockname ()[1 ] and islocal (dstip [0 ]):
199
+ debug1 ("-- ignored: that's my address!\n " )
200
+ sock .close ()
201
+ return
202
+ chan = mux .next_channel ()
203
+ if not chan :
204
+ log ('warning: too many open channels. Discarded connection.\n ' )
205
+ sock .close ()
206
+ return
207
+ mux .send (chan , ssnet .CMD_CONNECT , '%s,%s' % dstip )
208
+ outwrap = MuxWrapper (mux , chan )
209
+ handlers .append (Proxy (SockWrapper (sock , sock ), outwrap ))
210
+
211
+
212
+ dnsreqs = {}
213
+ def dns_done (chan , data ):
214
+ peer ,sock ,timeout = dnsreqs .get (chan ) or (None ,None ,None )
215
+ debug3 ('dns_done: channel=%r peer=%r\n ' % (chan , peer ))
216
+ if peer :
217
+ del dnsreqs [chan ]
218
+ debug3 ('doing sendto %r\n ' % (peer ,))
219
+ sock .sendto (data , peer )
220
+
221
+
222
+ def ondns (listener , mux , handlers ):
223
+ pkt ,peer = listener .recvfrom (4096 )
224
+ now = time .time ()
225
+ if pkt :
226
+ debug1 ('DNS request from %r: %d bytes\n ' % (peer , len (pkt )))
227
+ chan = mux .next_channel ()
228
+ dnsreqs [chan ] = peer ,listener ,now + 30
229
+ mux .send (chan , ssnet .CMD_DNS_REQ , pkt )
230
+ mux .channels [chan ] = lambda cmd ,data : dns_done (chan ,data )
231
+ for chan ,(peer ,sock ,timeout ) in dnsreqs .items ():
232
+ if timeout < now :
233
+ del dnsreqs [chan ]
234
+ debug3 ('Remaining DNS requests: %d\n ' % len (dnsreqs ))
235
+
236
+
178
237
def _main (listener , fw , ssh_cmd , remotename , python , latency_control ,
179
238
dnslistener , seed_hosts , auto_nets ,
180
239
syslog , daemon ):
@@ -255,63 +314,10 @@ def onhostlist(hostlist):
255
314
fw .sethostip (name , ip )
256
315
mux .got_host_list = onhostlist
257
316
258
- def onaccept (listener_sock ):
259
- global _extra_fd
260
- try :
261
- sock ,srcip = listener_sock .accept ()
262
- except socket .error , e :
263
- if e .args [0 ] in [errno .EMFILE , errno .ENFILE ]:
264
- debug1 ('Rejected incoming connection: too many open files!\n ' )
265
- # free up an fd so we can eat the connection
266
- os .close (_extra_fd )
267
- try :
268
- sock ,srcip = listener_sock .accept ()
269
- sock .close ()
270
- finally :
271
- _extra_fd = os .open ('/dev/null' , os .O_RDONLY )
272
- return
273
- else :
274
- raise
275
- dstip = original_dst (sock )
276
- debug1 ('Accept: %s:%r -> %s:%r.\n ' % (srcip [0 ],srcip [1 ],
277
- dstip [0 ],dstip [1 ]))
278
- if dstip [1 ] == listener .getsockname ()[1 ] and islocal (dstip [0 ]):
279
- debug1 ("-- ignored: that's my address!\n " )
280
- sock .close ()
281
- return
282
- chan = mux .next_channel ()
283
- if not chan :
284
- log ('warning: too many open channels. Discarded connection.\n ' )
285
- sock .close ()
286
- return
287
- mux .send (chan , ssnet .CMD_CONNECT , '%s,%s' % dstip )
288
- outwrap = MuxWrapper (mux , chan )
289
- handlers .append (Proxy (SockWrapper (sock , sock ), outwrap ))
290
- handlers .append (Handler ([listener ], lambda : onaccept (listener )))
291
-
292
- dnsreqs = {}
293
- def dns_done (chan , data ):
294
- peer ,sock ,timeout = dnsreqs .get (chan ) or (None ,None ,None )
295
- debug3 ('dns_done: channel=%r peer=%r\n ' % (chan , peer ))
296
- if peer :
297
- del dnsreqs [chan ]
298
- debug3 ('doing sendto %r\n ' % (peer ,))
299
- sock .sendto (data , peer )
300
- def ondns (listener_sock ):
301
- pkt ,peer = listener_sock .recvfrom (4096 )
302
- now = time .time ()
303
- if pkt :
304
- debug1 ('DNS request from %r: %d bytes\n ' % (peer , len (pkt )))
305
- chan = mux .next_channel ()
306
- dnsreqs [chan ] = peer ,listener_sock ,now + 30
307
- mux .send (chan , ssnet .CMD_DNS_REQ , pkt )
308
- mux .channels [chan ] = lambda cmd ,data : dns_done (chan ,data )
309
- for chan ,(peer ,sock ,timeout ) in dnsreqs .items ():
310
- if timeout < now :
311
- del dnsreqs [chan ]
312
- debug3 ('Remaining DNS requests: %d\n ' % len (dnsreqs ))
317
+ handlers .append (Handler ([listener ], lambda : onaccept (listener , mux , handlers )))
318
+
313
319
if dnslistener :
314
- handlers .append (Handler ([dnslistener ], lambda : ondns (dnslistener )))
320
+ handlers .append (Handler ([dnslistener ], lambda : ondns (dnslistener , mux , handlers )))
315
321
316
322
if seed_hosts != None :
317
323
debug1 ('seed_hosts: %r\n ' % seed_hosts )
0 commit comments