libbb: introduce and use BB_EXECVP_or_die()
function old new delta BB_EXECVP_or_die - 47 +47 time_main 1042 1043 +1 chrt_main 371 364 -7 ionice_main 292 282 -10 setsid_main 69 56 -13 nohup_main 236 223 -13 cttyhack_main 266 253 -13 chroot_main 94 81 -13 chpst_main 746 733 -13 timeout_main 297 279 -18 taskset_main 541 522 -19 vfork_child 67 45 -22 parse 975 953 -22 lpd_main 770 748 -22 launch_helper 192 170 -22 tcpudpsvd_main 1810 1782 -28 nice_main 190 156 -34 env_main 242 206 -36 run_command 221 174 -47 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/17 up/down: 48/-352) Total: -304 bytes Signed-off-by: Pascal Bellard <pascal.bellard@ads-lu.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
committed by
Denys Vlasenko
parent
7c1b2b5420
commit
21e8e8da64
@@ -76,3 +76,11 @@ int FAST_FUNC bb_execvp(const char *file, char *const argv[])
|
||||
argv);
|
||||
}
|
||||
#endif
|
||||
|
||||
int FAST_FUNC BB_EXECVP_or_die(char **argv)
|
||||
{
|
||||
BB_EXECVP(argv[0], argv);
|
||||
/* SUSv3-mandated exit codes */
|
||||
xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
|
||||
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
|
||||
}
|
||||
|
@@ -67,40 +67,6 @@ pid_t FAST_FUNC xspawn(char **argv)
|
||||
return pid;
|
||||
}
|
||||
|
||||
pid_t FAST_FUNC safe_waitpid(pid_t pid, int *wstat, int options)
|
||||
{
|
||||
pid_t r;
|
||||
|
||||
do
|
||||
r = waitpid(pid, wstat, options);
|
||||
while ((r == -1) && (errno == EINTR));
|
||||
return r;
|
||||
}
|
||||
|
||||
pid_t FAST_FUNC wait_any_nohang(int *wstat)
|
||||
{
|
||||
return safe_waitpid(-1, wstat, WNOHANG);
|
||||
}
|
||||
|
||||
// Wait for the specified child PID to exit, returning child's error return.
|
||||
int FAST_FUNC wait4pid(pid_t pid)
|
||||
{
|
||||
int status;
|
||||
|
||||
if (pid <= 0) {
|
||||
/*errno = ECHILD; -- wrong. */
|
||||
/* we expect errno to be already set from failed [v]fork/exec */
|
||||
return -1;
|
||||
}
|
||||
if (safe_waitpid(pid, &status, 0) == -1)
|
||||
return -1;
|
||||
if (WIFEXITED(status))
|
||||
return WEXITSTATUS(status);
|
||||
if (WIFSIGNALED(status))
|
||||
return WTERMSIG(status) + 0x180;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if ENABLE_FEATURE_PREFER_APPLETS
|
||||
void FAST_FUNC save_nofork_data(struct nofork_save_area *save)
|
||||
{
|
||||
|
@@ -268,3 +268,37 @@ int FAST_FUNC tcsetattr_stdin_TCSANOW(const struct termios *tp)
|
||||
{
|
||||
return tcsetattr(STDIN_FILENO, TCSANOW, tp);
|
||||
}
|
||||
|
||||
pid_t FAST_FUNC safe_waitpid(pid_t pid, int *wstat, int options)
|
||||
{
|
||||
pid_t r;
|
||||
|
||||
do
|
||||
r = waitpid(pid, wstat, options);
|
||||
while ((r == -1) && (errno == EINTR));
|
||||
return r;
|
||||
}
|
||||
|
||||
pid_t FAST_FUNC wait_any_nohang(int *wstat)
|
||||
{
|
||||
return safe_waitpid(-1, wstat, WNOHANG);
|
||||
}
|
||||
|
||||
// Wait for the specified child PID to exit, returning child's error return.
|
||||
int FAST_FUNC wait4pid(pid_t pid)
|
||||
{
|
||||
int status;
|
||||
|
||||
if (pid <= 0) {
|
||||
/*errno = ECHILD; -- wrong. */
|
||||
/* we expect errno to be already set from failed [v]fork/exec */
|
||||
return -1;
|
||||
}
|
||||
if (safe_waitpid(pid, &status, 0) == -1)
|
||||
return -1;
|
||||
if (WIFEXITED(status))
|
||||
return WEXITSTATUS(status);
|
||||
if (WIFSIGNALED(status))
|
||||
return WTERMSIG(status) + 0x180;
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user