diff options
author | Pascal Bellard <pascal.bellard@ads-lu.com> | 2010-07-04 00:57:03 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-04 00:57:03 +0200 |
commit | 21e8e8da6483c80a6054b06e48341968a7dccdd5 (patch) | |
tree | 9980dc076107930f9706733c7cbedcf0e4099877 /libbb | |
parent | 7c1b2b5420d4208864b8bc6e07e90792aed94981 (diff) | |
download | busybox-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.c | 8 | ||||
-rw-r--r-- | libbb/vfork_daemon_rexec.c | 34 | ||||
-rw-r--r-- | libbb/xfuncs.c | 34 |
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 | |||
80 | int 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 | ||
70 | pid_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 | |||
80 | pid_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. | ||
86 | int 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 |
105 | void FAST_FUNC save_nofork_data(struct nofork_save_area *save) | 71 | void 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 | |||
272 | pid_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 | |||
282 | pid_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. | ||
288 | int 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 | } | ||