wait4pid: if passed with pid < 0, do not set errno - it is already set by exec!
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 9 Apr 2007 13:21:33 +0000 (13:21 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 9 Apr 2007 13:21:33 +0000 (13:21 -0000)
libbb/vfork_daemon_rexec.c
libbb/xfuncs.c

index 11dbb24fc0fb0f79cf25f622fad230a4aaed7665..ff2b0bcebc300aa1ec5421da6ca481216f119024 100644 (file)
@@ -61,11 +61,43 @@ pid_t spawn(char **argv)
 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.
index c18a1d9986ec5739fd56a3f272df5b64085003b5..0cf2005acd6c45d05310ad90588c3f92d5107c7d 100644 (file)
@@ -193,39 +193,6 @@ void xfflush_stdout(void)
        }
 }
 
-// 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;