aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Bellard <pascal.bellard@ads-lu.com>2010-07-04 00:57:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-07-04 00:57:03 +0200
commit21e8e8da6483c80a6054b06e48341968a7dccdd5 (patch)
tree9980dc076107930f9706733c7cbedcf0e4099877
parent7c1b2b5420d4208864b8bc6e07e90792aed94981 (diff)
downloadbusybox-w32-21e8e8da6483c80a6054b06e48341968a7dccdd5.tar.gz
busybox-w32-21e8e8da6483c80a6054b06e48341968a7dccdd5.tar.bz2
busybox-w32-21e8e8da6483c80a6054b06e48341968a7dccdd5.zip
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>
-rw-r--r--console-tools/openvt.c3
-rw-r--r--coreutils/chroot.c3
-rw-r--r--coreutils/env.c5
-rw-r--r--coreutils/nice.c5
-rw-r--r--coreutils/nohup.c3
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/execable.c8
-rw-r--r--libbb/vfork_daemon_rexec.c34
-rw-r--r--libbb/xfuncs.c34
-rw-r--r--mailutils/mail.c3
-rw-r--r--mailutils/mime.c3
-rw-r--r--miscutils/chrt.c3
-rw-r--r--miscutils/ionice.c3
-rw-r--r--miscutils/setsid.c3
-rw-r--r--miscutils/taskset.c3
-rw-r--r--miscutils/time.c15
-rw-r--r--miscutils/timeout.c3
-rw-r--r--networking/ifupdown.c3
-rw-r--r--networking/tcpudp.c4
-rw-r--r--printutils/lpd.c3
-rw-r--r--runit/chpst.c3
-rw-r--r--shell/cttyhack.c3
22 files changed, 67 insertions, 81 deletions
diff --git a/console-tools/openvt.c b/console-tools/openvt.c
index 6f58916e7..e3ea71bc5 100644
--- a/console-tools/openvt.c
+++ b/console-tools/openvt.c
@@ -97,8 +97,7 @@ static NOINLINE void vfork_child(char **argv)
97 //bb_error_msg("our pgrp %d", getpgrp()); 97 //bb_error_msg("our pgrp %d", getpgrp());
98 //bb_error_msg("VT's sid %d", tcgetsid(0)); 98 //bb_error_msg("VT's sid %d", tcgetsid(0));
99 //bb_error_msg("VT's pgrp %d", tcgetpgrp(0)); 99 //bb_error_msg("VT's pgrp %d", tcgetpgrp(0));
100 BB_EXECVP(argv[0], argv); 100 BB_EXECVP_or_die(argv);
101 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
102 } 101 }
103} 102}
104 103
diff --git a/coreutils/chroot.c b/coreutils/chroot.c
index bc0b1f82c..046c2fabf 100644
--- a/coreutils/chroot.c
+++ b/coreutils/chroot.c
@@ -30,6 +30,5 @@ int chroot_main(int argc UNUSED_PARAM, char **argv)
30 argv[1] = (char *) "-i"; 30 argv[1] = (char *) "-i";
31 } 31 }
32 32
33 BB_EXECVP(argv[0], argv); 33 BB_EXECVP_or_die(argv);
34 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
35} 34}
diff --git a/coreutils/env.c b/coreutils/env.c
index c6ba04d35..d4eab191b 100644
--- a/coreutils/env.c
+++ b/coreutils/env.c
@@ -77,10 +77,7 @@ int env_main(int argc UNUSED_PARAM, char **argv)
77 } 77 }
78 78
79 if (argv[0]) { 79 if (argv[0]) {
80 BB_EXECVP(argv[0], argv); 80 BB_EXECVP_or_die(argv);
81 /* SUSv3-mandated exit codes. */
82 xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
83 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
84 } 81 }
85 82
86 if (environ) { /* clearenv() may set environ == NULL! */ 83 if (environ) { /* clearenv() may set environ == NULL! */
diff --git a/coreutils/nice.c b/coreutils/nice.c
index 0f70f1079..ff3eb1140 100644
--- a/coreutils/nice.c
+++ b/coreutils/nice.c
@@ -47,8 +47,5 @@ int nice_main(int argc, char **argv)
47 } 47 }
48 } 48 }
49 49
50 BB_EXECVP(argv[0], argv); 50 BB_EXECVP_or_die(argv);
51 /* The exec failed... */
52 xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
53 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
54} 51}
diff --git a/coreutils/nohup.c b/coreutils/nohup.c
index 1027ada1c..3dc531409 100644
--- a/coreutils/nohup.c
+++ b/coreutils/nohup.c
@@ -76,6 +76,5 @@ int nohup_main(int argc UNUSED_PARAM, char **argv)
76 signal(SIGHUP, SIG_IGN); 76 signal(SIGHUP, SIG_IGN);
77 77
78 argv++; 78 argv++;
79 BB_EXECVP(argv[0], argv); 79 BB_EXECVP_or_die(argv);
80 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
81} 80}
diff --git a/include/libbb.h b/include/libbb.h
index e26001705..4b6699f2f 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -839,6 +839,7 @@ int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
839#define BB_EXECVP(prog,cmd) execvp(prog,cmd) 839#define BB_EXECVP(prog,cmd) execvp(prog,cmd)
840#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__) 840#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
841#endif 841#endif
842int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC;
842 843
843/* NOMMU friendy fork+exec: */ 844/* NOMMU friendy fork+exec: */
844pid_t spawn(char **argv) FAST_FUNC; 845pid_t spawn(char **argv) FAST_FUNC;
diff --git a/libbb/execable.c b/libbb/execable.c
index 5c7ac16a2..82241cd81 100644
--- a/libbb/execable.c
+++ b/libbb/execable.c
@@ -76,3 +76,11 @@ int FAST_FUNC bb_execvp(const char *file, char *const argv[])
76 argv); 76 argv);
77} 77}
78#endif 78#endif
79
80int FAST_FUNC BB_EXECVP_or_die(char **argv)
81{
82 BB_EXECVP(argv[0], argv);
83 /* SUSv3-mandated exit codes */
84 xfunc_error_retval = (errno == ENOENT) ? 127 : 126;
85 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
86}
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index 082f0f63e..8102ea2dc 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -67,40 +67,6 @@ pid_t FAST_FUNC xspawn(char **argv)
67 return pid; 67 return pid;
68} 68}
69 69
70pid_t FAST_FUNC safe_waitpid(pid_t pid, int *wstat, int options)
71{
72 pid_t r;
73
74 do
75 r = waitpid(pid, wstat, options);
76 while ((r == -1) && (errno == EINTR));
77 return r;
78}
79
80pid_t FAST_FUNC wait_any_nohang(int *wstat)
81{
82 return safe_waitpid(-1, wstat, WNOHANG);
83}
84
85// Wait for the specified child PID to exit, returning child's error return.
86int FAST_FUNC wait4pid(pid_t pid)
87{
88 int status;
89
90 if (pid <= 0) {
91 /*errno = ECHILD; -- wrong. */
92 /* we expect errno to be already set from failed [v]fork/exec */
93 return -1;
94 }
95 if (safe_waitpid(pid, &status, 0) == -1)
96 return -1;
97 if (WIFEXITED(status))
98 return WEXITSTATUS(status);
99 if (WIFSIGNALED(status))
100 return WTERMSIG(status) + 0x180;
101 return 0;
102}
103
104#if ENABLE_FEATURE_PREFER_APPLETS 70#if ENABLE_FEATURE_PREFER_APPLETS
105void FAST_FUNC save_nofork_data(struct nofork_save_area *save) 71void FAST_FUNC save_nofork_data(struct nofork_save_area *save)
106{ 72{
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index 65437211d..275dd4b62 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -268,3 +268,37 @@ int FAST_FUNC tcsetattr_stdin_TCSANOW(const struct termios *tp)
268{ 268{
269 return tcsetattr(STDIN_FILENO, TCSANOW, tp); 269 return tcsetattr(STDIN_FILENO, TCSANOW, tp);
270} 270}
271
272pid_t FAST_FUNC safe_waitpid(pid_t pid, int *wstat, int options)
273{
274 pid_t r;
275
276 do
277 r = waitpid(pid, wstat, options);
278 while ((r == -1) && (errno == EINTR));
279 return r;
280}
281
282pid_t FAST_FUNC wait_any_nohang(int *wstat)
283{
284 return safe_waitpid(-1, wstat, WNOHANG);
285}
286
287// Wait for the specified child PID to exit, returning child's error return.
288int FAST_FUNC wait4pid(pid_t pid)
289{
290 int status;
291
292 if (pid <= 0) {
293 /*errno = ECHILD; -- wrong. */
294 /* we expect errno to be already set from failed [v]fork/exec */
295 return -1;
296 }
297 if (safe_waitpid(pid, &status, 0) == -1)
298 return -1;
299 if (WIFEXITED(status))
300 return WEXITSTATUS(status);
301 if (WIFSIGNALED(status))
302 return WTERMSIG(status) + 0x180;
303 return 0;
304}
diff --git a/mailutils/mail.c b/mailutils/mail.c
index 49e72c32b..5eb99e13d 100644
--- a/mailutils/mail.c
+++ b/mailutils/mail.c
@@ -67,8 +67,7 @@ void FAST_FUNC launch_helper(const char **argv)
67 if (!G.helper_pid) { 67 if (!G.helper_pid) {
68 // child: try to execute connection helper 68 // child: try to execute connection helper
69 // NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec 69 // NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec
70 BB_EXECVP(argv[0], (char **)argv); 70 BB_EXECVP_or_die((char**)argv);
71 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
72 } 71 }
73 72
74 // parent 73 // parent
diff --git a/mailutils/mime.c b/mailutils/mime.c
index 654b8731c..5eb8ef6f2 100644
--- a/mailutils/mime.c
+++ b/mailutils/mime.c
@@ -288,8 +288,7 @@ static int parse(const char *boundary, char **argv)
288 xsetenv("CHARSET", charset); 288 xsetenv("CHARSET", charset);
289 xsetenv("ENCODING", encoding); 289 xsetenv("ENCODING", encoding);
290 xsetenv("FILENAME", filename); 290 xsetenv("FILENAME", filename);
291 BB_EXECVP(argv[0], argv); 291 BB_EXECVP_or_die(argv);
292 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
293 } 292 }
294 // parent dumps to fd[1] 293 // parent dumps to fd[1]
295 close(fd[0]); 294 close(fd[0]);
diff --git a/miscutils/chrt.c b/miscutils/chrt.c
index 3d0da58ca..d5f87c4d7 100644
--- a/miscutils/chrt.c
+++ b/miscutils/chrt.c
@@ -120,6 +120,5 @@ int chrt_main(int argc UNUSED_PARAM, char **argv)
120 if (!argv[0]) /* "-p <priority> <pid> [...]" */ 120 if (!argv[0]) /* "-p <priority> <pid> [...]" */
121 goto print_rt_info; 121 goto print_rt_info;
122 122
123 BB_EXECVP(argv[0], argv); 123 BB_EXECVP_or_die(argv);
124 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
125} 124}
diff --git a/miscutils/ionice.c b/miscutils/ionice.c
index 8393cd8b2..52e51b908 100644
--- a/miscutils/ionice.c
+++ b/miscutils/ionice.c
@@ -90,8 +90,7 @@ int ionice_main(int argc UNUSED_PARAM, char **argv)
90 if (ioprio_set(IOPRIO_WHO_PROCESS, pid, pri) == -1) 90 if (ioprio_set(IOPRIO_WHO_PROCESS, pid, pri) == -1)
91 bb_perror_msg_and_die("ioprio_%cet", 's'); 91 bb_perror_msg_and_die("ioprio_%cet", 's');
92 if (argv[0]) { 92 if (argv[0]) {
93 BB_EXECVP(argv[0], argv); 93 BB_EXECVP_or_die(argv);
94 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
95 } 94 }
96 } 95 }
97 96
diff --git a/miscutils/setsid.c b/miscutils/setsid.c
index 60ee062e3..c573fae34 100644
--- a/miscutils/setsid.c
+++ b/miscutils/setsid.c
@@ -45,6 +45,5 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
45 } 45 }
46 46
47 argv++; 47 argv++;
48 BB_EXECVP(argv[0], argv); 48 BB_EXECVP_or_die(argv);
49 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
50} 49}
diff --git a/miscutils/taskset.c b/miscutils/taskset.c
index 2891003df..08198d5d4 100644
--- a/miscutils/taskset.c
+++ b/miscutils/taskset.c
@@ -132,6 +132,5 @@ int taskset_main(int argc UNUSED_PARAM, char **argv)
132 if (!argv[0]) /* "-p <aff> <pid> [...ignored...]" */ 132 if (!argv[0]) /* "-p <aff> <pid> [...ignored...]" */
133 goto print_aff; /* print new affinity and exit */ 133 goto print_aff; /* print new affinity and exit */
134 134
135 BB_EXECVP(argv[0], argv); 135 BB_EXECVP_or_die(argv);
136 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
137} 136}
diff --git a/miscutils/time.c b/miscutils/time.c
index f5d1e15fb..5cfbcef8e 100644
--- a/miscutils/time.c
+++ b/miscutils/time.c
@@ -367,20 +367,17 @@ static void summarize(const char *fmt, char **command, resource_t *resp)
367 Put the statistics in *RESP. */ 367 Put the statistics in *RESP. */
368static void run_command(char *const *cmd, resource_t *resp) 368static void run_command(char *const *cmd, resource_t *resp)
369{ 369{
370 pid_t pid; /* Pid of child. */ 370 pid_t pid;
371 void (*interrupt_signal)(int); 371 void (*interrupt_signal)(int);
372 void (*quit_signal)(int); 372 void (*quit_signal)(int);
373 373
374 resp->elapsed_ms = monotonic_ms(); 374 resp->elapsed_ms = monotonic_ms();
375 pid = vfork(); /* Run CMD as child process. */ 375 pid = vfork();
376 if (pid < 0) 376 if (pid < 0)
377 bb_perror_msg_and_die("fork"); 377 bb_perror_msg_and_die("vfork");
378 if (pid == 0) { /* If child. */ 378 if (pid == 0) {
379 /* Don't cast execvp arguments; that causes errors on some systems, 379 /* Child */
380 versus merely warnings if the cast is left off. */ 380 BB_EXECVP_or_die((char**)cmd);
381 BB_EXECVP(cmd[0], cmd);
382 xfunc_error_retval = (errno == ENOENT ? 127 : 126);
383 bb_perror_msg_and_die("can't execute '%s'", cmd[0]);
384 } 381 }
385 382
386 /* Have signals kill the child but not self (if possible). */ 383 /* Have signals kill the child but not self (if possible). */
diff --git a/miscutils/timeout.c b/miscutils/timeout.c
index 273d26953..f6e655acc 100644
--- a/miscutils/timeout.c
+++ b/miscutils/timeout.c
@@ -110,6 +110,5 @@ int timeout_main(int argc UNUSED_PARAM, char **argv)
110 argv[0] = sv1; 110 argv[0] = sv1;
111 argv[1] = sv2; 111 argv[1] = sv2;
112#endif 112#endif
113 BB_EXECVP(argv[0], argv); 113 BB_EXECVP_or_die(argv);
114 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
115} 114}
diff --git a/networking/ifupdown.c b/networking/ifupdown.c
index 714d2a107..1bab2c5cb 100644
--- a/networking/ifupdown.c
+++ b/networking/ifupdown.c
@@ -1052,8 +1052,7 @@ static int popen2(FILE **in, FILE **out, char *command, char *param)
1052 close(outfd.rd); 1052 close(outfd.rd);
1053 xmove_fd(infd.rd, 0); 1053 xmove_fd(infd.rd, 0);
1054 xmove_fd(outfd.wr, 1); 1054 xmove_fd(outfd.wr, 1);
1055 BB_EXECVP(command, argv); 1055 BB_EXECVP_or_die(argv);
1056 bb_perror_msg_and_die("can't execute '%s'", command);
1057 } 1056 }
1058 /* parent */ 1057 /* parent */
1059 close(infd.rd); 1058 close(infd.rd);
diff --git a/networking/tcpudp.c b/networking/tcpudp.c
index 4e4756738..53e622b56 100644
--- a/networking/tcpudp.c
+++ b/networking/tcpudp.c
@@ -501,10 +501,10 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
501#ifdef SSLSVD 501#ifdef SSLSVD
502 strcpy(id, utoa(pid)); 502 strcpy(id, utoa(pid));
503 ssl_io(0, argv); 503 ssl_io(0, argv);
504 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
504#else 505#else
505 BB_EXECVP(argv[0], argv); 506 BB_EXECVP_or_die(argv);
506#endif 507#endif
507 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
508} 508}
509 509
510/* 510/*
diff --git a/printutils/lpd.c b/printutils/lpd.c
index 15f1ba20b..d91491f1b 100644
--- a/printutils/lpd.c
+++ b/printutils/lpd.c
@@ -181,8 +181,7 @@ int lpd_main(int argc UNUSED_PARAM, char *argv[])
181 // this call reopens stdio fds to "/dev/null" 181 // this call reopens stdio fds to "/dev/null"
182 // (no daemonization is done) 182 // (no daemonization is done)
183 bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL); 183 bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL);
184 BB_EXECVP(argv[0], argv); 184 BB_EXECVP_or_die(argv);
185 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
186 } 185 }
187 186
188 // validate input. 187 // validate input.
diff --git a/runit/chpst.c b/runit/chpst.c
index 028a28d6c..ad0811294 100644
--- a/runit/chpst.c
+++ b/runit/chpst.c
@@ -382,6 +382,5 @@ int chpst_main(int argc UNUSED_PARAM, char **argv)
382 if (opt & OPT_2) 382 if (opt & OPT_2)
383 close(STDERR_FILENO); 383 close(STDERR_FILENO);
384 384
385 BB_EXECVP(argv[0], argv); 385 BB_EXECVP_or_die(argv);
386 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
387} 386}
diff --git a/shell/cttyhack.c b/shell/cttyhack.c
index bde2acdc9..67736ad62 100644
--- a/shell/cttyhack.c
+++ b/shell/cttyhack.c
@@ -81,6 +81,5 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
81 } 81 }
82 } 82 }
83 83
84 BB_EXECVP(argv[0], argv); 84 BB_EXECVP_or_die(argv);
85 bb_perror_msg_and_die("can't execute '%s'", argv[0]);
86} 85}