implement `wait` builtin
authorMike Frysinger <vapier@gentoo.org>
Sat, 28 Mar 2009 20:01:58 +0000 (20:01 -0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 28 Mar 2009 20:01:58 +0000 (20:01 -0000)
shell/hush.c

index 6f34ce1c3e870434b45dc66ab66d78650a873822..498b14e7294cbbb3aeb15a30fb92c2cfa9ab383b 100644 (file)
@@ -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)
 {