diff options
author | Andrew Tridgell <tridge@samba.org> | 2010-04-20 21:45:33 +1000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2010-04-20 23:43:33 +1000 |
commit | a9f5bfb3a5324f09a07657a8bb28bb4510485d31 (patch) | |
tree | fbe12f1a74c9ea9cdd1bb449a1f6fa4837aa6f38 | |
parent | 4f5298cbb4c044b6bde0cda04d182651f826ee53 (diff) | |
download | samba-a9f5bfb3a5324f09a07657a8bb28bb4510485d31.tar.gz samba-a9f5bfb3a5324f09a07657a8bb28bb4510485d31.tar.bz2 samba-a9f5bfb3a5324f09a07657a8bb28bb4510485d31.zip |
util-runcmd: ignore spurious ECHILD errors
when we get ECHILD in samba_runcmd it is because the parent has set
SIGCHLD to SIG_IGN. In that case the child status information is
lost. We then have to fallback on the logging of child error messages
for any useful information on what happened to the child.
A longer term fix is to stop using SIG_IGN for SIGCHLD in the standard
process model of s4.
-rw-r--r-- | lib/util/util_runcmd.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/util/util_runcmd.c b/lib/util/util_runcmd.c index d81a0ace93..aa2a3e6672 100644 --- a/lib/util/util_runcmd.c +++ b/lib/util/util_runcmd.c @@ -241,6 +241,20 @@ static void samba_runcmd_io_handler(struct tevent_context *ev, * stderr, assume its dead */ pid_t pid = waitpid(state->pid, &status, 0); if (pid != state->pid) { + if (errno == ECHILD) { + /* this happens when the + parent has set SIGCHLD to + SIG_IGN. In that case we + can only get error + information for the child + via its logging. We should + stop using SIG_IGN on + SIGCHLD in the standard + process model. + */ + tevent_req_done(req); + return; + } DEBUG(0,("Error in waitpid() for child %s - %s \n", state->arg0, strerror(errno))); if (errno == 0) { |