Support DISCARD (^O)

Eivind Nicolay Evensen
2014-07-05T10:34:16Z

On Tue, Dec 17, 2013 at 10:18:16PM +0100, Eivind Evensen
wrote:
> Hello.
>
> I don't know if there is any particular reason that support for
DISCARD/^O
> was not included in the tty rewrite that happened from FreeBSD 7 to 8,
> but in case anybody else wants it, here's a diff functioning mostly
> like in 7, except output isn't switched back on automatically on input.
>
> Diff is against FreeBSD 8, however, last time I checked I didn't see
> much difference in the newer versions.

Here's a diff against FreeBSD 10. It seems to work fine there too.


diff -r 59ad9c4b7916 -r 6e500f4552b4 sys/kern/tty_ttydisc.c
--- a/sys/kern/tty_ttydisc.c	Fri Jul 04 17:27:59 2014 +0200
+++ b/sys/kern/tty_ttydisc.c	Fri Jul 04 17:29:29 2014 +0200
@@ -464,6 +464,9 @@
 	if (tp->t_flags & TF_ZOMBIE)
 		return (EIO);

+	if (tp->t_termios.c_lflag & FLUSHO)
+		return (0);
+
 	/*
 	 * We don't need to check whether the process is the foreground
 	 * process group or if we have a carrier. This is already done
@@ -896,6 +899,14 @@

 	/* Special control characters that are implementation dependent. */
 	if (CMP_FLAG(l, IEXTEN)) {
+		/* Discard (^O) */
+		if (CMP_CC(VDISCARD, c)) {
+			if (!(tp->t_termios.c_lflag & FLUSHO))
+				ttyoutq_write_nofrag(&tp->t_outq, "^O", 2);
+			tp->t_termios.c_lflag ^= FLUSHO;
+			return(0);
+		}
+
 		/* Accept the next character as literal. */
 		if (CMP_CC(VLNEXT, c)) {
 			if (CMP_FLAG(l, ECHO)) {