From 5abe4e352a7991dbf19ad41881b6a4d5bd5aaa0e Mon Sep 17 00:00:00 2001 From: jilles Date: Sun, 31 May 2009 19:37:06 +0000 Subject: 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(-) (limited to 'bin/sh') diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c index 2480c0d..acb5654 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; @@ -151,26 +149,11 @@ readcmd(int argc __unused, char **argv __unused) 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 c18c190..cc8874e 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. -- cgit v1.1