Skip to content

Commit a8b71f6

Browse files
brianmayapenwarr
authored andcommitted
Move nested functions to top level.
1 parent 4bfcd70 commit a8b71f6

File tree

1 file changed

+62
-56
lines changed

1 file changed

+62
-56
lines changed

client.py

Lines changed: 62 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,65 @@ def done(self):
175175
raise Fatal('cleanup: %r returned %d' % (self.argv, rv))
176176

177177

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+
178237
def _main(listener, fw, ssh_cmd, remotename, python, latency_control,
179238
dnslistener, seed_hosts, auto_nets,
180239
syslog, daemon):
@@ -255,63 +314,10 @@ def onhostlist(hostlist):
255314
fw.sethostip(name, ip)
256315
mux.got_host_list = onhostlist
257316

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+
313319
if dnslistener:
314-
handlers.append(Handler([dnslistener], lambda: ondns(dnslistener)))
320+
handlers.append(Handler([dnslistener], lambda: ondns(dnslistener, mux, handlers)))
315321

316322
if seed_hosts != None:
317323
debug1('seed_hosts: %r\n' % seed_hosts)

0 commit comments

Comments
 (0)