Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 May 2009 19:37:06 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r193185 - head/bin/sh
Message-ID:  <200905311937.n4VJb6Dx053086@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Sun May 31 19:37:06 2009
New Revision: 193185
URL: http://svn.freebsd.org/changeset/base/193185

Log:
  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)

Modified:
  head/bin/sh/miscbltin.c
  head/bin/sh/sh.1

Modified: head/bin/sh/miscbltin.c
==============================================================================
--- head/bin/sh/miscbltin.c	Sun May 31 19:35:41 2009	(r193184)
+++ head/bin/sh/miscbltin.c	Sun May 31 19:37:06 2009	(r193185)
@@ -103,8 +103,6 @@ readcmd(int argc __unused, char **argv _
 	struct timeval tv;
 	char *tvptr;
 	fd_set ifds;
-	struct termios told, tnew;
-	int tsaved;
 
 	rflag = 0;
 	prompt = NULL;
@@ -151,26 +149,11 @@ readcmd(int argc __unused, char **argv _
 
 	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.
 		 */

Modified: head/bin/sh/sh.1
==============================================================================
--- head/bin/sh/sh.1	Sun May 31 19:35:41 2009	(r193184)
+++ head/bin/sh/sh.1	Sun May 31 19:37:06 2009	(r193185)
@@ -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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905311937.n4VJb6Dx053086>