From 5abe4e352a7991dbf19ad41881b6a4d5bd5aaa0e Mon Sep 17 00:00:00 2001
From: jilles <jilles@FreeBSD.org>
Date: Sun, 31 May 2009 19:37:06 +0000
Subject: [PATCH] sh: Make read's timeout (-t) apply to the entire line, not
 only the first character.

This avoids using non-standard behaviour of the old (upto FreeBSD 7) TTY
layer: it reprocesses the input queue when switching to canonical mode. The
new TTY layer does not provide this functionality and so read -t worked
very poorly (first character is not echoed, cannot be backspaced but is
still read).

This also agrees with what most other shells with read -t do.

PR:		bin/129566
Reviewed by:	stefanf
Approved by:	ed (mentor)
---
 bin/sh/miscbltin.c | 17 -----------------
 bin/sh/sh.1        |  4 ++--
 2 files changed, 2 insertions(+), 19 deletions(-)

diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c
index 2480c0d2eee1..acb565468d16 100644
--- a/bin/sh/miscbltin.c
+++ b/bin/sh/miscbltin.c
@@ -103,8 +103,6 @@ readcmd(int argc __unused, char **argv __unused)
 	struct timeval tv;
 	char *tvptr;
 	fd_set ifds;
-	struct termios told, tnew;
-	int tsaved;
 
 	rflag = 0;
 	prompt = NULL;
@@ -150,27 +148,12 @@ readcmd(int argc __unused, char **argv __unused)
 		ifs = " \t\n";
 
 	if (tv.tv_sec >= 0) {
-		/*
-		 * See if we can disable input processing; this will
-		 * not give the desired result if we are in a pipeline
-		 * and someone upstream is still in line-by-line mode.
-		 */
-		tsaved = 0;
-		if (tcgetattr(0, &told) == 0) {
-			memcpy(&tnew, &told, sizeof(told));
-			cfmakeraw(&tnew);
-			tnew.c_iflag |= told.c_iflag & ICRNL;
-			tcsetattr(0, TCSANOW, &tnew);
-			tsaved = 1;
-		}
 		/*
 		 * Wait for something to become available.
 		 */
 		FD_ZERO(&ifds);
 		FD_SET(0, &ifds);
 		status = select(1, &ifds, NULL, NULL, &tv);
-		if (tsaved)
-			tcsetattr(0, TCSANOW, &told);
 		/*
 		 * If there's nothing ready, return an error.
 		 */
diff --git a/bin/sh/sh.1 b/bin/sh/sh.1
index c18c19016a90..cc8874e4e40f 100644
--- a/bin/sh/sh.1
+++ b/bin/sh/sh.1
@@ -32,7 +32,7 @@
 .\"	from: @(#)sh.1	8.6 (Berkeley) 5/4/95
 .\" $FreeBSD$
 .\"
-.Dd October 7, 2006
+.Dd May 31, 2009
 .Dt SH 1
 .Os
 .Sh NAME
@@ -1949,7 +1949,7 @@ If the
 .Fl t
 option is specified and the
 .Ar timeout
-elapses before any input is supplied,
+elapses before a complete line of input is supplied,
 the
 .Ic read
 command will return an exit status of 1 without assigning any values.