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:
Pascal Bellard 2010-07-04 00:57:03 +02:00 committed by Denys Vlasenko
parent 7c1b2b5420
commit 21e8e8da64
22 changed files with 68 additions and 82 deletions

View File

@ -97,8 +97,7 @@ static NOINLINE void vfork_child(char **argv)
//bb_error_msg("our pgrp %d", getpgrp()); //bb_error_msg("our pgrp %d", getpgrp());
//bb_error_msg("VT's sid %d", tcgetsid(0)); //bb_error_msg("VT's sid %d", tcgetsid(0));
//bb_error_msg("VT's pgrp %d", tcgetpgrp(0)); //bb_error_msg("VT's pgrp %d", tcgetpgrp(0));
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }
} }

View File

@ -30,6 +30,5 @@ int chroot_main(int argc UNUSED_PARAM, char **argv)
argv[1] = (char *) "-i"; argv[1] = (char *) "-i";
} }
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -77,10 +77,7 @@ int env_main(int argc UNUSED_PARAM, char **argv)
} }
if (argv[0]) { if (argv[0]) {
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
/* SUSv3-mandated exit codes. */
xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }
if (environ) { /* clearenv() may set environ == NULL! */ if (environ) { /* clearenv() may set environ == NULL! */

View File

@ -47,8 +47,5 @@ int nice_main(int argc, char **argv)
} }
} }
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
/* The exec failed... */
xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -76,6 +76,5 @@ int nohup_main(int argc UNUSED_PARAM, char **argv)
signal(SIGHUP, SIG_IGN); signal(SIGHUP, SIG_IGN);
argv++; argv++;
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -839,6 +839,7 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
#define BB_EXECVP(prog,cmd) execvp(prog,cmd) #define BB_EXECVP(prog,cmd) execvp(prog,cmd)
#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__) #define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
#endif #endif
int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC;
/* NOMMU friendy fork+exec: */ /* NOMMU friendy fork+exec: */
pid_t spawn(char **argv) FAST_FUNC; pid_t spawn(char **argv) FAST_FUNC;

View File

@ -76,3 +76,11 @@ int FAST_FUNC bb_execvp(const char *file, char *const argv[])
argv); argv);
} }
#endif #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]);
}

View File

