diff options
author | Denys Vlasenko | 2016-11-08 00:59:29 +0100 |
---|---|---|
committer | Denys Vlasenko | 2016-11-08 00:59:29 +0100 |
commit | 02affb4afd4a71b0c1ca6286f9b0f6bf3b10e0a1 (patch) | |
tree | 8588590d1bc78e3d8117816eb6dfeed882166814 /shell/hush.c | |
parent | 26ad94bedcc6a4aa3feb07ea032709bcd517ee46 (diff) | |
download | busybox-02affb4afd4a71b0c1ca6286f9b0f6bf3b10e0a1.zip busybox-02affb4afd4a71b0c1ca6286f9b0f6bf3b10e0a1.tar.gz |
hush: rework "wait %jobspec" to work in non-interactive shells too
Also add tests. wait5.tests so far fails (but works for ash and dash).
function old new delta
builtin_wait 305 283 -22
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/shell/hush.c b/shell/hush.c index 7683a37..ddbf2f7 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -9586,7 +9586,6 @@ static int FAST_FUNC builtin_wait(char **argv) { int ret; int status; - struct pipe *wait_pipe = NULL; argv = skip_dash_dash(argv); if (argv[0] == NULL) { @@ -9614,10 +9613,13 @@ static int FAST_FUNC builtin_wait(char **argv) if (errno || pid <= 0) { #if ENABLE_HUSH_JOB if (argv[0][0] == '%') { + struct pipe *wait_pipe; wait_pipe = parse_jobspec(*argv); if (wait_pipe) { - pid = - wait_pipe->pgrp; - goto do_wait; + ret = job_exited_or_stopped(wait_pipe); + if (ret < 0) + ret = wait_for_child_or_signal(wait_pipe, 0); + continue; } } #endif @@ -9626,7 +9628,7 @@ static int FAST_FUNC builtin_wait(char **argv) ret = EXIT_FAILURE; continue; /* bash checks all argv[] */ } - IF_HUSH_JOB(do_wait:) + /* Do we have such child? */ ret = waitpid(pid, &status, WNOHANG); if (ret < 0) { @@ -9652,20 +9654,13 @@ static int FAST_FUNC builtin_wait(char **argv) } if (ret == 0) { /* Yes, and it still runs */ - ret = wait_for_child_or_signal(wait_pipe, wait_pipe ? 0 : pid); + ret = wait_for_child_or_signal(NULL, pid); } else { /* Yes, and it just exited */ - process_wait_result(NULL, ret, status); + process_wait_result(NULL, pid, status); ret = WEXITSTATUS(status); if (WIFSIGNALED(status)) ret = 128 + WTERMSIG(status); -#if ENABLE_HUSH_JOB - if (wait_pipe) { - ret = job_exited_or_stopped(wait_pipe); - if (ret < 0) - goto do_wait; - } -#endif } } while (*++argv); |