Skip to contentSkip to conversation

n_tty: honor opost flag for echoes

PATCH In review Joe Peterson 2 participants 4 messages Aug 4, 2009 Char and misc drivers

lore
Share & tools
lore
#0 lore raw

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
diff -Nurp a/drivers/char/n_tty.c b/drivers/char/n_tty.c
@@ -292,54 +292,56 @@ static int do_output_char(unsigned char 
 	if (!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
#1 lore raw
Quoted 10 lines · Joe Peterson

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.

What "tty tests" would that be? Have a pointer to them?

thanks,

greg k-h

#2 lore raw
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_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.

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:

http://bzr.linux-foundation.org/lsb/devel/runtime-test?cmd=content;rev=cyeoh-20020312084903-a08971416c59e5d5;pathrevid=stewb%40linux-foundation.org-20090626205411-sfb23cc0tjj7jzgm;path=modules/vsx-pcts/tset/POSIX.os/devclass/c_lflag/c_lflag.c

-Joe

#3 lore raw
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=2692
Quoted 8 lines
Quoted 6 lines

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.

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:

http://bzr.linux-foundation.org/lsb/devel/runtime-test?cmd=content;rev=cyeoh-20020312084903-a08971416c59e5d5;pathrevid=stewb%40linux-foundation.org-20090626205411-sfb23cc0tjj7jzgm;path=modules/vsx-pcts/tset/POSIX.os/devclass/c_lflag/c_lflag.c

Ah, thanks, I'll dig through it.

greg k-h