ftello: Fix C++ test error on mingw.
[gnulib.git] / lib / nanosleep.c
index a9311f8..58fc788 100644 (file)
@@ -1,7 +1,6 @@
 /* Provide a replacement for the POSIX nanosleep function.
 
-   Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006, 2007, 2008, 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 1999-2000, 2002, 2004-2010 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -45,7 +44,7 @@ enum { BILLION = 1000 * 1000 * 1000 };
 
 int
 rpl_nanosleep (const struct timespec *requested_delay,
-              struct timespec *remaining_delay)
+               struct timespec *remaining_delay)
 {
   /* nanosleep mishandles large sleeps due to internal overflow
      problems.  The worst known case of this is cygwin 1.5.x, which
@@ -115,12 +114,12 @@ my_usleep (const struct timespec *ts_delay)
     {
       time_t t1 = tv_delay.tv_sec + 1;
       if (t1 < tv_delay.tv_sec)
-       tv_delay.tv_usec = 1000000 - 1; /* close enough */
+        tv_delay.tv_usec = 1000000 - 1; /* close enough */
       else
-       {
-         tv_delay.tv_sec = t1;
-         tv_delay.tv_usec = 0;
-       }
+        {
+          tv_delay.tv_sec = t1;
+          tv_delay.tv_usec = 0;
+        }
     }
   select (0, NULL, NULL, NULL, &tv_delay);
 }
@@ -130,10 +129,16 @@ my_usleep (const struct timespec *ts_delay)
 
 int
 rpl_nanosleep (const struct timespec *requested_delay,
-              struct timespec *remaining_delay)
+               struct timespec *remaining_delay)
 {
   static bool initialized;
 
+  if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
   /* set up sig handler */
   if (! initialized)
     {
@@ -141,14 +146,14 @@ rpl_nanosleep (const struct timespec *requested_delay,
 
       sigaction (SIGCONT, NULL, &oldact);
       if (get_handler (&oldact) != SIG_IGN)
-       {
-         struct sigaction newact;
-
-         newact.sa_handler = sighandler;
-         sigemptyset (&newact.sa_mask);
-         newact.sa_flags = 0;
-         sigaction (SIGCONT, &newact, NULL);
-       }
+        {
+          struct sigaction newact;
+
+          newact.sa_handler = sighandler;
+          sigemptyset (&newact.sa_mask);
+          newact.sa_flags = 0;
+          sigaction (SIGCONT, &newact, NULL);
+        }
       initialized = true;
     }
 
@@ -160,7 +165,7 @@ rpl_nanosleep (const struct timespec *requested_delay,
     {
       /* Calculate time remaining.  */
       /* FIXME: the code in sleep doesn't use this, so there's no
-        rush to implement it.  */
+         rush to implement it.  */
 
       errno = EINTR;
     }