diff options
-rw-r--r-- | init/init.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/init/init.c b/init/init.c index 85792c9b7..d332ccdbe 100644 --- a/init/init.c +++ b/init/init.c | |||
@@ -500,7 +500,12 @@ static pid_t run(const struct init_action *a) | |||
500 | signal(SIGCHLD, SIG_DFL); | 500 | signal(SIGCHLD, SIG_DFL); |
501 | 501 | ||
502 | /* Wait for child to exit */ | 502 | /* Wait for child to exit */ |
503 | while ((tmp_pid = waitpid(pid, &junk, 0)) != pid); | 503 | while ((tmp_pid = waitpid(pid, &junk, 0)) != pid) { |
504 | if (tmp_pid == -1 && errno == ECHILD) { | ||
505 | break; | ||
506 | } | ||
507 | /* FIXME handle other errors */ | ||
508 | } | ||
504 | 509 | ||
505 | /* See if stealing the controlling tty back is necessary */ | 510 | /* See if stealing the controlling tty back is necessary */ |
506 | pgrp = tcgetpgrp(0); | 511 | pgrp = tcgetpgrp(0); |
@@ -624,12 +629,15 @@ static int waitfor(const struct init_action *a) | |||
624 | 629 | ||
625 | pid = run(a); | 630 | pid = run(a); |
626 | while (1) { | 631 | while (1) { |
627 | wpid = wait(&status); | 632 | wpid = waitpid(pid,&status,0); |
628 | if (wpid > 0 && wpid != pid) { | ||
629 | continue; | ||
630 | } | ||
631 | if (wpid == pid) | 633 | if (wpid == pid) |
632 | break; | 634 | break; |
635 | if (wpid == -1 && errno == ECHILD) { | ||
636 | /* we missed its termination */ | ||
637 | break; | ||
638 | } | ||
639 | /* FIXME other errors should maybe trigger an error, but allow | ||
640 | * the program to continue */ | ||
633 | } | 641 | } |
634 | return wpid; | 642 | return wpid; |
635 | } | 643 | } |