bring back the backed-out Debian patch if FPOSIX; test programmes fixed:

H4sIAAAAAAACAz1PywrDIBA8m68YgoT20EN7TMixX1F6yGNFIWhRSw2h/95VmuDB2XmsY2oDRVyo
Si1N2uHlMzQK0b8JHaImy4RQwxIITYPiUs4xqcyeGgdfrfumtWX5dMbGSHy0WQgP1PJa49lhdpkV
ynncYSxkOjjxd/V83dmcX9sQtFGRi0zORmO5042HbwnMzlIBqa9lAmfLVBIZ7XqpKBPDnDu+WXpi
wMhnOgQXYvUD+oKHAhUBAAA=

XXX OpenBSD has something different which may DTST or even DTRT (not break
XXX our make(1) wrt <bsd.subdir.mk>), check that
This commit is contained in:
tg
2009-03-16 15:14:23 +00:00
parent 8a77cd5d6e
commit e39c1f860d
3 changed files with 19 additions and 8 deletions

19
exec.c
View File

@ -2,7 +2,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.48 2008/12/13 17:02:13 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.49 2009/03/16 15:14:23 tg Exp $");
static int comexec(struct op *, struct tbl *volatile, const char **,
int volatile);
@ -25,6 +25,8 @@ execute(struct op *volatile t,
{
int i;
volatile int rv = 0;
/* for FPOSIX only: rv being propagated or newly defined? */
volatile bool rv_prop = false;
int pv[2];
const char ** volatile ap;
char ** volatile up;
@ -100,6 +102,7 @@ execute(struct op *volatile t,
case TPAREN:
rv = execute(t->left, flags|XFORK);
rv_prop = true;
break;
case TPIPE:
@ -207,9 +210,10 @@ execute(struct op *volatile t,
case TOR:
case TAND:
rv = execute(t->left, XERROK);
if (t->right != NULL && (rv == 0) == (t->type == TAND))
if (t->right != NULL && (rv == 0) == (t->type == TAND)) {
rv = execute(t->right, flags & XERROK);
else
rv_prop = true;
} else
flags |= XERROK;
break;
@ -254,6 +258,7 @@ execute(struct op *volatile t,
}
}
rv = 0; /* in case of a continue */
rv_prop = true;
if (t->type == TFOR) {
while (*ap != NULL) {
setstr(global(t->str), *ap++, KSH_UNWIND_ERROR);
@ -263,6 +268,7 @@ execute(struct op *volatile t,
for (;;) {
if (!(cp = do_selectargs(ap, is_first))) {
rv = 1;
rv_prop = false;
break;
}
is_first = false;
@ -292,6 +298,7 @@ execute(struct op *volatile t,
rv = 0; /* in case of a continue */
while ((execute(t->left, XERROK) == 0) == (t->type == TWHILE))
rv = execute(t->right, flags & XERROK);
rv_prop = true;
break;
case TIF:
@ -301,6 +308,7 @@ execute(struct op *volatile t,
rv = execute(t->left, XERROK) == 0 ?
execute(t->right->left, flags & XERROK) :
execute(t->right->right, flags & XERROK);
rv_prop = true;
break;
case TCASE:
@ -313,10 +321,12 @@ execute(struct op *volatile t,
break;
Found:
rv = execute(t->left, flags & XERROK);
rv_prop = true;
break;
case TBRACE:
rv = execute(t->left, flags & XERROK);
rv_prop = true;
break;
case TFUNCT:
@ -328,6 +338,7 @@ execute(struct op *volatile t,
* (allows "ls -l | time grep foo").
*/
rv = timex(t, flags & ~XEXEC);
rv_prop = true;
break;
case TEXEC: /* an eval'd TCOM */
@ -353,7 +364,7 @@ execute(struct op *volatile t,
quitenv(NULL); /* restores IO */
if ((flags&XEXEC))
unwind(LEXIT); /* exit child */
if (rv != 0 && !(flags & XERROK)) {
if (rv != 0 && (!Flag(FPOSIX) || !rv_prop) &&!(flags & XERROK)) {
trapsig(SIGERR_);
if (Flag(FERREXIT))
unwind(LERROR);