def listener_main(args):
"""
Totally insecure TCP listener for rpki-rtr protocol. We only
implement this because it's all that the routers currently support.
In theory, we will all be running TCP-AO in the future, at which
point this listener will go away or become a TCP-AO listener.
"""
# Perhaps we should daemonize? Deal with that later.
# server_main() handles args.rpki_rtr_dir.
listener = None
try:
listener = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
listener.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
except: # pylint: disable=W0702
if listener is not None:
listener.close()
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except AttributeError:
pass
listener.bind(("", args.port))
listener.listen(5)
logging.debug("[Listening on port %s]", args.port)
while True:
try:
s, ai = listener.accept()
except KeyboardInterrupt:
sys.exit(0)
logging.debug("[Received connection from %r]", ai)
pid = os.fork()
if pid == 0:
os.dup2(s.fileno(), 0) # pylint: disable=E1103
os.dup2(s.fileno(), 1) # pylint: disable=E1103
s.close()
#os.closerange(3, os.sysconf("SC_OPEN_MAX"))
server_main(args)
sys.exit()
else:
logging.debug("[Spawned server %d]", pid)
while True:
try:
pid, status = os.waitpid(0, os.WNOHANG) # pylint: disable=W0612
if pid:
logging.debug("[Server %s exited]", pid)
continue
except: # pylint: disable=W0702
pass
break
评论列表
文章目录