diff --git a/check.t b/check.t index 60f2e86..d438482 100644 --- a/check.t +++ b/check.t @@ -1,4 +1,4 @@ -# $MirOS: src/bin/mksh/check.t,v 1.258 2009/03/15 16:13:37 tg Exp $ +# $MirOS: src/bin/mksh/check.t,v 1.259 2009/03/16 15:14:22 tg Exp $ # $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $ # $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $ # $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $ @@ -7,7 +7,7 @@ # http://www.research.att.com/~gsf/public/ifs.sh expected-stdout: - @(#)MIRBSD KSH R36 2009/03/15 + @(#)MIRBSD KSH R36 2009/03/16 ~test description: Check version of shell. stdin: diff --git a/exec.c b/exec.c index 8267587..8519c04 100644 --- a/exec.c +++ b/exec.c @@ -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); diff --git a/sh.h b/sh.h index cd8b8ea..76bb165 100644 --- a/sh.h +++ b/sh.h @@ -102,9 +102,9 @@ #define __SCCSID(x) __IDSTRING(sccsid,x) #ifdef EXTERN -__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.276 2009/03/15 16:13:40 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.277 2009/03/16 15:14:23 tg Exp $"); #endif -#define MKSH_VERSION "R36 2009/03/15" +#define MKSH_VERSION "R36 2009/03/16 ~test" #ifndef MKSH_INCLUDES_ONLY