From 02affb4afd4a71b0c1ca6286f9b0f6bf3b10e0a1 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Nov 2016 00:59:29 +0100 Subject: [PATCH] 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 --- shell/ash_test/ash-misc/wait4.right | 1 + shell/ash_test/ash-misc/wait4.tests | 2 ++ shell/ash_test/ash-misc/wait5.right | 2 ++ shell/ash_test/ash-misc/wait5.tests | 5 +++++ shell/hush.c | 21 ++++++++------------- shell/hush_test/hush-misc/wait4.right | 1 + shell/hush_test/hush-misc/wait4.tests | 2 ++ shell/hush_test/hush-misc/wait5.right | 2 ++ shell/hush_test/hush-misc/wait5.tests | 5 +++++ 9 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 shell/ash_test/ash-misc/wait4.right create mode 100755 shell/ash_test/ash-misc/wait4.tests create mode 100644 shell/ash_test/ash-misc/wait5.right create mode 100755 shell/ash_test/ash-misc/wait5.tests create mode 100644 shell/hush_test/hush-misc/wait4.right create mode 100755 shell/hush_test/hush-misc/wait4.tests create mode 100644 shell/hush_test/hush-misc/wait5.right create mode 100755 shell/hush_test/hush-misc/wait5.tests diff --git a/shell/ash_test/ash-misc/wait4.right b/shell/ash_test/ash-misc/wait4.right new file mode 100644 index 000000000..f7987db32 --- /dev/null +++ b/shell/ash_test/ash-misc/wait4.right @@ -0,0 +1 @@ +Three:3 diff --git a/shell/ash_test/ash-misc/wait4.tests b/shell/ash_test/ash-misc/wait4.tests new file mode 100755 index 000000000..cc34059ac --- /dev/null +++ b/shell/ash_test/ash-misc/wait4.tests @@ -0,0 +1,2 @@ +sleep 1 | (sleep 1;exit 3) & wait %1 +echo Three:$? diff --git a/shell/ash_test/ash-misc/wait5.right b/shell/ash_test/ash-misc/wait5.right new file mode 100644 index 000000000..82c9d5696 --- /dev/null +++ b/shell/ash_test/ash-misc/wait5.right @@ -0,0 +1,2 @@ +Zero:0 +Three:3 diff --git a/shell/ash_test/ash-misc/wait5.tests b/shell/ash_test/ash-misc/wait5.tests new file mode 100755 index 000000000..1b4762d89 --- /dev/null +++ b/shell/ash_test/ash-misc/wait5.tests @@ -0,0 +1,5 @@ +sleep 0 | (sleep 0;exit 3) & +sleep 1 +echo Zero:$? +wait %1 +echo Three:$? diff --git a/shell/hush.c b/shell/hush.c index 7683a3749..ddbf2f7d8 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); diff --git a/shell/hush_test/hush-misc/wait4.right b/shell/hush_test/hush-misc/wait4.right new file mode 100644 index 000000000..f7987db32 --- /dev/null +++ b/shell/hush_test/hush-misc/wait4.right @@ -0,0 +1 @@ +Three:3 diff --git a/shell/hush_test/hush-misc/wait4.tests b/shell/hush_test/hush-misc/wait4.tests new file mode 100755 index 000000000..cc34059ac --- /dev/null +++ b/shell/hush_test/hush-misc/wait4.tests @@ -0,0 +1,2 @@ +sleep 1 | (sleep 1;exit 3) & wait %1 +echo Three:$? diff --git a/shell/hush_test/hush-misc/wait5.right b/shell/hush_test/hush-misc/wait5.right new file mode 100644 index 000000000..82c9d5696 --- /dev/null +++ b/shell/hush_test/hush-misc/wait5.right @@ -0,0 +1,2 @@ +Zero:0 +Three:3 diff --git a/shell/hush_test/hush-misc/wait5.tests b/shell/hush_test/hush-misc/wait5.tests new file mode 100755 index 000000000..1b4762d89 --- /dev/null +++ b/shell/hush_test/hush-misc/wait5.tests @@ -0,0 +1,5 @@ +sleep 0 | (sleep 0;exit 3) & +sleep 1 +echo Zero:$? +wait %1 +echo Three:$?