Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Nov 2018 14:58:24 +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: r340284 - head/bin/sh
Message-ID:  <201811091458.wA9EwOAj014822@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Fri Nov  9 14:58:24 2018
New Revision: 340284
URL: https://svnweb.freebsd.org/changeset/base/340284

Log:
  sh: Unify EXERROR and EXEXEC
  
  The difference between EXERROR and EXEXEC was that EXEXEC passed along
  exitstatus and EXERROR set exitstatus to 2 in the handling code.
  
  By changing the places that raised EXERROR to set exitstatus to 2, the
  handling of EXERROR and EXEXEC becomes the same.

Modified:
  head/bin/sh/TOUR
  head/bin/sh/error.c
  head/bin/sh/error.h
  head/bin/sh/eval.c
  head/bin/sh/exec.c
  head/bin/sh/jobs.c
  head/bin/sh/main.c

Modified: head/bin/sh/TOUR
==============================================================================
--- head/bin/sh/TOUR	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/TOUR	Fri Nov  9 14:58:24 2018	(r340284)
@@ -35,7 +35,7 @@ EXCEPTIONS:  Code for dealing with exceptions appears 
 exceptions.c.  The C language doesn't include exception handling,
 so I implement it using setjmp and longjmp.  The global variable
 exception contains the type of exception.  EXERROR is raised by
