Guest User

running VIM over UNIX socket

a guest
Jul 14th, 2016
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.11 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import sys, os, socket, threading, subprocess, fcntl, select
  4.  
  5. class connector_t(threading.Thread):
  6.     def __init__(self, inp, outp):
  7.         threading.Thread.__init__(self)
  8.         assert isinstance(inp, int)
  9.         assert isinstance(outp, int)
  10.         connector_t.set_non_block(inp)
  11.         connector_t.set_non_block(outp)
  12.         self.inp = inp
  13.         self.outp = outp
  14.         self.stop_flag = False
  15.         self.name = "connector %d->%d" % (inp, outp)
  16.     @staticmethod
  17.     def set_non_block(fd):
  18.         flag = fcntl.fcntl(fd, fcntl.F_GETFL)
  19.         fcntl.fcntl(fd, fcntl.F_SETFL, flag | os.O_NONBLOCK)
  20.     def stop(self):
  21.         self.stop_flag = True
  22.     def run(self):
  23.         print self.name, "started"
  24.         buff = ''
  25.         while not self.stop_flag:
  26.             select.select([self.inp], [self.outp], [], 1.0)
  27.             try:
  28.                 text = os.read(self.inp, 1024)
  29.                 if len(text) > 0:
  30.                     print self.name, "read", len(text), "bytes"
  31.                 buff += text
  32.             except: pass
  33.             try:
  34.                 res = os.write(self.outp, buff)
  35.                 if res > 0:
  36.                     buff = buff[res:]
  37.                     print self.name, "written", res, "bytes"
  38.             except: pass
  39.  
  40. def main():
  41.     s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  42.     s.connect("/tmp/blah-socket")
  43.     (master, slave) = os.openpty()
  44.     print "master:", master, "s:", s
  45.     cmd = sys.argv[1:]
  46.     main_process = subprocess.Popen(cmd, stdin=slave, stdout=slave, stderr=slave, shell=False)
  47.     print "starting cat1: copy master--->socket"
  48.     cat1 = connector_t(master, s.fileno())
  49.     cat1.start()
  50.     print "starting cat2: copy socket->master"
  51.     cat2 = connector_t(s.fileno(), master)
  52.     cat2.start()
  53.     print "waiting for main process (%s, pid=%d) to finish" % (cmd, main_process.pid)
  54.     main_process.wait()
  55.     print "main process finished"
  56.     cat1.stop()
  57.     cat2.stop()
  58.     print "waiting for cat1"
  59.     cat1.join()
  60.     print "waiting for cat2"
  61.     cat2.join()
  62.  
  63. if __name__ == "__main__":
  64.     main()
Advertisement
Add Comment
Please, Sign In to add comment