svn commit: [25866] trunk/busybox/shell

vapier at busybox.net vapier at busybox.net
Sat Mar 28 20:01:59 UTC 2009


Author: vapier
Date: 2009-03-28 20:01:58 +0000 (Sat, 28 Mar 2009)
New Revision: 25866

Log:
implement `wait` builtin

Modified:
   trunk/busybox/shell/hush.c


Changeset:
Modified: trunk/busybox/shell/hush.c
===================================================================
--- trunk/busybox/shell/hush.c	2009-03-28 19:31:34 UTC (rev 25865)
+++ trunk/busybox/shell/hush.c	2009-03-28 20:01:58 UTC (rev 25866)
@@ -524,6 +524,7 @@
 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 @@
 //	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 @@
 	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)
 {



More information about the busybox-cvs mailing list