wait4pid: if passed with pid < 0, do not set errno - it is already set by exec!
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 11dbb24..ff2b0bc 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -61,11 +61,43 @@
 pid_t xspawn(char **argv)
 {
 	pid_t pid = spawn(argv);
-	if (pid < 0) bb_perror_msg_and_die("%s", *argv);
+	if (pid < 0)
+		bb_perror_msg_and_die("%s", *argv);
 	return pid;
 }
 
+// Wait for the specified child PID to exit, returning child's error return.
+int wait4pid(int pid)
+{
+	int status;
 
+	if (pid <= 0) {
+		/*errno = ECHILD; -- wrong. we expect errno to be set from failed exec */
+		return -1;
+	}
+	if (waitpid(pid, &status, 0) == -1)
+		return -1;
+	if (WIFEXITED(status))
+		return WEXITSTATUS(status);
+	if (WIFSIGNALED(status))
+		return WTERMSIG(status) + 10000;
+	return 0;
+}
+
+int wait_nohang(int *wstat)
+{
+	return waitpid(-1, wstat, WNOHANG);
+}
+
+int wait_pid(int *wstat, int pid)
+{
+	int r;
+
+	do
+		r = waitpid(pid, wstat, 0);
+	while ((r == -1) && (errno == EINTR));
+	return r;
+}
 
 #if 0 //ndef BB_NOMMU
 // Die with an error message if we can't daemonize.
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index c18a1d9..0cf2005 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -193,39 +193,6 @@
 	}
 }
 
-// Wait for the specified child PID to exit, returning child's error return.
-int wait4pid(int pid)
-{
-	int status;
-
-	if (pid <= 0) {
-		errno = ECHILD;
-		return -1;
-	}
-	if (waitpid(pid, &status, 0) == -1)
-		return -1;
-	if (WIFEXITED(status))
-		return WEXITSTATUS(status);
-	if (WIFSIGNALED(status))
-		return WTERMSIG(status) + 10000;
-	return 0;
-}
-
-int wait_nohang(int *wstat)
-{
-	return waitpid(-1, wstat, WNOHANG);
-}
-
-int wait_pid(int *wstat, int pid)
-{
-	int r;
-
-	do
-		r = waitpid(pid, wstat, 0);
-	while ((r == -1) && (errno == EINTR));
-	return r;
-}
-
 void sig_block(int sig)
 {
 	sigset_t ss;