X-Git-Url: https://git.distorted.org.uk/~mdw/qmail/blobdiff_plain/2117e02ec495fdfd6e96b39778b701a5bcff8aa5..212b6f5da7c68d4577de2855da3c57ecf476dc96:/wait_pid.c diff --git a/wait_pid.c b/wait_pid.c index 8dde830..d7a7e84 100644 --- a/wait_pid.c +++ b/wait_pid.c @@ -1,13 +1,39 @@ #include #include #include "error.h" +#include "haswaitp.h" + +#ifdef HASWAITPID -/* restriction: you must not care about any other child. */ int wait_pid(wstat,pid) int *wstat; int pid; { int r; + do + r = waitpid(pid,wstat,0); + while ((r == -1) && (errno == error_intr)); + return r; +} + +#else + +/* XXX untested */ +/* XXX breaks down with more than two children */ +static int oldpid = 0; +static int oldwstat; /* defined if(oldpid) */ + +int wait_pid(wstat,pid) int *wstat; int pid; +{ + int r; + + if (pid == oldpid) { *wstat = oldwstat; oldpid = 0; return pid; } + + do { r = wait(wstat); - while ((r != pid) && ((r != -1) || (errno == error_intr))); + if ((r != pid) && (r != -1)) { oldwstat = *wstat; oldpid = r; continue; } + } + while ((r == -1) && (errno == error_intr)); return r; } + +#endif