Page MenuHomeFreeBSD

D53761.id166468.diff
No OneTemporary

D53761.id166468.diff

diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c
--- a/bin/sh/miscbltin.c
+++ b/bin/sh/miscbltin.c
@@ -162,6 +162,7 @@
int is_ifs;
int saveall = 0;
ptrdiff_t lastnonifs, lastnonifsws;
+ struct timespec tnow, tend;
struct timeval tv;
char *tvptr;
fd_set ifds;
@@ -187,19 +188,20 @@
tv.tv_sec = strtol(shoptarg, &tvptr, 0);
if (tvptr == shoptarg)
error("timeout value");
- switch(*tvptr) {
- case 0:
+ switch (*tvptr) {
case 's':
+ tvptr++;
break;
case 'h':
tv.tv_sec *= 60;
/* FALLTHROUGH */
case 'm':
tv.tv_sec *= 60;
+ tvptr++;
break;
- default:
- error("timeout unit");
}
+ if (*tvptr != '\0')
+ error("timeout unit");
break;
}
}
@@ -216,16 +218,31 @@
/*
* Wait for something to become available.
*/
+ clock_gettime(CLOCK_UPTIME, &tnow);
+ tend = tnow;
+ tend.tv_sec += tv.tv_sec;
FD_ZERO(&ifds);
FD_SET(0, &ifds);
- status = select(1, &ifds, NULL, NULL, &tv);
+ status = sig = 0;
+ do {
+ tv.tv_sec = tend.tv_sec - tnow.tv_sec;
+ tv.tv_usec = (tend.tv_nsec - tnow.tv_nsec) / 1000;
+ if (tv.tv_usec < 0) {
+ tv.tv_sec--;
+ tv.tv_usec -= 1000000;
+ }
+ status = select(1, &ifds, NULL, NULL, &tv);
+ if (status == 0 ||
+ (status < 0 && (sig = pendingsig) != 0))
+ break;
+ clock_gettime(CLOCK_UPTIME, &tnow);
+ } while (timespeccmp(&tnow, &tend, <));
/*
* If there's nothing ready, return an error.
*/
if (status <= 0) {
while (*ap != NULL)
setvar(*ap++, "", 0);
- sig = pendingsig;
return (128 + (sig != 0 ? sig : SIGALRM));
}
}
diff --git a/bin/sh/tests/builtins/Makefile b/bin/sh/tests/builtins/Makefile
--- a/bin/sh/tests/builtins/Makefile
+++ b/bin/sh/tests/builtins/Makefile
@@ -143,6 +143,7 @@
${PACKAGE}FILES+= read9.0
${PACKAGE}FILES+= read10.0
${PACKAGE}FILES+= read11.0
+${PACKAGE}FILES+= read12.0
${PACKAGE}FILES+= return1.0
${PACKAGE}FILES+= return2.1
${PACKAGE}FILES+= return3.1
diff --git a/bin/sh/tests/builtins/read12.0 b/bin/sh/tests/builtins/read12.0
new file mode 100644
--- /dev/null
+++ b/bin/sh/tests/builtins/read12.0
@@ -0,0 +1,13 @@
+
+set -e
+
+T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
+trap 'rm -rf "$T"' 0
+cd $T
+echo new_value >file1
+exec 3<file1
+v=original_value
+r=0
+read -t 0 v <&3 || r=$?
+[ "$r" -eq 0 ]
+[ "$v" = "new_value" ]

File Metadata

Mime Type
text/plain
Expires
Wed, Jul 22, 6:57 PM (11 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35377494
Default Alt Text
D53761.id166468.diff (2 KB)

Event Timeline