summaryrefslogtreecommitdiffstats
path: root/bin/sleep
diff options
context:
space:
mode:
authorsjg <sjg@FreeBSD.org>2013-09-05 20:18:59 +0000
committersjg <sjg@FreeBSD.org>2013-09-05 20:18:59 +0000
commit62bb1062226d3ce6a2350808256a25508978352d (patch)
tree22b131dceb13c3df96da594fbaadb693504797c7 /bin/sleep
parent72ab90509b3a51ab361bf710338f2ef44a4e360d (diff)
parent04932445481c2cb89ff69a83b961bdef3d64757e (diff)
downloadFreeBSD-src-62bb1062226d3ce6a2350808256a25508978352d.zip
FreeBSD-src-62bb1062226d3ce6a2350808256a25508978352d.tar.gz
Merge from head
Diffstat (limited to 'bin/sleep')
-rw-r--r--bin/sleep/sleep.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/bin/sleep/sleep.c b/bin/sleep/sleep.c
index fa7deb2..ca08272 100644
--- a/bin/sleep/sleep.c
+++ b/bin/sleep/sleep.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <ctype.h>
#include <err.h>
+#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stdint.h>
@@ -81,14 +82,20 @@ main(int argc, char *argv[])
time_to_sleep.tv_nsec = 1e9 * (d - time_to_sleep.tv_sec);
signal(SIGINFO, report_request);
+
+ /*
+ * Note: [EINTR] is supposed to happen only when a signal was handled
+ * but the kernel also returns it when a ptrace-based debugger
+ * attaches. This is a bug but it is hard to fix.
+ */
while (nanosleep(&time_to_sleep, &time_to_sleep) != 0) {
if (report_requested) {
/* Reporting does not bother with nanoseconds. */
warnx("about %d second(s) left out of the original %d",
(int)time_to_sleep.tv_sec, (int)original);
report_requested = 0;
- } else
- break;
+ } else if (errno != EINTR)
+ err(1, "nanosleep");
}
return (0);
}
OpenPOWER on IntegriCloud