| #!/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 optparse |
| import os |
| import pprint |
| import sys |
| import termios |
| import tty |
| |
| |
| def Usage(): |
| sys.stderr.write('usage: %s [raw|sane|[no]echo|selftest|<baud>|status>\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 |
| |
| |
| # lifted from /usr/include/asm-generic/termbits.h: |
| baud_map = { |
| '1200': 0000011, |
| '2400': 0000013, |
| '4800': 0000014, |
| '9600': 0000015, |
| '19200': 0000016, |
| '38400': 0000017, |
| '57600': 0010001, |
| '115200': 0010002, |
| } |
| |
| |
| def main(): |
| parser = optparse.OptionParser() |
| parser.add_option("-F" , "--file", dest="DEVICE") |
| (options, args) = parser.parse_args() |
| |
| if len(args) != 1: |
| Usage() |
| |
| fd = 0 |
| if options.DEVICE: |
| fd = os.open(options.DEVICE, os.O_RDWR) |
| |
| if args[0] == 'raw': |
| tty.setraw(0) |
| elif args[0] == 'sane': |
| tc = termios.tcgetattr(fd) |
| tc = SetSane(tc) |
| termios.tcsetattr(fd, termios.TCSADRAIN, tc) |
| elif args[0] == 'echo': |
| tc = termios.tcgetattr(fd) |
| tc[3] |= termios.ECHO |
| termios.tcsetattr(fd, termios.TCSADRAIN, tc) |
| elif args[0] == 'noecho': |
| tc = termios.tcgetattr(fd) |
| tc[3] &= ~termios.ECHO |
| termios.tcsetattr(fd, termios.TCSADRAIN, tc) |
| elif args[0] == 'selftest': |
| os.system('stty sane') |
| tc_orig = termios.tcgetattr(fd) |
| tty.setraw(fd) |
| tc_raw = termios.tcgetattr(fd) |
| tc_sane = SetSane(tc_raw) |
| termios.tcsetattr(fd, 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] |
| elif baud_map.get(args[0]): |
| tc = termios.tcgetattr(fd) |
| tc[4] = tc[5] = baud_map[args[0]] |
| termios.tcsetattr(fd, termios.TCSADRAIN, tc) |
| elif args[0] == 'status': |
| tc = termios.tcgetattr(fd) |
| pprint.pprint(tc) |
| else: |
| Usage() |
| |
| if __name__ == '__main__': |
| main() |