Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Jun 2013 19:40:52 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r251430 - in head: bin/sh tools/regression/bin/sh/builtins
Message-ID:  <201306051940.r55Jeqah015440@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Wed Jun  5 19:40:52 2013
New Revision: 251430
URL: http://svnweb.freebsd.org/changeset/base/251430

Log:
  sh: Return status 127 for unknown jobs in wait builtin.
  
  This is required by POSIX, at least for pids that are not known child
  processes.
  
  Other problems with job specifications still cause wait to abort with
  exit status 2.
  
  PR:		176916

Added:
  head/tools/regression/bin/sh/builtins/wait10.0   (contents, props changed)
  head/tools/regression/bin/sh/builtins/wait9.127   (contents, props changed)
Modified:
  head/bin/sh/jobs.c

Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c	Wed Jun  5 19:08:22 2013	(r251429)
+++ head/bin/sh/jobs.c	Wed Jun  5 19:40:52 2013	(r251430)
@@ -96,6 +96,7 @@ static void restartjob(struct job *);
 #endif
 static void freejob(struct job *);
 static int waitcmdloop(struct job *);
+static struct job *getjob_nonotfound(char *);
 static struct job *getjob(char *);
 pid_t getjobpgrp(char *);
 static pid_t dowait(int, struct job *);
@@ -467,8 +468,11 @@ waitcmd(int argc __unused, char **argv _
 		return (waitcmdloop(NULL));
 
 	do {
-		job = getjob(*argptr);
-		retval = waitcmdloop(job);
+		job = getjob_nonotfound(*argptr);
+		if (job == NULL)
+			retval = 127;
+		else
+			retval = waitcmdloop(job);
 		argptr++;
 	} while (*argptr != NULL);
 
@@ -558,7 +562,7 @@ jobidcmd(int argc __unused, char **argv)
  */
 
 static struct job *
-getjob(char *name)
+getjob_nonotfound(char *name)
 {
 	int jobno;
 	struct job *found, *jp;
@@ -623,12 +627,22 @@ currentjob:	if ((jp = getcurjob(NULL)) =
 				return jp;
 		}
 	}
-	error("No such job: %s", name);
-	/*NOTREACHED*/
 	return NULL;
 }
 
 
+static struct job *
+getjob(char *name)
+{
+	struct job *jp;
+
+	jp = getjob_nonotfound(name);
+	if (jp == NULL)
+		error("No such job: %s", name);
+	return (jp);
+}
+
+
 pid_t
 getjobpgrp(char *name)
 {

Added: head/tools/regression/bin/sh/builtins/wait10.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/builtins/wait10.0	Wed Jun  5 19:40:52 2013	(r251430)
@@ -0,0 +1,5 @@
+# $FreeBSD$
+# Init cannot be a child of the shell.
+exit 49 & p49=$!
+wait 1 "$p49"
+[ "$?" = 49 ]

Added: head/tools/regression/bin/sh/builtins/wait9.127
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/builtins/wait9.127	Wed Jun  5 19:40:52 2013	(r251430)
@@ -0,0 +1,3 @@
+# $FreeBSD$
+# Init cannot be a child of the shell.
+wait 1



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306051940.r55Jeqah015440>