n_tty: honor opost flag for echoes
PATCH 1/2 n_tty: honor opost flag for echoes
Fixes the following bug:
http://bugs.linuxbase.org/show_bug.cgi?id=2692
Causes processing of echoed characters (output from the echo buffer) to honor the O_OPOST flag. This re-establishes this behavior.
Note that this and the next patch ("n_tty: move echoctl check and clean up logic") were verified together by the bug reporters, and all tty tests now pass.
---
drivers/char/n_tty.c +53 -47
@@ -292,54 +292,56 @@ static int do_output_char(unsigned charif (!space)return -1 ; -switch (c) { -case '\n' : -if (O_ONLRET (tty)) - tty->column =0 ; -if (O_ONLCR (tty)) { -if (space <2 ) -return -1 ; - tty->canon_column = tty->column =0 ; -tty_put_char (tty,'\r' ); -tty_put_char (tty, c); -return 2 ; - } - tty->canon_column = tty->column; -break ; -case '\r' : -if (O_ONOCR (tty) && tty->column ==0 ) -return 0 ; -if (O_OCRNL (tty)) { - c ='\n' ; +if (O_OPOST (tty)) { +switch (c) { +case '\n' :if (O_ONLRET (tty)) + tty->column =0 ; +if (O_ONLCR (tty)) { +if (space <2 ) +return -1 ; tty->canon_column = tty->column =0 ; +tty_put_char (tty,'\r' ); +tty_put_char (tty, c); +return 2 ; + } + tty->canon_column = tty->column;break ; - } - tty->canon_column = tty->column =0 ; -break ; -case '\t' : - spaces =8 - (tty->column &7 ); -if (O_TABDLY (tty) ==XTABS ) { -if (space < spaces) -return -1 ; +case '\r' : +if (O_ONOCR (tty) && tty->column ==0 ) +return 0 ; +if (O_OCRNL (tty)) { + c ='\n' ; +if (O_ONLRET (tty)) + tty->canon_column = tty->column =0 ; +break ; + } + tty->canon_column = tty->column =0 ; +break ; +case '\t' : + spaces =8 - (tty->column &7 ); +if (O_TABDLY (tty) ==XTABS ) { +if (space < spaces) +return -1 ; + tty->column += spaces; + tty->ops->write (tty," " , spaces); +return spaces; + } tty->column += spaces; - tty->ops->write (tty," " , spaces); -return spaces; - } - tty->column += spaces; -break ; -case '\b' : -if (tty->column >0 ) - tty->column--; -break ; -default : -if (!iscntrl (c)) { -if (O_OLCUC (tty)) - c =toupper (c); -if (!is_continuation (c, tty)) - tty->column++; +break ; +case '\b' : +if (tty->column >0 ) + tty->column--; +break ; +default : +if (!iscntrl (c)) { +if (O_OLCUC (tty)) + c =toupper (c); +if (!is_continuation (c, tty)) + tty->column++; + } +break ; } -break ; }tty_put_char (tty, c);
@@ -351,8 +353,9 @@ static int do_output_char(unsigned char* @c: character (or partial unicode symbol) * @tty: terminal device * -* Perform OPOST processing. Returns -1 when the output device is -* full and the character must be retried. +* Output a character (with OPOST processing if enabled). +* Returns -1 if the output device is full and the character +* must be retried. * * Locking: output_lock to protect column state and space left * (also, this is called from n_tty_write under the
@@ -378,8 +381,11 @@ static int process_output(unsigned char/** * process_output_block - block post processor * @tty: terminal device -* @inbuf: user buffer -* @nr: number of bytes +* @buf: character buffer +* @nr: number of bytes to output +* +* Output a block of characters (with OPOST processing - assumed enabled). +* Returns the number of characters output. * * This path is used to speed up block console writes, among other * things when processing blocks of output data. It handles only
Quoted 10 lines · Joe Peterson
Fixes the following bug:
http://bugs.linuxbase.org/show_bug.cgi?id=2692Causes processing of echoed characters (output from the echo buffer) to honor the
O_OPOSTflag. This re-establishes this behavior.Note that this and the next patch ("
n_tty: move echoctl check and clean up logic") were verified together by the bug reporters, and all tty tests now pass.
What "tty tests" would that be? Have a pointer to them?
thanks,
greg k-h
Quoted 6 lines · Greg KH
Quoted 4 lines · Joe Peterson
Fixes the following bug:
http://bugs.linuxbase.org/show_bug.cgi?id=2692
Quoted 8 lines
Quoted 6 lines
Causes processing of echoed characters (output from the echo buffer) to honor the
O_OPOSTflag. This re-establishes this behavior.Note that this and the next patch ("
n_tty: move echoctl check and clean up logic") were verified together by the bug reporters, and all tty tests now pass.What "tty tests" would that be? Have a pointer to them?
It's the "Linux Standard Base" test suite:
http://www.linuxfoundation.org/collaborate/workgroups/lsb
Here's a link to the specific code - got this from one of the reporters:
-Joe
Quoted 16 lines · Joe Peterson
Quoted 6 lines · Greg KH
Quoted 4 lines · Joe Peterson
Fixes the following bug:
http://bugs.linuxbase.org/show_bug.cgi?id=2692Quoted 8 lines
Quoted 6 lines
Causes processing of echoed characters (output from the echo buffer) to honor the
O_OPOSTflag. This re-establishes this behavior.Note that this and the next patch ("
n_tty: move echoctl check and clean up logic") were verified together by the bug reporters, and all tty tests now pass.What "tty tests" would that be? Have a pointer to them?
Quoted 8 lines
It's the "Linux Standard Base" test suite:
http://www.linuxfoundation.org/collaborate/workgroups/lsb
Here's a link to the specific code - got this from one of the reporters:
Ah, thanks, I'll dig through it.
greg k-h