aboutsummaryrefslogtreecommitdiff
path: root/libbb
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 /libbb
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>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/execable.c8
-rw-r--r--libbb/vfork_daemon_rexec.c34
-rw-r--r--libbb/xfuncs.c34
3 files changed, 42 insertions, 34 deletions
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}