From a4099656c3d8b4c6f1ed2dfe1ef8bfdbe69b826b Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Wed, 5 Jun 2013 19:08:22 +0000 Subject: [PATCH] sh: Allow multiple operands in wait builtin. This is only part of the PR; the behaviour for unknown/invalid pids/jobs remains unchanged (aborts the builtin with status 2). PR: 176916 Submitted by: Vadim Goncharov --- bin/sh/jobs.c | 24 ++++++++++++++++++------ tools/regression/bin/sh/builtins/wait8.0 | 7 +++++++ 2 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 tools/regression/bin/sh/builtins/wait8.0 diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index 163b7e7646b..aa8d988acb0 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -95,6 +95,7 @@ static int ttyfd = -1; static void restartjob(struct job *); #endif static void freejob(struct job *); +static int waitcmdloop(struct job *); static struct job *getjob(char *); pid_t getjobpgrp(char *); static pid_t dowait(int, struct job *); @@ -459,15 +460,26 @@ int waitcmd(int argc __unused, char **argv __unused) { struct job *job; - int status, retval; - struct job *jp; + int retval; nextopt(""); - if (*argptr != NULL) { + if (*argptr == NULL) + return (waitcmdloop(NULL)); + + do { job = getjob(*argptr); - } else { - job = NULL; - } + retval = waitcmdloop(job); + argptr++; + } while (*argptr != NULL); + + return (retval); +} + +static int +waitcmdloop(struct job *job) +{ + int status, retval; + struct job *jp; /* * Loop until a process is terminated or stopped, or a SIGINT is diff --git a/tools/regression/bin/sh/builtins/wait8.0 b/tools/regression/bin/sh/builtins/wait8.0 new file mode 100644 index 00000000000..b59ff59622e --- /dev/null +++ b/tools/regression/bin/sh/builtins/wait8.0 @@ -0,0 +1,7 @@ +# $FreeBSD$ + +exit 44 & p44=$! +exit 45 & p45=$! +exit 7 & p7=$! +wait "$p44" "$p7" "$p45" +[ "$?" = 45 ]