From 56bdea1b43eda3f5ec7073736f5381e9c0017af4 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sat, 28 Mar 2009 20:01:58 +0000 Subject: implement `wait` builtin --- shell/hush.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'shell/hush.c') diff --git a/shell/hush.c b/shell/hush.c index 6f34ce1c3..498b14e72 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) { -- cgit v1.2.3