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.
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to