-calling error.  EXINT is an interrupt.
+calling error or errorwithstatus.  EXINT is an interrupt.
 
 INTERRUPTS:  In an interactive shell, an interrupt will cause an
 EXINT exception to return to the main command loop.  (Exception:

Modified: head/bin/sh/error.c
==============================================================================
--- head/bin/sh/error.c	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/error.c	Fri Nov  9 14:58:24 2018	(r340284)
@@ -67,7 +67,7 @@ volatile sig_atomic_t suppressint;
 volatile sig_atomic_t intpending;
 
 
-static void exverror(int, const char *, va_list) __printf0like(2, 0) __dead2;
+static void verrorwithstatus(int, const char *, va_list) __printf0like(2, 0) __dead2;
 
 /*
  * Called to raise an exception.  Since C doesn't include exceptions, we
@@ -154,7 +154,7 @@ warning(const char *msg, ...)
  * formatting.  It then raises the error exception.
  */
 static void
-exverror(int cond, const char *msg, va_list ap)
+verrorwithstatus(int status, const char *msg, va_list ap)
 {
 	/*
 	 * An interrupt trumps an error.  Certain places catch error
@@ -168,14 +168,17 @@ exverror(int cond, const char *msg, va_list ap)
 
 #ifdef DEBUG
 	if (msg)
-		TRACE(("exverror(%d, \"%s\") pid=%d\n", cond, msg, getpid()));
+		TRACE(("verrorwithstatus(%d, \"%s\") pid=%d\n",
+		    status, msg, getpid()));
 	else
-		TRACE(("exverror(%d, NULL) pid=%d\n", cond, getpid()));
+		TRACE(("verrorwithstatus(%d, NULL) pid=%d\n",
+		    status, getpid()));
 #endif
 	if (msg)
 		vwarning(msg, ap);
 	flushall();
-	exraise(cond);
+	exitstatus = status;
+	exraise(EXERROR);
 }
 
 
@@ -184,16 +187,16 @@ error(const char *msg, ...)
 {
 	va_list ap;
 	va_start(ap, msg);
-	exverror(EXERROR, msg, ap);
+	verrorwithstatus(2, msg, ap);
 	va_end(ap);
 }
 
 
 void
-exerror(int cond, const char *msg, ...)
+errorwithstatus(int status, const char *msg, ...)
 {
 	va_list ap;
 	va_start(ap, msg);
-	exverror(cond, msg, ap);
+	verrorwithstatus(status, msg, ap);
 	va_end(ap);
 }

Modified: head/bin/sh/error.h
==============================================================================
--- head/bin/sh/error.h	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/error.h	Fri Nov  9 14:58:24 2018	(r340284)
@@ -55,9 +55,8 @@ extern volatile sig_atomic_t exception;
 
 /* exceptions */
 #define EXINT 0		/* SIGINT received */
-#define EXERROR 1	/* a generic error */
-#define EXEXEC 2	/* command execution failed */
-#define EXEXIT 3	/* call exitshell(exitstatus) */
+#define EXERROR 1	/* a generic error with exitstatus */
+#define EXEXIT 2	/* call exitshell(exitstatus) */
 
 
 /*
@@ -83,7 +82,7 @@ void exraise(int) __dead2;
 void onint(void) __dead2;
 void warning(const char *, ...) __printflike(1, 2);
 void error(const char *, ...) __printf0like(1, 2) __dead2;
-void exerror(int, const char *, ...) __printf0like(2, 3) __dead2;
+void errorwithstatus(int, const char *, ...) __printf0like(2, 3) __dead2;
 
 
 /*

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/eval.c	Fri Nov  9 14:58:24 2018	(r340284)
@@ -466,13 +466,9 @@ evalredir(union node *n, int flags)
 		handler = savehandler;
 		e = exception;
 		popredir();
-		if (e == EXERROR || e == EXEXEC) {
-			if (in_redirect) {
-				if (e == EXERROR)
-					exitstatus = 2;
-				FORCEINTON;
-				return;
-			}
+		if (e == EXERROR && in_redirect) {
+			FORCEINTON;
+			return;
 		}
 		longjmp(handler->loc, 1);
 	} else {
@@ -506,7 +502,7 @@ exphere(union node *redir, struct arglist *fn)
 	forcelocal++;
 	savehandler = handler;
 	if (setjmp(jmploc.loc))
-		need_longjmp = exception != EXERROR && exception != EXEXEC;
+		need_longjmp = exception != EXERROR;
 	else {
 		handler = &jmploc;
 		expandarg(redir->nhere.doc, fn, 0);
@@ -671,8 +667,6 @@ evalbackcmd(union node *n, struct backcmd *result)
 		savehandler = handler;
 		if (setjmp(jmploc.loc)) {
 			if (exception == EXERROR)
-				exitstatus = 2;
-			else if (exception == EXEXEC)
 				/* nothing */;
 			else if (exception != 0) {
 				handler = savehandler;
@@ -1092,8 +1086,6 @@ evalcommand(union node *cmd, int flags, struct backcmd
 			e = exception;
 			if (e == EXINT)
 				exitstatus = SIGINT+128;
-			else if (e != EXEXEC && e != EXEXIT)
-				exitstatus = 2;
 			goto cmddone;
 		}
 		handler = &jmploc;
@@ -1142,8 +1134,7 @@ cmddone:
 		if (cmdentry.u.index != EXECCMD)
 			popredir();
 		if (e != -1) {
-			if ((e != EXERROR && e != EXEXEC)
-			    || cmdentry.special)
+			if (e != EXERROR || cmdentry.special)
 				exraise(e);
 			popfilesupto(savetopfile);
 			if (flags != EV_BACKCMD)

Modified: head/bin/sh/exec.c
==============================================================================
--- head/bin/sh/exec.c	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/exec.c	Fri Nov  9 14:58:24 2018	(r340284)
@@ -133,13 +133,10 @@ shellexec(char **argv, char **envp, const char *path, 
 	}
 
 	/* Map to POSIX errors */
-	if (e == ENOENT || e == ENOTDIR) {
-		exitstatus = 127;
-		exerror(EXEXEC, "%s: not found", argv[0]);
-	} else {
-		exitstatus = 126;
-		exerror(EXEXEC, "%s: %s", argv[0], strerror(e));
-	}
+	if (e == ENOENT || e == ENOTDIR)
+		errorwithstatus(127, "%s: not found", argv[0]);
+	else
+		errorwithstatus(126, "%s: %s", argv[0], strerror(e));
 }
 
 

Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/jobs.c	Fri Nov  9 14:58:24 2018	(r340284)
@@ -1006,7 +1006,7 @@ vforkexecshell(struct job *jp, char **argv, char **env
 	if (pid == 0) {
 		TRACE(("Child shell %d\n", (int)getpid()));
 		if (setjmp(jmploc.loc))
-			_exit(exception == EXEXEC ? exitstatus : 2);
+			_exit(exitstatus);
 		if (pip != NULL) {
 			close(pip[0]);
 			if (pip[1] != 1) {

Modified: head/bin/sh/main.c
==============================================================================
--- head/bin/sh/main.c	Fri Nov  9 13:47:06 2018	(r340283)
+++ head/bin/sh/main.c	Fri Nov  9 14:58:24 2018	(r340284)
@@ -105,15 +105,6 @@ main(int argc, char *argv[])
 	initcharset();
 	state = 0;
 	if (setjmp(main_handler.loc)) {
-		switch (exception) {
-		case EXERROR:
-			exitstatus = 2;
-			break;
-
-		default:
-			break;
-		}
-
 		if (state == 0 || iflag == 0 || ! rootshell ||
 		    exception == EXEXIT)
 			exitshell(exitstatus);



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