summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/hush.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 6f34ce1..498b14e 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -524,6 +524,7 @@ static int builtin_shift(char **argv);
static int builtin_source(char **argv);
static int builtin_umask(char **argv);
static int builtin_unset(char **argv);
+static int builtin_wait(char **argv);
#if ENABLE_HUSH_LOOPS
static int builtin_break(char **argv);
static int builtin_continue(char **argv);
@@ -582,6 +583,7 @@ static const struct built_in_command bltins[] = {
// BLTIN("ulimit", builtin_not_written, "Control resource limits"),
BLTIN("umask" , builtin_umask, "Set file creation mask"),
BLTIN("unset" , builtin_unset, "Unset environment variable"),
+ BLTIN("wait" , builtin_wait, "Wait for process"),
#if ENABLE_HUSH_HELP
BLTIN("help" , builtin_help, "List shell built-in commands"),
#endif
@@ -4895,6 +4897,39 @@ static int builtin_unset(char **argv)
return EXIT_SUCCESS;
}
+/* http://www.opengroup.org/onlinepubs/9699919799/utilities/wait.html */
+static int builtin_wait(char **argv)
+{
+ int ret = EXIT_SUCCESS;
+ int status;
+
+ if (argv[1] == NULL)
+ /* don't care about exit status */
+ wait(&status);
+
+ while (argv[1]) {
+ char *endp;
+ pid_t pid = bb_strtou(argv[1], &endp, 10);
+ if (*endp) {
+ bb_perror_msg("wait %s", argv[1]);
+ return EXIT_FAILURE;
+ } else if (waitpid(pid, &status, 0) == pid) {
+ if (WIFSIGNALED(status))
+ ret = 128 + WTERMSIG(status);
+ else if (WIFEXITED(status))
+ ret = WEXITSTATUS(status);
+ else
+ ret = EXIT_FAILURE;
+ } else {
+ bb_perror_msg("wait %s", argv[1]);
+ ret = 127;
+ }
+ ++argv;
+ }
+
+ return ret;
+}
+
#if ENABLE_HUSH_LOOPS
static int builtin_break(char **argv)
{