@ -67,40 +67,6 @@ pid_t FAST_FUNC xspawn(char **argv)
return pid; 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 #if ENABLE_FEATURE_PREFER_APPLETS
void FAST_FUNC save_nofork_data(struct nofork_save_area *save) void FAST_FUNC save_nofork_data(struct nofork_save_area *save)
{ {

View File

@ -268,3 +268,37 @@ int FAST_FUNC tcsetattr_stdin_TCSANOW(const struct termios *tp)
{ {
return tcsetattr(STDIN_FILENO, TCSANOW, 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;
}

View File

@ -67,8 +67,7 @@ void FAST_FUNC launch_helper(const char **argv)
if (!G.helper_pid) { if (!G.helper_pid) {
// child: try to execute connection helper // child: try to execute connection helper
// NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec // NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec
BB_EXECVP(argv[0], (char **)argv); BB_EXECVP_or_die((char**)argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }
// parent // parent

View File

@ -288,8 +288,7 @@ static int parse(const char *boundary, char **argv)
xsetenv("CHARSET", charset); xsetenv("CHARSET", charset);
xsetenv("ENCODING", encoding); xsetenv("ENCODING", encoding);
xsetenv("FILENAME", filename); xsetenv("FILENAME", filename);
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }
// parent dumps to fd[1] // parent dumps to fd[1]
close(fd[0]); close(fd[0]);

View File

@ -120,6 +120,5 @@ int chrt_main(int argc UNUSED_PARAM, char **argv)
if (!argv[0]) /* "-p <priority> <pid> [...]" */ if (!argv[0]) /* "-p <priority> <pid> [...]" */
goto print_rt_info; goto print_rt_info;
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -90,8 +90,7 @@ int ionice_main(int argc UNUSED_PARAM, char **argv)
if (ioprio_set(IOPRIO_WHO_PROCESS, pid, pri) == -1) if (ioprio_set(IOPRIO_WHO_PROCESS, pid, pri) == -1)
bb_perror_msg_and_die("ioprio_%cet", 's'); bb_perror_msg_and_die("ioprio_%cet", 's');
if (argv[0]) { if (argv[0]) {
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }
} }

View File

@ -45,6 +45,5 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
} }
argv++; argv++;
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -132,6 +132,5 @@ int taskset_main(int argc UNUSED_PARAM, char **argv)
if (!argv[0]) /* "-p <aff> <pid> [...ignored...]" */ if (!argv[0]) /* "-p <aff> <pid> [...ignored...]" */
goto print_aff; /* print new affinity and exit */ goto print_aff; /* print new affinity and exit */
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -367,20 +367,17 @@ static void summarize(const char *fmt, char **command, resource_t *resp)
Put the statistics in *RESP. */ Put the statistics in *RESP. */
static void run_command(char *const *cmd, resource_t *resp) static void run_command(char *const *cmd, resource_t *resp)
{ {
pid_t pid; /* Pid of child. */ pid_t pid;
void (*interrupt_signal)(int); void (*interrupt_signal)(int);
void (*quit_signal)(int); void (*quit_signal)(int);
resp->elapsed_ms = monotonic_ms(); resp->elapsed_ms = monotonic_ms();
pid = vfork(); /* Run CMD as child process. */ pid = vfork();
if (pid < 0) if (pid < 0)
bb_perror_msg_and_die("fork"); bb_perror_msg_and_die("vfork");
if (pid == 0) { /* If child. */ if (pid == 0) {
/* Don't cast execvp arguments; that causes errors on some systems, /* Child */
versus merely warnings if the cast is left off. */ BB_EXECVP_or_die((char**)cmd);
BB_EXECVP(cmd[0], cmd);
xfunc_error_retval = (errno == ENOENT ? 127 : 126);
bb_perror_msg_and_die("can't execute '%s'", cmd[0]);
} }
/* Have signals kill the child but not self (if possible). */ /* Have signals kill the child but not self (if possible). */

View File

@ -110,6 +110,5 @@ int timeout_main(int argc UNUSED_PARAM, char **argv)
argv[0] = sv1; argv[0] = sv1;
argv[1] = sv2; argv[1] = sv2;
#endif #endif
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -1052,8 +1052,7 @@ static int popen2(FILE **in, FILE **out, char *command, char *param)
close(outfd.rd); close(outfd.rd);
xmove_fd(infd.rd, 0); xmove_fd(infd.rd, 0);
xmove_fd(outfd.wr, 1); xmove_fd(outfd.wr, 1);
BB_EXECVP(command, argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", command);
} }
/* parent */ /* parent */
close(infd.rd); close(infd.rd);

View File

@ -501,10 +501,10 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
#ifdef SSLSVD #ifdef SSLSVD
strcpy(id, utoa(pid)); strcpy(id, utoa(pid));
ssl_io(0, argv); ssl_io(0, argv);
#else
BB_EXECVP(argv[0], argv);
#endif
bb_perror_msg_and_die("can't execute '%s'", argv[0]); bb_perror_msg_and_die("can't execute '%s'", argv[0]);
#else
BB_EXECVP_or_die(argv);
#endif
} }
/* /*

View File

@ -181,8 +181,7 @@ int lpd_main(int argc UNUSED_PARAM, char *argv[])
// this call reopens stdio fds to "/dev/null" // this call reopens stdio fds to "/dev/null"
// (no daemonization is done) // (no daemonization is done)
bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL); bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL);
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }
// validate input. // validate input.

View File

@ -382,6 +382,5 @@ int chpst_main(int argc UNUSED_PARAM, char **argv)
if (opt & OPT_2) if (opt & OPT_2)
close(STDERR_FILENO); close(STDERR_FILENO);
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }

View File

@ -81,6 +81,5 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
} }
} }
BB_EXECVP(argv[0], argv); BB_EXECVP_or_die(argv);
bb_perror_msg_and_die("can't execute '%s'", argv[0]);
} }