Exit status propagation fix from freebsd's sh

This commit is contained in:
Ben Gras 2006-03-17 17:33:20 +00:00
parent ac9a157ba2
commit 9e1428fb91
3 changed files with 21 additions and 5 deletions

View File

@ -84,6 +84,7 @@ int funcnest; /* depth of function calls */
char *commandname; char *commandname;
struct strlist *cmdenviron; struct strlist *cmdenviron;
int exitstatus; /* exit status of last command */ int exitstatus; /* exit status of last command */
int oexitstatus; /* saved exit status */
#ifdef __STDC__ #ifdef __STDC__
@ -272,8 +273,11 @@ evaltree(n, flags)
out: out:
if (pendingsigs) if (pendingsigs)
dotrap(); dotrap();
if ((flags & EV_EXIT) || (eflag == 1 && exitstatus && !(flags & EV_TESTED))) if ((flags & EV_EXIT) || (eflag && exitstatus
&& !(flags & EV_TESTED) && (n->type == NCMD ||
n->type == NSUBSHELL))) {
exitshell(exitstatus); exitshell(exitstatus);
}
} }
@ -326,6 +330,7 @@ evalfor(n)
setstackmark(&smark); setstackmark(&smark);
arglist.lastp = &arglist.list; arglist.lastp = &arglist.list;
for (argp = n->nfor.args ; argp ; argp = argp->narg.next) { for (argp = n->nfor.args ; argp ; argp = argp->narg.next) {
oexitstatus = exitstatus;
expandarg(argp, &arglist, 1); expandarg(argp, &arglist, 1);
if (evalskip) if (evalskip)
goto out; goto out;
@ -365,6 +370,7 @@ evalcase(n, flags)
setstackmark(&smark); setstackmark(&smark);
arglist.lastp = &arglist.list; arglist.lastp = &arglist.list;
oexitstatus = exitstatus;
expandarg(n->ncase.expr, &arglist, 0); expandarg(n->ncase.expr, &arglist, 0);
for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) { for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) {
for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) { for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) {
@ -421,6 +427,7 @@ expredir(n)
register union node *redir; register union node *redir;
for (redir = n ; redir ; redir = redir->nfile.next) { for (redir = n ; redir ; redir = redir->nfile.next) {
oexitstatus = exitstatus;
if (redir->type == NFROM if (redir->type == NFROM
|| redir->type == NTO || redir->type == NTO
|| redir->type == NAPPEND) { || redir->type == NAPPEND) {
@ -525,6 +532,7 @@ evalbackcmd(n, result)
/* `` */ /* `` */
} else } else
if (n->type == NCMD) { if (n->type == NCMD) {
exitstatus = oexitstatus;
evalcommand(n, EV_BACKCMD, result); evalcommand(n, EV_BACKCMD, result);
} else { } else {
if (pipe(pip) < 0) if (pipe(pip) < 0)
@ -588,6 +596,8 @@ evalcommand(cmd, flags, backcmd)
arglist.lastp = &arglist.list; arglist.lastp = &arglist.list;
varlist.lastp = &varlist.list; varlist.lastp = &varlist.list;
varflag = 1; varflag = 1;
oexitstatus = exitstatus;
exitstatus = 0;
for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) { for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) {
p = argp->narg.text; p = argp->narg.text;
if (varflag && is_name(*p)) { if (varflag && is_name(*p)) {
@ -722,7 +732,10 @@ evalcommand(cmd, flags, backcmd)
for (sp = varlist.list ; sp ; sp = sp->next) for (sp = varlist.list ; sp ; sp = sp->next)
mklocal(sp->text); mklocal(sp->text);
funcnest++; funcnest++;
evaltree(cmdentry.u.func, 0); if (flags & EV_TESTED)
evaltree(cmdentry.u.func, EV_TESTED);
else
evaltree(cmdentry.u.func, 0);
funcnest--; funcnest--;
INTOFF; INTOFF;
poplocalvars(); poplocalvars();
@ -895,7 +908,7 @@ breakcmd(argc, argv) char **argv; {
returncmd(argc, argv) char **argv; { returncmd(argc, argv) char **argv; {
int ret; int ret;
ret = exitstatus; ret = oexitstatus;
if (argc > 1) if (argc > 1)
ret = number(argv[1]); ret = number(argv[1]);
if (funcnest) { if (funcnest) {

View File

@ -463,7 +463,7 @@ varvalue(name, quoted, allow_split)
char temp[32]; char temp[32];
char *p; char *p;
int i; int i;
extern int exitstatus; extern int oexitstatus;
char sep; char sep;
char **ap; char **ap;
char const *syntax; char const *syntax;
@ -473,7 +473,7 @@ varvalue(name, quoted, allow_split)
num = rootpid; num = rootpid;
goto numvar; goto numvar;
case '?': case '?':
num = exitstatus; num = oexitstatus;
goto numvar; goto numvar;
case '#': case '#':
num = shellparam.nparam; num = shellparam.nparam;

View File

@ -321,8 +321,11 @@ dotcmd(argc, argv) char **argv; {
exitcmd(argc, argv) char **argv; { exitcmd(argc, argv) char **argv; {
extern int oexitstatus;
if (argc > 1) if (argc > 1)
exitstatus = number(argv[1]); exitstatus = number(argv[1]);
else
exitstatus = oexitstatus;
exitshell(exitstatus); exitshell(exitstatus);
} }