Support DISCARD (^O)

Eivind Evensen
2013-12-17T21:18:16Z

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.

Regards, Eivind


diff -r 91820d9948e0 -r 13f40d577646 sys/kern/tty_ttydisc.c
--- a/sys/kern/tty_ttydisc.c	Fri Feb 22 09:45:32 2013 +0100
+++ b/sys/kern/tty_ttydisc.c	Tue Dec 17 23:03:17 2013 +0100
@@ -448,6 +448,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
@@ -881,6 +884,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)) {