wait4pid: if passed with pid < 0, do not set errno - it is already set by exec!
This commit is contained in:
parent
7e754f12d3
commit
53d445aa75
@ -61,11 +61,43 @@ pid_t spawn(char **argv)
|
|||||||
pid_t xspawn(char **argv)
|
pid_t xspawn(char **argv)
|
||||||
{
|
{
|
||||||
pid_t pid = spawn(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;
|
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
|
#if 0 //ndef BB_NOMMU
|
||||||
// Die with an error message if we can't daemonize.
|
// Die with an error message if we can't daemonize.
|
||||||
|
@ -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)
|
void sig_block(int sig)
|
||||||
{
|
{
|
||||||
sigset_t ss;
|
sigset_t ss;
|
||||||
|
Loading…
Reference in New Issue
Block a user