From owner-svn-src-all@FreeBSD.ORG Sun May 31 12:36:15 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 18CDF106564A; Sun, 31 May 2009 12:36:15 +0000 (UTC) (envelope-from stefanf@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 06E538FC08; Sun, 31 May 2009 12:36:15 +0000 (UTC) (envelope-from stefanf@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n4VCaEf6043388; Sun, 31 May 2009 12:36:14 GMT (envelope-from stefanf@svn.freebsd.org) Received: (from stefanf@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n4VCaEjQ043383; Sun, 31 May 2009 12:36:14 GMT (envelope-from stefanf@svn.freebsd.org) Message-Id: <200905311236.n4VCaEjQ043383@svn.freebsd.org> From: Stefan Farfeleder Date: Sun, 31 May 2009 12:36:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193169 - head/bin/sh X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 31 May 2009 12:36:15 -0000 Author: stefanf Date: Sun May 31 12:36:14 2009 New Revision: 193169 URL: http://svn.freebsd.org/changeset/base/193169 Log: Fix the eval command in combination with set -e. Before this change the shell would always terminate if eval returned with a non-zero exit status regardless if the status was actually tested. Unfortunately a new file-scope variable is needed, the alternative would only be to add a new parameter to all built-ins. PR: 134881 Modified: head/bin/sh/eval.c head/bin/sh/eval.h head/bin/sh/histedit.c head/bin/sh/main.c head/bin/sh/trap.c Modified: head/bin/sh/eval.c ============================================================================== --- head/bin/sh/eval.c Sun May 31 12:16:31 2009 (r193168) +++ head/bin/sh/eval.c Sun May 31 12:36:14 2009 (r193169) @@ -83,6 +83,7 @@ MKINIT int evalskip; /* set if we are s STATIC int skipcount; /* number of levels to skip */ MKINIT int loopnest; /* current loop nesting level */ int funcnest; /* depth of function calls */ +STATIC int builtin_flags; /* evalcommand flags for builtins */ char *commandname; @@ -147,7 +148,7 @@ evalcmd(int argc, char **argv) STPUTC('\0', concat); p = grabstackstr(concat); } - evalstring(p); + evalstring(p, builtin_flags & EV_TESTED); } return exitstatus; } @@ -158,7 +159,7 @@ evalcmd(int argc, char **argv) */ void -evalstring(char *s) +evalstring(char *s, int flags) { union node *n; struct stackmark smark; @@ -167,7 +168,7 @@ evalstring(char *s) setinputstring(s, 1); while ((n = parsecmd(0)) != NEOF) { if (n != NULL) - evaltree(n, 0); + evaltree(n, flags); popstackmark(&smark); } popfile(); @@ -839,6 +840,7 @@ evalcommand(union node *cmd, int flags, commandname = argv[0]; argptr = argv + 1; optptr = NULL; /* initialize nextopt */ + builtin_flags = flags; exitstatus = (*builtinfunc[cmdentry.u.index])(argc, argv); flushall(); cmddone: Modified: head/bin/sh/eval.h ============================================================================== --- head/bin/sh/eval.h Sun May 31 12:16:31 2009 (r193168) +++ head/bin/sh/eval.h Sun May 31 12:36:14 2009 (r193169) @@ -46,7 +46,7 @@ struct backcmd { /* result of evalbackc }; int evalcmd(int, char **); -void evalstring(char *); +void evalstring(char *, int); union node; /* BLETCH for ansi C */ void evaltree(union node *, int); void evalbackcmd(union node *, struct backcmd *); Modified: head/bin/sh/histedit.c ============================================================================== --- head/bin/sh/histedit.c Sun May 31 12:16:31 2009 (r193168) +++ head/bin/sh/histedit.c Sun May 31 12:36:14 2009 (r193169) @@ -350,7 +350,7 @@ histcmd(int argc, char **argv) if (displayhist) { out2str(s); } - evalstring(s); + evalstring(s, 0); if (displayhist && hist) { /* * XXX what about recursive and @@ -382,7 +382,7 @@ histcmd(int argc, char **argv) fclose(efp); editcmd = stalloc(strlen(editor) + strlen(editfile) + 2); sprintf(editcmd, "%s %s", editor, editfile); - evalstring(editcmd); /* XXX - should use no JC command */ + evalstring(editcmd, 0); /* XXX - should use no JC command */ INTON; readcmdfile(editfile); /* XXX - should read back - quick tst */ unlink(editfile); Modified: head/bin/sh/main.c ============================================================================== --- head/bin/sh/main.c Sun May 31 12:16:31 2009 (r193168) +++ head/bin/sh/main.c Sun May 31 12:36:14 2009 (r193169) @@ -178,7 +178,7 @@ state2: state3: state = 4; if (minusc) { - evalstring(minusc); + evalstring(minusc, 0); } if (sflag || minusc == NULL) { state4: /* XXX ??? - why isn't this before the "if" statement */ Modified: head/bin/sh/trap.c ============================================================================== --- head/bin/sh/trap.c Sun May 31 12:16:31 2009 (r193168) +++ head/bin/sh/trap.c Sun May 31 12:36:14 2009 (r193169) @@ -416,7 +416,7 @@ dotrap(void) if (i == SIGCHLD) ignore_sigchld++; savestatus = exitstatus; - evalstring(trap[i]); + evalstring(trap[i], 0); exitstatus = savestatus; if (i == SIGCHLD) ignore_sigchld--; @@ -471,7 +471,7 @@ exitshell(int status) handler = &loc1; if ((p = trap[0]) != NULL && *p != '\0') { trap[0] = NULL; - evalstring(p); + evalstring(p, 0); } l1: handler = &loc2; /* probably unnecessary */ flushall();