diff options
-rw-r--r-- | loginutils/getty.c | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/loginutils/getty.c b/loginutils/getty.c index 4e194c45f..2d2184a76 100644 --- a/loginutils/getty.c +++ b/loginutils/getty.c @@ -264,10 +264,17 @@ static void termios_init(int speed) if (option_mask32 & F_RTSCTS) G.termios.c_cflag |= CRTSCTS; /* flow control using RTS/CTS pins */ #endif + /* Other bits in c_cflag: + * CSTOPB 2 stop bits (1 otherwise) + * PARENB Enable parity bit + * PARODD Use odd parity (else even) + * LOBLK Block job control output (??) + */ G.termios.c_iflag = 0; G.termios.c_lflag = 0; /* non-raw output; add CR to each NL */ G.termios.c_oflag = OPOST | ONLCR; + G.termios.c_cc[VMIN] = 1; /* block reads if < 1 char is available */ G.termios.c_cc[VTIME] = 0; /* no timeout (reads block forever) */ #ifdef __linux__ @@ -281,18 +288,55 @@ static void termios_init(int speed) static void termios_final(void) { - /* software flow control on output; and on input */ + /* software flow control on output (stop sending if XOFF is recvd); + * and on input (send XOFF when buffer is full) + */ G.termios.c_iflag |= IXON | IXOFF; if (G.eol == '\r') { G.termios.c_iflag |= ICRNL; /* map CR on input to NL */ } - /* non-raw input; enable SIGINT/QUIT/etc sigs; echo; - * echo erase character as BS-space-BS; - * echo NL on kill char; - * erase entire line via BS-space-BS on kill char */ + /* Other bits in c_iflag: + * IXANY Any recvd char enables output (any char is also a XON) + * INPCK Enable parity check + * IGNPAR Ignore parity errors (drop bad bytes) + * PARMRK Mark parity errors with 0xff, 0x00 prefix + * (else bad byte is received as 0x00) + * ISTRIP Strip parity bit + * IGNBRK Ignore break condition + * BRKINT Send SIGINT on break - maybe set this? + * INLCR Map NL to CR + * IGNCR Ignore CR + * ICRNL Map CR to NL + * IUCLC Map uppercase to lowercase + * IMAXBEL Echo BEL on input line too long + * IUTF8 [Appears to affect tty's idea of char widths, + * observed to improve backspacing through Unicode chars] + */ + + /* line buffered input (NL or EOL or EOF chars end a line); + * recognize INT/QUIT/SUSP chars; + * echo input chars; + * echo BS-SP-BS on erase character; + * echo kill char specially, not as ^c (ECHOKE controls how exactly); + * erase all input via BS-SP-BS on kill char (else go to next line) + */ G.termios.c_lflag |= ICANON | ISIG | ECHO | ECHOE | ECHOK | ECHOKE; - /* echo ctrl chars as ^c; (what is ECHOPRT?) */ - /* no longer in c_lflag: | ECHOCTL | ECHOPRT */ + /* Other bits in c_lflag: + * XCASE Map uppercase to \lowercase [tried, doesn't work] + * ECHONL Echo NL even if ECHO is not set + * NOFLSH Don't flush input buffer after interrupt or quit chars + * IEXTEN Enable extended functions (??) + * [glibc says it enables c_cc[LNEXT] "enter literal char" + * and c_cc[VDISCARD] "toggle discard buffered output" chars] + * ECHOCTL Echo ctrl chars as ^c (else don't echo) - maybe set this? + * ECHOPRT On erase, echo erased chars + * [qwe<BS><BS><BS> input looks like "qwe\ewq/" on screen] + * FLUSHO Output being flushed (c_cc[VDISCARD] is in effect) + * PENDIN Retype pending input at next read or input char + * (c_cc[VREPRINT] is being processes) + * TOSTOP Send SIGTTOU for background output + * (why "stty sane" unsets this bit?) + */ G.termios.c_cc[VINTR] = DEF_INTR; G.termios.c_cc[VQUIT] = DEF_QUIT; @@ -305,6 +349,14 @@ static void termios_final(void) G.termios.c_cc[VSWTCH] = DEF_SWITCH; #endif G.termios.c_cc[VKILL] = DEF_KILL; + /* Other control chars: + * VEOL2 + * VERASE, VWERASE - (word) erase. we may set VERASE in get_logname + * VREPRINT - reprint current input buffer + * VLNEXT, VDISCARD, VSTATUS + * VSUSP, VDSUSP - send (delayed) SIGTSTP + * VSTART, VSTOP - chars used for IXON/IXOFF + */ if (tcsetattr_stdin_TCSANOW(&G.termios) < 0) bb_perror_msg_and_die("tcsetattr"); |