about summary refs log tree commit diff
path: root/sysdeps/posix/waitid.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/posix/waitid.c')
-rw-r--r--sysdeps/posix/waitid.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/sysdeps/posix/waitid.c b/sysdeps/posix/waitid.c
index e388d173f4..76a3b1d660 100644
--- a/sysdeps/posix/waitid.c
+++ b/sysdeps/posix/waitid.c
@@ -1,5 +1,5 @@
 /* Pseudo implementation of waitid.
-   Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997.
 
@@ -28,8 +28,15 @@
 #include <sysdep-cancel.h>
 
 
+#ifdef DO_WAITID
+# define OUR_WAITID DO_WAITID
+#elif !defined NO_DO_WAITID
+# define OUR_WAITID do_waitid
+#endif
+
+#ifdef OUR_WAITID
 static int
-do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
+OUR_WAITID (idtype_t idtype, id_t id, siginfo_t *infop, int options)
 {
   pid_t pid, child;
   int status;
@@ -66,6 +73,22 @@ do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
       return -1;
     }
 
+  /* This emulation using waitpid cannot support the waitid modes in which
+     we do not reap the child, or match only stopped and not dead children.  */
+  if (0
+#ifdef WNOWAIT
+      || (options & WNOWAIT)
+#endif
+#ifdef WEXITED
+      || ((options & (WEXITED|WSTOPPED|WCONTINUED))
+	  != (WEXITED | (options & WUNTRACED)))
+#endif
+      )
+    {
+      __set_errno (ENOTSUP);
+      return -1;
+    }
+
   /* Note the waitid() is a cancellation point.  But since we call
      waitpid() which itself is a cancellation point we do not have
      to do anything here.  */
@@ -118,6 +141,7 @@ do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
 
   return 0;
 }
+#endif
 
 
 int