From owner-freebsd-hackers Sun Sep 28 02:21:02 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id CAA21357 for hackers-outgoing; Sun, 28 Sep 1997 02:21:02 -0700 (PDT) Received: from word.smith.net.au (ppp20.portal.net.au [202.12.71.120]) by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id CAA21343 for ; Sun, 28 Sep 1997 02:20:48 -0700 (PDT) Received: from word.smith.net.au (localhost.smith.net.au [127.0.0.1]) by word.smith.net.au (8.8.7/8.8.5) with ESMTP id SAA05469; Sun, 28 Sep 1997 18:47:57 +0930 (CST) Message-Id: <199709280917.SAA05469@word.smith.net.au> X-Mailer: exmh version 2.0zeta 7/24/97 To: joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch) cc: hackers@FreeBSD.ORG Subject: Re: Timeout for sh(1) 'read' ?? In-reply-to: Your message of "Sun, 28 Sep 1997 08:36:19 +0200." <19970928083619.EN11505@uriah.heep.sax.de> Mime-Version: 1.0 Content-Type: multipart/mixed ; boundary="==_Exmh_17929333040" Date: Sun, 28 Sep 1997 18:47:53 +0930 From: Mike Smith Sender: owner-freebsd-hackers@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk This is a multipart MIME message. --==_Exmh_17929333040 Content-Type: text/plain; charset=us-ascii > As Mike Smith wrote: > > > > $foo=${foo:-default} > > > > Hmm. Actually, you would get the desired behaviour with > > > > val=${default} > > Well, sure. I didn't see this. :) You need to assign a value in the > first place anyway. I think you are misreading me; I was agreeing that the "default value" option was the wrong way to go, and that an equivalent behaviour could be achieved by setting the variable before calling read. > j@uriah 66% ksh93 > $ read -t 5 foo # and just wait > $ echo $? > 1 > $ read -t 5 foo > babble > $ echo $? > 0 > $ exit This is identical to the enclosed patch, which is good. Comments anyone? mike --==_Exmh_17929333040 Content-Type: text/plain ; name="sh.diff"; charset=us-ascii Content-Description: sh.diff Content-Disposition: attachment; filename="sh.diff" *** /usr/src/bin/sh/miscbltin.c Mon Aug 4 18:54:31 1997 --- miscbltin.c Sun Sep 28 18:44:03 1997 *************** *** 52,57 **** --- 52,58 ---- #include #include #include + #include #include "shell.h" #include "options.h" *************** *** 88,101 **** int startword; int status; int i; eflag = 0; prompt = NULL; ! while ((i = nextopt("ep:")) != '\0') { ! if (i == 'p') prompt = optarg; ! else eflag = 1; } if (prompt && isatty(0)) { out2str(prompt); --- 89,131 ---- int startword; int status; int i; + struct timeval tv; + char *tvptr; + fd_set ifds; + struct termios told, tnew; + int tsaved; eflag = 0; prompt = NULL; ! tv.tv_sec = -1; ! tv.tv_usec = 0; ! while ((i = nextopt("d:ep:t:")) != '\0') { ! switch(i) { ! case 'p': prompt = optarg; ! break; ! case 'e': eflag = 1; + break; + case 't': + tv.tv_sec = strtol(optarg, &tvptr, 0); + if (tvptr == optarg) + error("timeout value"); + switch(*tvptr) { + case 0: + case 's': + break; + case 'h': + tv.tv_sec *= 60; + /* FALLTHROUGH */ + case 'm': + tv.tv_sec *= 60; + break; + default: + error("timeout unit"); + } + break; + } } if (prompt && isatty(0)) { out2str(prompt); *************** *** 105,110 **** --- 135,169 ---- error("arg count"); if ((ifs = bltinlookup("IFS", 1)) == NULL) ifs = nullstr; + + 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); + 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. + */ + if (status <= 0) + return(1); + } + status = 0; startword = 1; backslash = 0; *** /usr/src/bin/sh/sh.1 Mon Sep 15 01:01:24 1997 --- sh.1 Sun Sep 28 15:40:37 1997 *************** *** 1123,1129 **** it faster. However, if the current directory is renamed, the builtin version of pwd will continue to print the old name for the directory. ! .It read [ -p prompt ] [ -e ] variable ... The prompt is printed if the -p option is specified and the standard input is a terminal. Then a line is read from the standard input. The trailing newline --- 1123,1129 ---- it faster. However, if the current directory is renamed, the builtin version of pwd will continue to print the old name for the directory. ! .It read [ -p prompt ] [-t timeout ] [ -e ] variable ... The prompt is printed if the -p option is specified and the standard input is a terminal. Then a line is read from the standard input. The trailing newline *************** *** 1135,1140 **** --- 1135,1143 ---- separated them) are assigned to the last variable. If there are more variables than pieces, the remaining variables are assigned the null string. + If the -t option is specified and timeout seconds elapse + before any input is supplied, the read command will + return without assigning any values. .Pp The -e option causes any backslashes in the input to be treated specially. If a backslash is followed by --==_Exmh_17929333040--