diff options
Diffstat (limited to 'src/misc/wordexp.c')
-rw-r--r-- | src/misc/wordexp.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/misc/wordexp.c b/src/misc/wordexp.c index 1387b5d2..a5f1b658 100644 --- a/src/misc/wordexp.c +++ b/src/misc/wordexp.c @@ -11,6 +11,18 @@ #include <fcntl.h> #include "pthread_impl.h" +static void reap(pid_t pid) +{ + int status; + for (;;) { + if (waitpid(pid, &status, 0) < 0) { + if (errno != EINTR) return; + } else { + if (WIFEXITED(status)) return; + } + } +} + static char *getword(FILE *f) { char *s = 0; @@ -24,7 +36,7 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags) size_t np=0; char *w, **tmp; char *redir = (flags & WRDE_SHOWERR) ? "" : "2>/dev/null"; - int err = 0, status; + int err = 0; FILE *f; size_t wc = 0; char **wv = 0; @@ -112,7 +124,7 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags) if (!f) { close(p[0]); kill(pid, SIGKILL); - waitpid(pid, &status, 0); + reap(pid); goto nospace; } @@ -121,8 +133,7 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags) free(getword(f)); if (feof(f)) { fclose(f); - while ((waitpid(pid, &status, 0) < 0 && errno == EINTR) - || !WIFEXITED(status)); + reap(pid); return WRDE_SYNTAX; } @@ -139,8 +150,7 @@ static int do_wordexp(const char *s, wordexp_t *we, int flags) if (!feof(f)) err = WRDE_NOSPACE; fclose(f); - while ((waitpid(pid, &status, 0) < 0 && errno == EINTR) - || !WIFEXITED(status)); + reap(pid); if (!wv) wv = calloc(i+1, sizeof *wv); |