n_tty: honor opost flag for echoes
Subsystems (2)
PATCH 1/2 n_tty: honor opost flag for echoes
This (and the forthcoming part 2, which is the same patch with corrected offsets) are resubmissions to avoid the conflict with "n_tty: do O_ONLCR translation as a single write" and to move the O_OPOST test to the caller.
-Joe
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, which is consistent with the old 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 the test now passes.
Signed-off-by Joe Peterson <[email protected]>
---
drivers/char/n_tty.c +22 -11
@@ -272,7 +272,8 @@ static inline int is_continuation(unsign* * This is a helper function that handles one output character * (including special characters like TAB, CR, LF, etc.), -* putting the results in the tty driver's write buffer. +* doing OPOST processing and putting the results in the +* tty driver's write buffer. * * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY * and NLDLY. They simply aren't relevant in the world today.
@@ -351,8 +352,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 one character with OPOST processing. +* Returns -1 when 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 +380,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. +* 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
@@ -606,12 +611,18 @@ static void process_echoes(struct tty_stif (no_space_left)break ; }else { -int retval; - - retval =do_output_char (c, tty, space); -if (retval <0 ) -break ; - space -= retval; +if (O_OPOST (tty) && + !(test_bit (TTY_HW_COOK_OUT , &tty->flags))) { +int retval =do_output_char (c, tty, space); +if (retval <0 ) +break ; + space -= retval; + }else { +if (!space) +break ; +tty_put_char (tty, c); + space -=1 ; + } cp +=1 ; nr -=1 ; }