This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Correctly report nscd child process status.


Hi,

The nscd parent process returns the result of a `wait' call rather than
the exit status of the child it waits for. These two aren't exactly the
same. In my case (and probably on most machines), the exit status is in
the 2nd LSB of the result of `wait', and so:

e.g. if the nscd child process returns 1, the parent returns 1 << 8,
which Bash happily reports as 0.

This patch should fix that.

Cheers,
Arjun

---
 nscd/nscd.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/nscd/nscd.c b/nscd/nscd.c
index 3dd1135..298bdcc 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -612,7 +612,8 @@ monitor_child (int fd)
      method, like a segfault.  */
   if (ret <= 0 || child_ret != 0)
     {
-      int err = wait (&child_ret);
+      int status;
+      int err = wait (&status);
 
       if (err < 0)
 	{
@@ -620,13 +621,16 @@ monitor_child (int fd)
 	  return 1;
 	}
 
-      fprintf (stderr, _("child exited with status %d"),
-	       WEXITSTATUS (child_ret));
-      if (WIFSIGNALED (child_ret))
-	fprintf (stderr, _(", terminated by signal %d.\n"),
-		 WTERMSIG (child_ret));
-      else
-	fprintf (stderr, ".\n");
+      if (WIFEXITED (status))
+        {
+          child_ret = WEXITSTATUS (status);
+          fprintf (stderr, _("child exited with status %d.\n"), child_ret);
+        }
+      if (WIFSIGNALED (status))
+        {
+          child_ret = WTERMSIG (status);
+          fprintf (stderr, _("child terminated by signal %d.\n"), child_ret);
+        }
     }
 
   /* We have the child status, so exit with that code.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]