From: Jim Meyering Date: Mon, 28 Feb 2005 10:02:58 +0000 (+0000) Subject: (xnanosleep): Work around bug in Linux-2.6.8.1's X-Git-Tag: CPPI-1_12~1406 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=db042d202252bf0372b033775ffcffa23e826ac2;p=thirdparty%2Fcoreutils.git (xnanosleep): Work around bug in Linux-2.6.8.1's nanosleep whereby it fails without setting errno upon being resumed after being suspended. --- diff --git a/lib/xnanosleep.c b/lib/xnanosleep.c index 8aa5e8a8de..5ac9f2ecd9 100644 --- a/lib/xnanosleep.c +++ b/lib/xnanosleep.c @@ -123,9 +123,16 @@ xnanosleep (double seconds) ts_sleep.tv_nsec = BILLION - 1; } + /* Linux-2.6.8.1's nanosleep returns -1, but doesn't set errno + when resumed after being suspended. Earlier versions would + set errno to EINTR. nanosleep from linux-2.6.10, as well as + implementations by (all?) other vendors, doesn't return -1 + in that case; either it continues sleeping (if time remains) + or it returns zero (if the wake-up time has passed). */ + errno = 0; if (nanosleep (&ts_sleep, NULL) == 0) break; - if (errno != EINTR) + if (errno != EINTR && errno != 0) return -1; if (NANOSLEEP_BUG_WORKAROUND)