blob: 80c106f71014c6f87b489b21ff570412afb83e7e [file] [log] [blame]
#!/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()