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)
This commit is contained in:
Jilles Tjoelker 2009-05-31 19:37:06 +00:00
parent ec034df134
commit fe40d6d3b1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=193185
2 changed files with 2 additions and 19 deletions

View File

@ -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.
*/

View File

@ -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.