diff options
author | John Klug <john.klug@multitech.com> | 2018-07-31 17:48:08 -0500 |
---|---|---|
committer | John Klug <john.klug@multitech.com> | 2018-07-31 17:48:08 -0500 |
commit | b5dd8c128624cb77576d692b68e24691d4d9a96d (patch) | |
tree | 4a0cc0a718fa98582fd70719a83b826c2d990cf5 /scripts/oepydevshell-internal.py | |
parent | e08c220730d5da161a746d811268eb1550beb856 (diff) | |
download | mlinux-b5dd8c128624cb77576d692b68e24691d4d9a96d.tar.gz mlinux-b5dd8c128624cb77576d692b68e24691d4d9a96d.tar.bz2 mlinux-b5dd8c128624cb77576d692b68e24691d4d9a96d.zip |
mLinux 4
Diffstat (limited to 'scripts/oepydevshell-internal.py')
-rwxr-xr-x | scripts/oepydevshell-internal.py | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/scripts/oepydevshell-internal.py b/scripts/oepydevshell-internal.py new file mode 100755 index 0000000..f7b2e4e --- /dev/null +++ b/scripts/oepydevshell-internal.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +import os +import sys +import time +import select +import fcntl +import termios +import readline +import signal + +def nonblockingfd(fd): + fcntl.fcntl(fd, fcntl.F_SETFL, fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK) + +def echonocbreak(fd): + old = termios.tcgetattr(fd) + old[3] = old[3] | termios.ECHO | termios.ICANON + termios.tcsetattr(fd, termios.TCSADRAIN, old) + +def cbreaknoecho(fd): + old = termios.tcgetattr(fd) + old[3] = old[3] &~ termios.ECHO &~ termios.ICANON + termios.tcsetattr(fd, termios.TCSADRAIN, old) + +if len(sys.argv) != 3: + print("Incorrect parameters") + sys.exit(1) + +pty = open(sys.argv[1], "w+b", 0) +parent = int(sys.argv[2]) + +# Don't buffer output by line endings +sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) +sys.stdin = os.fdopen(sys.stdin.fileno(), 'r', 0) +nonblockingfd(pty) +nonblockingfd(sys.stdin) + + +histfile = os.path.expanduser("~/.oedevpyshell-history") +readline.parse_and_bind("tab: complete") +try: + readline.read_history_file(histfile) +except IOError: + pass + +try: + + i = "" + o = "" + # Need cbreak/noecho whilst in select so we trigger on any keypress + cbreaknoecho(sys.stdin.fileno()) + # Send our PID to the other end so they can kill us. + pty.write(str(os.getpid()) + "\n") + while True: + try: + writers = [] + if i: + writers.append(sys.stdout) + (ready, _, _) = select.select([pty, sys.stdin], writers , [], 0) + try: + if pty in ready: + i = i + pty.read() + if i: + # Write a page at a time to avoid overflowing output + # d.keys() is a good way to do that + sys.stdout.write(i[:4096]) + i = i[4096:] + if sys.stdin in ready: + echonocbreak(sys.stdin.fileno()) + o = raw_input() + cbreaknoecho(sys.stdin.fileno()) + pty.write(o + "\n") + except (IOError, OSError) as e: + if e.errno == 11: + continue + if e.errno == 5: + sys.exit(0) + raise + except EOFError: + sys.exit(0) + except KeyboardInterrupt: + os.kill(parent, signal.SIGINT) + +except SystemExit: + pass +except Exception as e: + import traceback + print("Exception in oepydehshell-internal: " + str(e)) + traceback.print_exc() + time.sleep(5) +finally: + readline.write_history_file(histfile) |