Exit status propagation fix from freebsd's sh
This commit is contained in:
parent
ac9a157ba2
commit
9e1428fb91
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user