Ejemplo n.º 1
0
def onaccept_tcp(listener, method, mux, handlers):
    global _extra_fd
    try:
        sock, srcip = listener.accept()
    except socket.error as e:
        if e.args[0] in [errno.EMFILE, errno.ENFILE]:
            debug1('Rejected incoming connection: too many open files!\n')
            # free up an fd so we can eat the connection
            os.close(_extra_fd)
            try:
                sock, srcip = listener.accept()
                sock.close()
            finally:
                _extra_fd = os.open('/dev/null', os.O_RDONLY)
            return
        else:
            raise

    dstip = method.get_tcp_dstip(sock)
    debug1('Accept TCP: %s:%r -> %s:%r.\n' %
           (srcip[0], srcip[1], dstip[0], dstip[1]))
    if dstip[1] == sock.getsockname()[1] and islocal(dstip[0], sock.family):
        debug1("-- ignored: that's my address!\n")
        sock.close()
        return
    chan = mux.next_channel()
    if not chan:
        log('warning: too many open channels.  Discarded connection.\n')
        sock.close()
        return
    mux.send(chan, ssnet.CMD_TCP_CONNECT,
             b'%d,%s,%d' % (sock.family, dstip[0].encode("ASCII"), dstip[1]))
    outwrap = MuxWrapper(mux, chan)
    handlers.append(Proxy(SockWrapper(sock, sock), outwrap))
    expire_connections(time.time(), mux)
Ejemplo n.º 2
0
 def new_channel(channel, data):
     (family, dstip, dstport) = data.decode("ASCII").split(',', 2)
     family = int(family)
     # AF_INET is the same constant on Linux and BSD but AF_INET6
     # is different. As the client and server can be running on
     # different platforms we can not just set the socket family
     # to what comes in the wire.
     if family != socket.AF_INET:
         family = socket.AF_INET6
     dstport = int(dstport)
     outwrap = ssnet.connect_dst(family, dstip, dstport)
     handlers.append(Proxy(MuxWrapper(mux, channel), outwrap))
Ejemplo n.º 3
0
 def new_channel(channel, data):
     (family, dstip, dstport) = data.split(',', 2)
     family = int(family)
     dstport = int(dstport)
     outwrap = ssnet.connect_dst(family, dstip, dstport)
     handlers.append(Proxy(MuxWrapper(mux, channel), outwrap))