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

diff --git a/init/init.c b/init/init.c
index 51125f3..68a59d8 100644
--- a/init/init.c
+++ b/init/init.c
@@ -95,9 +95,14 @@
 
 /* Function prototypes */
 static void delete_init_action(struct init_action *a);
-static int waitfor(pid_t pid);
 static void halt_reboot_pwoff(int sig) ATTRIBUTE_NORETURN;
 
+/* TODO: move to libbb? */
+static int waitfor(pid_t runpid)
+{
+	return safe_waitpid(runpid, NULL, 0);
+}
+
 static void loop_forever(void) ATTRIBUTE_NORETURN;
 static void loop_forever(void)
 {
@@ -465,19 +470,6 @@
 	_exit(-1);
 }
 
-static int waitfor(pid_t runpid)
-{
-	int status, wpid;
-
-	while (1) {
-		wpid = waitpid(runpid, &status, 0);
-		if (wpid == -1 && errno == EINTR)
-			continue;
-		break;
-	}
-	return wpid;
-}
-
 /* Run all commands of a particular type */
 static void run_actions(int action)
 {
@@ -520,7 +512,7 @@
 		reboot(magic);
 		_exit(0);
 	}
-	waitpid(pid, NULL, 0);
+	waitfor(pid);
 }
 
 static void kill_all_processes(void)
@@ -980,7 +972,7 @@
 		/* Don't consume all CPU time -- sleep a bit */
 		sleep(1);
 
-		/* Wait for a child process to exit */
+		/* Wait for any child process to exit */
 		wpid = wait(NULL);
 		while (wpid > 0) {
 			/* Find out who died and clean up their corpse */
@@ -995,7 +987,7 @@
 				}
 			}
 			/* see if anyone else is waiting to be reaped */
-			wpid = waitpid(-1, NULL, WNOHANG);
+			wpid = wait_any_nohang(NULL);
 		}
 	}
 }