aboutsummaryrefslogtreecommitdiff
path: root/libbb/vfork_daemon_rexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/vfork_daemon_rexec.c')
-rw-r--r--libbb/vfork_daemon_rexec.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 11dbb24fc..ff2b0bceb 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -61,11 +61,43 @@ pid_t spawn(char **argv)
61pid_t xspawn(char **argv) 61pid_t xspawn(char **argv)
62{ 62{
63 pid_t pid = spawn(argv); 63 pid_t pid = spawn(argv);
64 if (pid < 0) bb_perror_msg_and_die("%s", *argv); 64 if (pid < 0)
65 bb_perror_msg_and_die("%s", *argv);
65 return pid; 66 return pid;
66} 67}
67 68
69// Wait for the specified child PID to exit, returning child's error return.
70int wait4pid(int pid)
71{
72 int status;
73
74 if (pid <= 0) {
75 /*errno = ECHILD; -- wrong. we expect errno to be set from failed exec */
76 return -1;
77 }
78 if (waitpid(pid, &status, 0) == -1)
79 return -1;
80 if (WIFEXITED(status))
81 return WEXITSTATUS(status);
82 if (WIFSIGNALED(status))
83 return WTERMSIG(status) + 10000;
84 return 0;
85}
68 86
87int wait_nohang(int *wstat)
88{
89 return waitpid(-1, wstat, WNOHANG);
90}
91
92int wait_pid(int *wstat, int pid)
93{
94 int r;
95
96 do
97 r = waitpid(pid, wstat, 0);
98 while ((r == -1) && (errno == EINTR));
99 return r;
100}
69 101
70#if 0 //ndef BB_NOMMU 102#if 0 //ndef BB_NOMMU
71// Die with an error message if we can't daemonize. 103// Die with an error message if we can't daemonize.