| #!/usr/bin/python -S |
| # Copyright 2012 Google Inc. All Rights Reserved. |
| # |
| """An extremely basic stty implementation for people who don't have it.""" |
| |
| __author__ = 'apenwarr@google.com (Avery Pennarun)' |
| |
| import os |
| import sys |
| import termios |
| import tty |
| |
| |
| def Usage(): |
| sys.stderr.write('usage: %s <raw|sane|[-]echo|selftest>\n' |
| ' sets the tty mode\n' % sys.argv[0]) |
| sys.exit(99) |
| |
| |
| def SetSane(tc): |
| """Returns a variant of tc with changes made by 'stty sane'.""" |
| tc = list(tc) |
| tc[0] &= ~(termios.IGNBRK | |
| termios.INLCR | |
| termios.IGNCR | |
| termios.IXOFF | |
| termios.IUCLC | |
| termios.IXANY) |
| tc[0] |= (termios.BRKINT | |
| termios.ICRNL | |
| termios.IMAXBEL | |
| termios.IXON) |
| tc[1] &= ~(termios.NLDLY | |
| termios.CRDLY | |
| termios.TABDLY | |
| termios.BSDLY | |
| termios.VTDLY | |
| termios.FFDLY | |
| termios.OLCUC | |
| termios.OCRNL | |
| termios.ONOCR | |
| termios.ONLRET | |
| termios.OFILL | |
| termios.OFDEL) |
| tc[1] |= (termios.NL0 | |
| termios.CR0 | |
| termios.TAB0 | |
| termios.BS0 | |
| termios.VT0 | |
| termios.FF0 | |
| termios.OPOST | |
| termios.ONLCR) |
| tc[2] &= ~(0) |
| tc[2] |= (termios.CREAD) |
| tc[3] &= ~(termios.ECHONL | |
| termios.NOFLSH | |
| termios.XCASE | |
| termios.TOSTOP | |
| termios.ECHOPRT) |
| tc[3] |= (termios.ICANON | |
| termios.ISIG | |
| termios.ECHO | |
| termios.ECHOE | |
| termios.ECHOK | |
| termios.ECHOCTL | |
| termios.ECHOKE) |
| return tc |
| |
| |
| def main(): |
| if len(sys.argv) != 2: |
| Usage() |
| |
| if sys.argv[1] == 'raw': |
| tty.setraw(1) |
| elif sys.argv[1] == 'sane': |
| tc = termios.tcgetattr(0) |
| tc = SetSane(tc) |
| termios.tcsetattr(0, termios.TCSADRAIN, tc) |
| elif sys.argv[1] == 'echo': |
| tc = termios.tcgetattr(0) |
| tc[3] |= termios.ECHO |
| termios.tcsetattr(0, termios.TCSADRAIN, tc) |
| elif sys.argv[1] == '-echo': |
| tc = termios.tcgetattr(0) |
| tc[3] &= ~termios.ECHO |
| termios.tcsetattr(0, termios.TCSADRAIN, tc) |
| elif sys.argv[1] == 'selftest': |
| os.system('stty sane') |
| tc_orig = termios.tcgetattr(0) |
| tty.setraw(0) |
| tc_raw = termios.tcgetattr(0) |
| tc_sane = SetSane(tc_raw) |
| termios.tcsetattr(0, termios.TCSANOW, tc_orig) |
| print 'orig: %r' % [oct(i) for i in tc_orig[:4]] |
| print 'sane: %r' % [oct(i) for i in tc_sane[:4]] |
| print 'raw: %r' % [oct(i) for i in tc_raw[:4]] |
| assert tc_orig != tc_raw |
| assert tc_raw != tc_sane |
| tc_orig[0] |= termios.IXON |
| tc_orig[3] &= 0xfff |
| tc_sane[3] &= 0xfff |
| assert tc_orig[:4] == tc_sane[:4] |
| else: |
| Usage() |
| |
| if __name__ == '__main__': |
| main() |