Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- import sys, os, socket, threading, subprocess, fcntl, select
- class connector_t(threading.Thread):
- def __init__(self, inp, outp):
- threading.Thread.__init__(self)
- assert isinstance(inp, int)
- assert isinstance(outp, int)
- connector_t.set_non_block(inp)
- connector_t.set_non_block(outp)
- self.inp = inp
- self.outp = outp
- self.stop_flag = False
- self.name = "connector %d->%d" % (inp, outp)
- @staticmethod
- def set_non_block(fd):
- flag = fcntl.fcntl(fd, fcntl.F_GETFL)
- fcntl.fcntl(fd, fcntl.F_SETFL, flag | os.O_NONBLOCK)
- def stop(self):
- self.stop_flag = True
- def run(self):
- print self.name, "started"
- buff = ''
- while not self.stop_flag:
- select.select([self.inp], [self.outp], [], 1.0)
- try:
- text = os.read(self.inp, 1024)
- if len(text) > 0:
- print self.name, "read", len(text), "bytes"
- buff += text
- except: pass
- try:
- res = os.write(self.outp, buff)
- if res > 0:
- buff = buff[res:]
- print self.name, "written", res, "bytes"
- except: pass
- def main():
- s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- s.connect("/tmp/blah-socket")
- (master, slave) = os.openpty()
- print "master:", master, "s:", s
- cmd = sys.argv[1:]
- main_process = subprocess.Popen(cmd, stdin=slave, stdout=slave, stderr=slave, shell=False)
- print "starting cat1: copy master--->socket"
- cat1 = connector_t(master, s.fileno())
- cat1.start()
- print "starting cat2: copy socket->master"
- cat2 = connector_t(s.fileno(), master)
- cat2.start()
- print "waiting for main process (%s, pid=%d) to finish" % (cmd, main_process.pid)
- main_process.wait()
- print "main process finished"
- cat1.stop()
- cat2.stop()
- print "waiting for cat1"
- cat1.join()
- print "waiting for cat2"
- cat2.join()
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment