diff options
Diffstat (limited to 'libbb/xfuncs.c')
-rw-r--r-- | libbb/xfuncs.c | 34 |
1 files changed, 34 insertions, 0 deletions
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 | } | ||