diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-01-02 19:55:04 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-01-02 19:55:04 +0000 |
| commit | fb0eba706cccd510d99c4c5339a76dd15bc8a628 (patch) | |
| tree | 45122b93a1a5d628e4aa146251e34397094de817 | |
| parent | 27963980dbe1262fd6c447fc7d06839aea0861bc (diff) | |
| download | busybox-w32-fb0eba706cccd510d99c4c5339a76dd15bc8a628.tar.gz busybox-w32-fb0eba706cccd510d99c4c5339a76dd15bc8a628.tar.bz2 busybox-w32-fb0eba706cccd510d99c4c5339a76dd15bc8a628.zip | |
libbb: introduce and use safe_waitpid (loops in EINTR)
*: use more approproate (shorter) versions of wait()
function old new delta
safe_waitpid - 48 +48
wait_any_nohang - 17 +17
send_tree 365 369 +4
processorstop 432 435 +3
text_yank 110 108 -2
make_human_readable_str 202 200 -2
crond_main 1368 1366 -2
handle_sigchld 49 43 -6
reapchild 166 159 -7
custom 260 250 -10
checkscript 191 177 -14
wait_nohang 17 - -17
wait_pid 43 - -43
------------------------------------------------------------------------------
(add/remove: 2/2 grow/shrink: 2/7 up/down: 72/-103) Total: -31 bytes
| -rw-r--r-- | archival/tar.c | 4 | ||||
| -rw-r--r-- | include/libbb.h | 4 | ||||
| -rw-r--r-- | init/init.c | 26 | ||||
| -rw-r--r-- | ipsvd/tcpudp.c | 2 | ||||
| -rw-r--r-- | libbb/vfork_daemon_rexec.c | 37 | ||||
| -rw-r--r-- | miscutils/crond.c | 2 | ||||
| -rw-r--r-- | networking/httpd.c | 2 | ||||
| -rw-r--r-- | networking/ifupdown.c | 4 | ||||
| -rw-r--r-- | networking/inetd.c | 2 | ||||
| -rw-r--r-- | networking/telnetd.c | 2 | ||||
| -rw-r--r-- | networking/udhcp/script.c | 2 | ||||
| -rw-r--r-- | runit/runsv.c | 5 | ||||
| -rw-r--r-- | runit/runsvdir.c | 2 | ||||
| -rw-r--r-- | runit/sv.c | 3 | ||||
| -rw-r--r-- | runit/svlogd.c | 4 | ||||
| -rw-r--r-- | shell/ash.c | 2 | ||||
| -rw-r--r-- | shell/hush.c | 1 | ||||
| -rw-r--r-- | shell/msh.c | 2 |
18 files changed, 51 insertions, 55 deletions
diff --git a/archival/tar.c b/archival/tar.c index 5b19093e8..64975c428 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
| @@ -610,7 +610,7 @@ static int writeTarFile(const int tar_fd, const int verboseFlag, | |||
| 610 | 610 | ||
| 611 | if (gzipPid) { | 611 | if (gzipPid) { |
| 612 | int status; | 612 | int status; |
| 613 | if (waitpid(gzipPid, &status, 0) == -1) | 613 | if (safe_waitpid(gzipPid, &status, 0) == -1) |
| 614 | bb_perror_msg("waitpid"); | 614 | bb_perror_msg("waitpid"); |
| 615 | else if (!WIFEXITED(status) || WEXITSTATUS(status)) | 615 | else if (!WIFEXITED(status) || WEXITSTATUS(status)) |
| 616 | /* gzip was killed or has exited with nonzero! */ | 616 | /* gzip was killed or has exited with nonzero! */ |
| @@ -688,7 +688,7 @@ static void handle_SIGCHLD(int status) | |||
| 688 | /* Actually, 'status' is a signo. We reuse it for other needs */ | 688 | /* Actually, 'status' is a signo. We reuse it for other needs */ |
| 689 | 689 | ||
| 690 | /* Wait for any child without blocking */ | 690 | /* Wait for any child without blocking */ |
| 691 | if (waitpid(-1, &status, WNOHANG) < 0) | 691 | if (wait_any_nohang(&status) < 0) |
| 692 | /* wait failed?! I'm confused... */ | 692 | /* wait failed?! I'm confused... */ |
| 693 | return; | 693 | return; |
| 694 | 694 | ||
diff --git a/include/libbb.h b/include/libbb.h index f35f85c33..fef8fe2e0 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -587,9 +587,9 @@ pid_t xspawn(char **argv); | |||
| 587 | * if (rc < 0) bb_perror_msg("%s", argv[0]); | 587 | * if (rc < 0) bb_perror_msg("%s", argv[0]); |
| 588 | * if (rc > 0) bb_error_msg("exit code: %d", rc); | 588 | * if (rc > 0) bb_error_msg("exit code: %d", rc); |
| 589 | */ | 589 | */ |
| 590 | int safe_waitpid(int pid, int *wstat, int options); | ||
| 590 | int wait4pid(int pid); | 591 | int wait4pid(int pid); |
| 591 | int wait_pid(int *wstat, int pid); | 592 | int wait_any_nohang(int *wstat); |
| 592 | int wait_nohang(int *wstat); | ||
| 593 | #define wait_crashed(w) ((w) & 127) | 593 | #define wait_crashed(w) ((w) & 127) |
| 594 | #define wait_exitcode(w) ((w) >> 8) | 594 | #define wait_exitcode(w) ((w) >> 8) |
| 595 | #define wait_stopsig(w) ((w) >> 8) | 595 | #define wait_stopsig(w) ((w) >> 8) |
diff --git a/init/init.c b/init/init.c index 51125f348..68a59d88e 100644 --- a/init/init.c +++ b/init/init.c | |||
| @@ -95,9 +95,14 @@ static const char *const environment[] = { | |||
| 95 | 95 | ||
| 96 | /* Function prototypes */ | 96 | /* Function prototypes */ |
| 97 | static void delete_init_action(struct init_action *a); | 97 | static void delete_init_action(struct init_action *a); |
| 98 | static int waitfor(pid_t pid); | ||
| 99 | static void halt_reboot_pwoff(int sig) ATTRIBUTE_NORETURN; | 98 | static void halt_reboot_pwoff(int sig) ATTRIBUTE_NORETURN; |
| 100 | 99 | ||
| 100 | /* TODO: move to libbb? */ | ||
| 101 | static int waitfor(pid_t runpid) | ||
| 102 | { | ||
| 103 | return safe_waitpid(runpid, NULL, 0); | ||
| 104 | } | ||
| 105 | |||
| 101 | static void loop_forever(void) ATTRIBUTE_NORETURN; | 106 | static void loop_forever(void) ATTRIBUTE_NORETURN; |
| 102 | static void loop_forever(void) | 107 | static void loop_forever(void) |
| 103 | { | 108 | { |
| @@ -465,19 +470,6 @@ static pid_t run(const struct init_action *a) | |||
| 465 | _exit(-1); | 470 | _exit(-1); |
| 466 | } | 471 | } |
| 467 | 472 | ||
| 468 | static int waitfor(pid_t runpid) | ||
| 469 | { | ||
| 470 | int status, wpid; | ||
| 471 | |||
| 472 | while (1) { | ||
| 473 | wpid = waitpid(runpid, &status, 0); | ||
| 474 | if (wpid == -1 && errno == EINTR) | ||
| 475 | continue; | ||
| 476 | break; | ||
| 477 | } | ||
| 478 | return wpid; | ||
| 479 | } | ||
| 480 | |||
| 481 | /* Run all commands of a particular type */ | 473 | /* Run all commands of a particular type */ |
| 482 | static void run_actions(int action) | 474 | static void run_actions(int action) |
| 483 | { | 475 | { |
| @@ -520,7 +512,7 @@ static void init_reboot(unsigned long magic) | |||
| 520 | reboot(magic); | 512 | reboot(magic); |
| 521 | _exit(0); | 513 | _exit(0); |
| 522 | } | 514 | } |
| 523 | waitpid(pid, NULL, 0); | 515 | waitfor(pid); |
| 524 | } | 516 | } |
| 525 | 517 | ||
| 526 | static void kill_all_processes(void) | 518 | static void kill_all_processes(void) |
| @@ -980,7 +972,7 @@ int init_main(int argc, char **argv) | |||
| 980 | /* Don't consume all CPU time -- sleep a bit */ | 972 | /* Don't consume all CPU time -- sleep a bit */ |
| 981 | sleep(1); | 973 | sleep(1); |
| 982 | 974 | ||
| 983 | /* Wait for a child process to exit */ | 975 | /* Wait for any child process to exit */ |
| 984 | wpid = wait(NULL); | 976 | wpid = wait(NULL); |
| 985 | while (wpid > 0) { | 977 | while (wpid > 0) { |
| 986 | /* Find out who died and clean up their corpse */ | 978 | /* Find out who died and clean up their corpse */ |
| @@ -995,7 +987,7 @@ int init_main(int argc, char **argv) | |||
| 995 | } | 987 | } |
| 996 | } | 988 | } |
| 997 | /* see if anyone else is waiting to be reaped */ | 989 | /* see if anyone else is waiting to be reaped */ |
| 998 | wpid = waitpid(-1, NULL, WNOHANG); | 990 | wpid = wait_any_nohang(NULL); |
| 999 | } | 991 | } |
| 1000 | } | 992 | } |
| 1001 | } | 993 | } |
diff --git a/ipsvd/tcpudp.c b/ipsvd/tcpudp.c index fc29274d2..6187eb985 100644 --- a/ipsvd/tcpudp.c +++ b/ipsvd/tcpudp.c | |||
| @@ -121,7 +121,7 @@ static void sig_child_handler(int sig) | |||
| 121 | int wstat; | 121 | int wstat; |
| 122 | int pid; | 122 | int pid; |
| 123 | 123 | ||
| 124 | while ((pid = wait_nohang(&wstat)) > 0) { | 124 | while ((pid = wait_any_nohang(&wstat)) > 0) { |
| 125 | if (max_per_host) | 125 | if (max_per_host) |
| 126 | ipsvd_perhost_remove(pid); | 126 | ipsvd_perhost_remove(pid); |
| 127 | if (cnum) | 127 | if (cnum) |
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index d6e233ac3..4e6ecde67 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c | |||
| @@ -66,6 +66,21 @@ pid_t xspawn(char **argv) | |||
| 66 | return pid; | 66 | return pid; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | int safe_waitpid(int pid, int *wstat, int options) | ||
| 70 | { | ||
| 71 | int r; | ||
| 72 | |||
| 73 | do | ||
| 74 | r = waitpid(pid, wstat, options); | ||
| 75 | while ((r == -1) && (errno == EINTR)); | ||
| 76 | return r; | ||
| 77 | } | ||
| 78 | |||
| 79 | int wait_any_nohang(int *wstat) | ||
| 80 | { | ||
| 81 | return safe_waitpid(-1, wstat, WNOHANG); | ||
| 82 | } | ||
| 83 | |||
| 69 | // Wait for the specified child PID to exit, returning child's error return. | 84 | // Wait for the specified child PID to exit, returning child's error return. |
| 70 | int wait4pid(int pid) | 85 | int wait4pid(int pid) |
| 71 | { | 86 | { |
| @@ -76,28 +91,18 @@ int wait4pid(int pid) | |||
| 76 | /* we expect errno to be already set from failed [v]fork/exec */ | 91 | /* we expect errno to be already set from failed [v]fork/exec */ |
| 77 | return -1; | 92 | return -1; |
| 78 | } | 93 | } |
| 79 | if (waitpid(pid, &status, 0) == -1) | 94 | if (safe_waitpid(pid, &status, 0) == -1) |
| 80 | return -1; | 95 | return -1; |
| 81 | if (WIFEXITED(status)) | 96 | if (WIFEXITED(status)) |
| 82 | return WEXITSTATUS(status); | 97 | return WEXITSTATUS(status); |
| 83 | if (WIFSIGNALED(status)) | 98 | if (WIFSIGNALED(status)) |
| 84 | return WTERMSIG(status) + 1000; | 99 | return WTERMSIG(status) + 1000; |
| 85 | return 0; | 100 | return 0; |
| 86 | } | 101 | if (WIFEXITED(status)) |
| 87 | 102 | return WEXITSTATUS(status); | |
| 88 | int wait_nohang(int *wstat) | 103 | if (WIFSIGNALED(status)) |
| 89 | { | 104 | return WTERMSIG(status) + 1000; |
| 90 | return waitpid(-1, wstat, WNOHANG); | 105 | return 0; |
| 91 | } | ||
| 92 | |||
| 93 | int wait_pid(int *wstat, int pid) | ||
| 94 | { | ||
| 95 | int r; | ||
| 96 | |||
| 97 | do | ||
| 98 | r = waitpid(pid, wstat, 0); | ||
| 99 | while ((r == -1) && (errno == EINTR)); | ||
| 100 | return r; | ||
| 101 | } | 106 | } |
| 102 | 107 | ||
| 103 | #if ENABLE_FEATURE_PREFER_APPLETS | 108 | #if ENABLE_FEATURE_PREFER_APPLETS |
diff --git a/miscutils/crond.c b/miscutils/crond.c index 8ee7e5837..6056cb065 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c | |||
| @@ -756,7 +756,7 @@ static int CheckJobs(void) | |||
| 756 | for (line = file->cf_LineBase; line; line = line->cl_Next) { | 756 | for (line = file->cf_LineBase; line; line = line->cl_Next) { |
| 757 | if (line->cl_Pid > 0) { | 757 | if (line->cl_Pid > 0) { |
| 758 | int status; | 758 | int status; |
| 759 | int r = wait4(line->cl_Pid, &status, WNOHANG, NULL); | 759 | int r = waitpid(line->cl_Pid, &status, WNOHANG); |
| 760 | 760 | ||
| 761 | if (r < 0 || r == line->cl_Pid) { | 761 | if (r < 0 || r == line->cl_Pid) { |
| 762 | EndJob(file->cf_User, line); | 762 | EndJob(file->cf_User, line); |
diff --git a/networking/httpd.c b/networking/httpd.c index 87dc4b7da..72949755a 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
| @@ -1152,7 +1152,7 @@ static NOINLINE void cgi_io_loop_and_exit(int fromCgi_rd, int toCgi_wr, int post | |||
| 1152 | count = safe_poll(pfd, 3, -1); | 1152 | count = safe_poll(pfd, 3, -1); |
| 1153 | if (count <= 0) { | 1153 | if (count <= 0) { |
| 1154 | #if 0 | 1154 | #if 0 |
| 1155 | if (waitpid(pid, &status, WNOHANG) <= 0) { | 1155 | if (safe_waitpid(pid, &status, WNOHANG) <= 0) { |
| 1156 | /* Weird. CGI didn't exit and no fd's | 1156 | /* Weird. CGI didn't exit and no fd's |
| 1157 | * are ready, yet poll returned?! */ | 1157 | * are ready, yet poll returned?! */ |
| 1158 | continue; | 1158 | continue; |
diff --git a/networking/ifupdown.c b/networking/ifupdown.c index 31911cd21..68ea01a67 100644 --- a/networking/ifupdown.c +++ b/networking/ifupdown.c | |||
| @@ -944,7 +944,7 @@ static int doit(char *str) | |||
| 944 | execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, NULL, my_environ); | 944 | execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, NULL, my_environ); |
| 945 | exit(127); | 945 | exit(127); |
| 946 | } | 946 | } |
| 947 | waitpid(child, &status, 0); | 947 | safe_waitpid(child, &status, 0); |
| 948 | if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { | 948 | if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { |
| 949 | return 0; | 949 | return 0; |
| 950 | } | 950 | } |
| @@ -1068,7 +1068,7 @@ static char *run_mapping(char *physical, struct mapping_defn_t * map) | |||
| 1068 | fprintf(in, "%s\n", map->mapping[i]); | 1068 | fprintf(in, "%s\n", map->mapping[i]); |
| 1069 | } | 1069 | } |
| 1070 | fclose(in); | 1070 | fclose(in); |
| 1071 | waitpid(pid, &status, 0); | 1071 | safe_waitpid(pid, &status, 0); |
| 1072 | 1072 | ||
| 1073 | if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { | 1073 | if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { |
| 1074 | /* If the mapping script exited successfully, try to | 1074 | /* If the mapping script exited successfully, try to |
diff --git a/networking/inetd.c b/networking/inetd.c index a9c9397f5..d643dc6e0 100644 --- a/networking/inetd.c +++ b/networking/inetd.c | |||
| @@ -1161,7 +1161,7 @@ static void reapchild(int sig ATTRIBUTE_UNUSED) | |||
| 1161 | servtab_t *sep; | 1161 | servtab_t *sep; |
| 1162 | 1162 | ||
| 1163 | for (;;) { | 1163 | for (;;) { |
| 1164 | pid = wait3(&status, WNOHANG, NULL); | 1164 | pid = wait_any_nohang(&status); |
| 1165 | if (pid <= 0) | 1165 | if (pid <= 0) |
| 1166 | break; | 1166 | break; |
| 1167 | for (sep = servtab; sep; sep = sep->se_next) | 1167 | for (sep = servtab; sep; sep = sep->se_next) |
diff --git a/networking/telnetd.c b/networking/telnetd.c index 108bbf44f..0201d2636 100644 --- a/networking/telnetd.c +++ b/networking/telnetd.c | |||
| @@ -394,7 +394,7 @@ static void handle_sigchld(int sig) | |||
| 394 | 394 | ||
| 395 | /* Looping: more than one child may have exited */ | 395 | /* Looping: more than one child may have exited */ |
| 396 | while (1) { | 396 | while (1) { |
| 397 | pid = waitpid(-1, NULL, WNOHANG); | 397 | pid = wait_any_nohang(NULL); |
| 398 | if (pid <= 0) | 398 | if (pid <= 0) |
| 399 | break; | 399 | break; |
| 400 | ts = sessions; | 400 | ts = sessions; |
diff --git a/networking/udhcp/script.c b/networking/udhcp/script.c index 8a188988e..71f033328 100644 --- a/networking/udhcp/script.c +++ b/networking/udhcp/script.c | |||
| @@ -232,7 +232,7 @@ void udhcp_run_script(struct dhcpMessage *packet, const char *name) | |||
| 232 | name, NULL, envp); | 232 | name, NULL, envp); |
| 233 | bb_perror_msg_and_die("script %s failed", client_config.script); | 233 | bb_perror_msg_and_die("script %s failed", client_config.script); |
| 234 | } | 234 | } |
| 235 | waitpid(pid, NULL, 0); | 235 | safe_waitpid(pid, NULL, 0); |
| 236 | for (curr = envp; *curr; curr++) | 236 | for (curr = envp; *curr; curr++) |
| 237 | free(*curr); | 237 | free(*curr); |
| 238 | free(envp); | 238 | free(envp); |
diff --git a/runit/runsv.c b/runit/runsv.c index 8c5a4d4ea..84f5193f5 100644 --- a/runit/runsv.c +++ b/runit/runsv.c | |||
| @@ -282,8 +282,7 @@ static unsigned custom(struct svdir *s, char c) | |||
| 282 | execve(a, prog, environ); | 282 | execve(a, prog, environ); |
| 283 | fatal_cannot("run control/?"); | 283 | fatal_cannot("run control/?"); |
| 284 | } | 284 | } |
| 285 | while (wait_pid(&w, pid) == -1) { | 285 | while (safe_waitpid(pid, &w, 0) == -1) { |
| 286 | if (errno == EINTR) continue; | ||
| 287 | warn_cannot("wait for child control/?"); | 286 | warn_cannot("wait for child control/?"); |
| 288 | return 0; | 287 | return 0; |
| 289 | } | 288 | } |
| @@ -593,7 +592,7 @@ int runsv_main(int argc, char **argv) | |||
| 593 | int child; | 592 | int child; |
| 594 | int wstat; | 593 | int wstat; |
| 595 | 594 | ||
| 596 | child = wait_nohang(&wstat); | 595 | child = wait_any_nohang(&wstat); |
| 597 | if (!child) | 596 | if (!child) |
| 598 | break; | 597 | break; |
| 599 | if ((child == -1) && (errno != EINTR)) | 598 | if ((child == -1) && (errno != EINTR)) |
diff --git a/runit/runsvdir.c b/runit/runsvdir.c index 9e98ca6f8..838490376 100644 --- a/runit/runsvdir.c +++ b/runit/runsvdir.c | |||
| @@ -252,7 +252,7 @@ int runsvdir_main(int argc, char **argv) | |||
| 252 | for (;;) { | 252 | for (;;) { |
| 253 | /* collect children */ | 253 | /* collect children */ |
| 254 | for (;;) { | 254 | for (;;) { |
| 255 | pid = wait_nohang(&wstat); | 255 | pid = wait_any_nohang(&wstat); |
| 256 | if (pid <= 0) | 256 | if (pid <= 0) |
| 257 | break; | 257 | break; |
| 258 | for (i = 0; i < svnum; i++) { | 258 | for (i = 0; i < svnum; i++) { |
diff --git a/runit/sv.c b/runit/sv.c index e31adffed..a89e24439 100644 --- a/runit/sv.c +++ b/runit/sv.c | |||
| @@ -333,8 +333,7 @@ static int checkscript(void) | |||
| 333 | bb_perror_msg(WARN"cannot %s child %s/check", "run", *service); | 333 | bb_perror_msg(WARN"cannot %s child %s/check", "run", *service); |
| 334 | return 0; | 334 | return 0; |
| 335 | } | 335 | } |
| 336 | while (wait_pid(&w, pid) == -1) { | 336 | while (safe_waitpid(pid, &w, 0) == -1) { |
| 337 | if (errno == EINTR) continue; | ||
| 338 | bb_perror_msg(WARN"cannot %s child %s/check", "wait for", *service); | 337 | bb_perror_msg(WARN"cannot %s child %s/check", "wait for", *service); |
| 339 | return 0; | 338 | return 0; |
| 340 | } | 339 | } |
diff --git a/runit/svlogd.c b/runit/svlogd.c index 2dc8cb987..1d679c972 100644 --- a/runit/svlogd.c +++ b/runit/svlogd.c | |||
| @@ -265,7 +265,7 @@ static unsigned processorstop(struct logdir *ld) | |||
| 265 | 265 | ||
| 266 | if (ld->ppid) { | 266 | if (ld->ppid) { |
| 267 | sig_unblock(SIGHUP); | 267 | sig_unblock(SIGHUP); |
| 268 | while (wait_pid(&wstat, ld->ppid) == -1) | 268 | while (safe_waitpid(ld->ppid, &wstat, 0) == -1) |
| 269 | pause2cannot("wait for processor", ld->name); | 269 | pause2cannot("wait for processor", ld->name); |
| 270 | sig_block(SIGHUP); | 270 | sig_block(SIGHUP); |
| 271 | ld->ppid = 0; | 271 | ld->ppid = 0; |
| @@ -794,7 +794,7 @@ static void sig_child_handler(int sig_no) | |||
| 794 | 794 | ||
| 795 | if (verbose) | 795 | if (verbose) |
| 796 | bb_error_msg(INFO"sig%s received", "child"); | 796 | bb_error_msg(INFO"sig%s received", "child"); |
| 797 | while ((pid = wait_nohang(&wstat)) > 0) { | 797 | while ((pid = wait_any_nohang(&wstat)) > 0) { |
| 798 | for (l = 0; l < dirn; ++l) { | 798 | for (l = 0; l < dirn; ++l) { |
| 799 | if (dir[l].ppid == pid) { | 799 | if (dir[l].ppid == pid) { |
| 800 | dir[l].ppid = 0; | 800 | dir[l].ppid = 0; |
diff --git a/shell/ash.c b/shell/ash.c index a5b19c863..96563bf06 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -3768,7 +3768,7 @@ waitproc(int block, int *status) | |||
| 3768 | #endif | 3768 | #endif |
| 3769 | if (block == 0) | 3769 | if (block == 0) |
| 3770 | flags |= WNOHANG; | 3770 | flags |= WNOHANG; |
| 3771 | return wait3(status, flags, (struct rusage *)NULL); | 3771 | return waitpid(-1, status, flags); // safe_waitpid? |
| 3772 | } | 3772 | } |
| 3773 | 3773 | ||
| 3774 | /* | 3774 | /* |
diff --git a/shell/hush.c b/shell/hush.c index cb2c3e98e..b08fe10b6 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -1649,6 +1649,7 @@ static int checkjobs(struct pipe* fg_pipe) | |||
| 1649 | // + killall -STOP cat | 1649 | // + killall -STOP cat |
| 1650 | 1650 | ||
| 1651 | wait_more: | 1651 | wait_more: |
| 1652 | // TODO: safe_waitpid? | ||
| 1652 | while ((childpid = waitpid(-1, &status, attributes)) > 0) { | 1653 | while ((childpid = waitpid(-1, &status, attributes)) > 0) { |
| 1653 | const int dead = WIFEXITED(status) || WIFSIGNALED(status); | 1654 | const int dead = WIFEXITED(status) || WIFSIGNALED(status); |
| 1654 | 1655 | ||
diff --git a/shell/msh.c b/shell/msh.c index 9edf793ab..9e9b798a1 100644 --- a/shell/msh.c +++ b/shell/msh.c | |||
| @@ -4162,7 +4162,7 @@ static int grave(int quoted) | |||
| 4162 | return 0; | 4162 | return 0; |
| 4163 | } | 4163 | } |
| 4164 | if (i != 0) { | 4164 | if (i != 0) { |
| 4165 | waitpid(i, NULL, 0); | 4165 | waitpid(i, NULL, 0); // safe_waitpid? |
| 4166 | global_env.iop->argp->aword = ++cp; | 4166 | global_env.iop->argp->aword = ++cp; |
| 4167 | close(pf[1]); | 4167 | close(pf[1]); |
| 4168 | PUSHIO(afile, remap(pf[0]), | 4168 | PUSHIO(afile, remap(pf[0]), |
