about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/sleep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/sleep.c')
-rw-r--r--sysdeps/unix/sysv/linux/sleep.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/sleep.c b/sysdeps/unix/sysv/linux/sleep.c
index 5fb11603cf..53968e86c2 100644
--- a/sysdeps/unix/sysv/linux/sleep.c
+++ b/sysdeps/unix/sysv/linux/sleep.c
@@ -1,5 +1,5 @@
 /* Implementation of the POSIX sleep function using nanosleep.
-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -31,9 +31,12 @@ __sleep (unsigned int seconds)
 {
   struct timespec ts = { tv_sec: (long int) seconds, tv_nsec: 0 };
   sigset_t set, oset;
-  struct sigaction oact;
   unsigned int result;
 
+  /* This is not necessary but some buggy programs depend on this.  */
+  if (seconds == 0)
+    return 0;
+
   /* Linux will wake up the system call, nanosleep, when SIGCHLD
      arrives even if SIGCHLD is ignored.  We have to deal with it
      in libc.  We block SIGCHLD first.  */
@@ -46,6 +49,10 @@ __sleep (unsigned int seconds)
   if (!__sigismember (&oset, SIGCHLD))
     {
       int saved_errno;
+      struct sigaction oact;
+
+      if (__sigemptyset (&set) < 0 || __sigaddset (&set, SIGCHLD) < 0)
+	return -1;
 
       /* We get the signal handler for SIGCHLD.  */
       if (__sigaction (SIGCHLD, (struct sigaction *) NULL, &oact) < 0)