patch from oksh (except manpage, I'll merge that later):
pass "xerrok" status across the execution call stack to more closely match what both POSIX and [18]ksh.1 already describe in regards to set -e/errexit's behavior in determining when to exit from nonzero return values. specifically, the truth values tested as operands to &&' and ||', as well as the resulting compound expression itself, along with the truth value resulting from a negated command (i.e. a pipeline prefixed !'), should not make the shell exit when -e is in effect. issue reported by matthieu. testing matthieu, naddy. ok miod (earlier version), otto. man page ok jmc.
This commit is contained in:
		
							
								
								
									
										6
									
								
								eval.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								eval.c
									
									
									
									
									
								
							| @@ -1,8 +1,8 @@ | |||||||
| /*	$OpenBSD: eval.c,v 1.33 2007/08/02 11:05:54 fgsch Exp $	*/ | /*	$OpenBSD: eval.c,v 1.34 2009/01/29 23:27:26 jaredy Exp $	*/ | ||||||
|  |  | ||||||
| #include "sh.h" | #include "sh.h" | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/eval.c,v 1.52 2009/03/14 18:12:51 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/eval.c,v 1.53 2009/03/22 17:47:35 tg Exp $"); | ||||||
|  |  | ||||||
| #ifdef MKSH_SMALL | #ifdef MKSH_SMALL | ||||||
| #define MKSH_NOPWNAM | #define MKSH_NOPWNAM | ||||||
| @@ -1069,7 +1069,7 @@ comsub(Expand *xp, const char *cp) | |||||||
| 			ksh_dup2(pv[1], 1, false); | 			ksh_dup2(pv[1], 1, false); | ||||||
| 			close(pv[1]); | 			close(pv[1]); | ||||||
| 		} | 		} | ||||||
| 		execute(t, XFORK|XXCOM|XPIPEO); | 		execute(t, XFORK|XXCOM|XPIPEO, NULL); | ||||||
| 		restfd(1, ofd1); | 		restfd(1, ofd1); | ||||||
| 		startlast(); | 		startlast(); | ||||||
| 		xp->split = 1;	/* waitlast() */ | 		xp->split = 1;	/* waitlast() */ | ||||||
|   | |||||||
							
								
								
									
										75
									
								
								exec.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								exec.c
									
									
									
									
									
								
							| @@ -1,11 +1,11 @@ | |||||||
| /*	$OpenBSD: exec.c,v 1.48 2007/09/05 19:02:01 otto Exp $	*/ | /*	$OpenBSD: exec.c,v 1.49 2009/01/29 23:27:26 jaredy Exp $	*/ | ||||||
|  |  | ||||||
| #include "sh.h" | #include "sh.h" | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/exec.c,v 1.50 2009/03/16 15:50:12 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/exec.c,v 1.51 2009/03/22 17:47:36 tg Exp $"); | ||||||
|  |  | ||||||
| static int comexec(struct op *, struct tbl *volatile, const char **, | static int comexec(struct op *, struct tbl *volatile, const char **, | ||||||
|     int volatile); |     int volatile, volatile int *); | ||||||
| static void scriptexec(struct op *, const char **) | static void scriptexec(struct op *, const char **) | ||||||
|     __attribute__((noreturn)); |     __attribute__((noreturn)); | ||||||
| static int call_builtin(struct tbl *, const char **); | static int call_builtin(struct tbl *, const char **); | ||||||
| @@ -21,7 +21,8 @@ static void dbteste_error(Test_env *, int, const char *); | |||||||
|  */ |  */ | ||||||
| int | int | ||||||
| execute(struct op *volatile t, | execute(struct op *volatile t, | ||||||
|     volatile int flags)		/* if XEXEC don't fork */ |     volatile int flags,		/* if XEXEC don't fork */ | ||||||
|  |     volatile int *xerrok) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	volatile int rv = 0; | 	volatile int rv = 0; | ||||||
| @@ -36,7 +37,8 @@ execute(struct op *volatile t, | |||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| 	if ((flags&XFORK) && !(flags&XEXEC) && t->type != TPIPE) | 	if ((flags&XFORK) && !(flags&XEXEC) && t->type != TPIPE) | ||||||
| 		return exchild(t, flags & ~XTIME, -1); /* run in sub-process */ | 		/* run in sub-process */ | ||||||
|  | 		return exchild(t, flags & ~XTIME, xerrok, -1); | ||||||
|  |  | ||||||
| 	newenv(E_EXEC); | 	newenv(E_EXEC); | ||||||
| 	if (trap) | 	if (trap) | ||||||
| @@ -95,11 +97,11 @@ execute(struct op *volatile t, | |||||||
|  |  | ||||||
| 	switch (t->type) { | 	switch (t->type) { | ||||||
| 	case TCOM: | 	case TCOM: | ||||||
| 		rv = comexec(t, tp, (const char **)ap, flags); | 		rv = comexec(t, tp, (const char **)ap, flags, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TPAREN: | 	case TPAREN: | ||||||
| 		rv = execute(t->left, flags|XFORK); | 		rv = execute(t->left, flags | XFORK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TPIPE: | 	case TPIPE: | ||||||
| @@ -115,7 +117,8 @@ execute(struct op *volatile t, | |||||||
| 			 *    (: ; cat /etc/termcap) | sleep 1 | 			 *    (: ; cat /etc/termcap) | sleep 1 | ||||||
| 			 *  will hang forever). | 			 *  will hang forever). | ||||||
| 			 */ | 			 */ | ||||||
| 			exchild(t->left, flags|XPIPEO|XCCLOSE, pv[0]); | 			exchild(t->left, flags | XPIPEO | XCCLOSE, | ||||||
|  | 			    NULL, pv[0]); | ||||||
| 			ksh_dup2(pv[0], 0, false); /* stdin of next */ | 			ksh_dup2(pv[0], 0, false); /* stdin of next */ | ||||||
| 			closepipe(pv); | 			closepipe(pv); | ||||||
| 			flags |= XPIPEI; | 			flags |= XPIPEI; | ||||||
| @@ -124,17 +127,17 @@ execute(struct op *volatile t, | |||||||
| 		restfd(1, e->savefd[1]); /* stdout of last */ | 		restfd(1, e->savefd[1]); /* stdout of last */ | ||||||
| 		e->savefd[1] = 0; /* no need to re-restore this */ | 		e->savefd[1] = 0; /* no need to re-restore this */ | ||||||
| 		/* Let exchild() close 0 in parent, after fork, before wait */ | 		/* Let exchild() close 0 in parent, after fork, before wait */ | ||||||
| 		i = exchild(t, flags|XPCLOSE, 0); | 		i = exchild(t, flags | XPCLOSE, xerrok, 0); | ||||||
| 		if (!(flags&XBGND) && !(flags&XXCOM)) | 		if (!(flags&XBGND) && !(flags&XXCOM)) | ||||||
| 			rv = i; | 			rv = i; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TLIST: | 	case TLIST: | ||||||
| 		while (t->type == TLIST) { | 		while (t->type == TLIST) { | ||||||
| 			execute(t->left, flags & XERROK); | 			execute(t->left, flags & XERROK, NULL); | ||||||
| 			t = t->right; | 			t = t->right; | ||||||
| 		} | 		} | ||||||
| 		rv = execute(t, flags & XERROK); | 		rv = execute(t, flags & XERROK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TCOPROC: | 	case TCOPROC: | ||||||
| @@ -191,8 +194,8 @@ execute(struct op *volatile t, | |||||||
| 		 * job is actually created. | 		 * job is actually created. | ||||||
| 		 */ | 		 */ | ||||||
| 		flags &= ~XEXEC; | 		flags &= ~XEXEC; | ||||||
| 		exchild(t->left, flags|XBGND|XFORK|XCOPROC|XCCLOSE, | 		exchild(t->left, flags | XBGND | XFORK | XCOPROC | XCCLOSE, | ||||||
| 		    coproc.readw); | 		    NULL, coproc.readw); | ||||||
| 		break; | 		break; | ||||||
| 	    } | 	    } | ||||||
|  |  | ||||||
| @@ -201,20 +204,24 @@ execute(struct op *volatile t, | |||||||
| 		 * forks again for async...  parent should optimise | 		 * forks again for async...  parent should optimise | ||||||
| 		 * this to "foo &"... | 		 * this to "foo &"... | ||||||
| 		 */ | 		 */ | ||||||
| 		rv = execute(t->left, (flags&~XEXEC)|XBGND|XFORK); | 		rv = execute(t->left, (flags&~XEXEC)|XBGND|XFORK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TOR: | 	case TOR: | ||||||
| 	case TAND: | 	case TAND: | ||||||
| 		rv = execute(t->left, XERROK); | 		rv = execute(t->left, XERROK, xerrok); | ||||||
| 		if (t->right != NULL && (rv == 0) == (t->type == TAND)) | 		if ((rv == 0) == (t->type == TAND)) | ||||||
| 			rv = execute(t->right, flags & XERROK); | 			rv = execute(t->right, XERROK, xerrok); | ||||||
| 		else |  | ||||||
| 		flags |= XERROK; | 		flags |= XERROK; | ||||||
|  | 		if (xerrok) | ||||||
|  | 			*xerrok = 1; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TBANG: | 	case TBANG: | ||||||
| 		rv = !execute(t->right, XERROK); | 		rv = !execute(t->right, XERROK, xerrok); | ||||||
|  | 		flags |= XERROK; | ||||||
|  | 		if (xerrok) | ||||||
|  | 			*xerrok = 1; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TDBRACKET: | 	case TDBRACKET: | ||||||
| @@ -257,7 +264,7 @@ execute(struct op *volatile t, | |||||||
| 		if (t->type == TFOR) { | 		if (t->type == TFOR) { | ||||||
| 			while (*ap != NULL) { | 			while (*ap != NULL) { | ||||||
| 				setstr(global(t->str), *ap++, KSH_UNWIND_ERROR); | 				setstr(global(t->str), *ap++, KSH_UNWIND_ERROR); | ||||||
| 				rv = execute(t->left, flags & XERROK); | 				rv = execute(t->left, flags & XERROK, xerrok); | ||||||
| 			} | 			} | ||||||
| 		} else { /* TSELECT */ | 		} else { /* TSELECT */ | ||||||
| 			for (;;) { | 			for (;;) { | ||||||
| @@ -267,7 +274,7 @@ execute(struct op *volatile t, | |||||||
| 				} | 				} | ||||||
| 				is_first = false; | 				is_first = false; | ||||||
| 				setstr(global(t->str), cp, KSH_UNWIND_ERROR); | 				setstr(global(t->str), cp, KSH_UNWIND_ERROR); | ||||||
| 				rv = execute(t->left, flags & XERROK); | 				rv = execute(t->left, flags & XERROK, xerrok); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	    } | 	    } | ||||||
| @@ -290,17 +297,18 @@ execute(struct op *volatile t, | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		rv = 0; /* in case of a continue */ | 		rv = 0; /* in case of a continue */ | ||||||
| 		while ((execute(t->left, XERROK) == 0) == (t->type == TWHILE)) | 		while ((execute(t->left, XERROK, NULL) == 0) == | ||||||
| 			rv = execute(t->right, flags & XERROK); | 		    (t->type == TWHILE)) | ||||||
|  | 			rv = execute(t->right, flags & XERROK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TIF: | 	case TIF: | ||||||
| 	case TELIF: | 	case TELIF: | ||||||
| 		if (t->right == NULL) | 		if (t->right == NULL) | ||||||
| 			break;	/* should be error */ | 			break;	/* should be error */ | ||||||
| 		rv = execute(t->left, XERROK) == 0 ? | 		rv = execute(t->left, XERROK, NULL) == 0 ? | ||||||
| 		    execute(t->right->left, flags & XERROK) : | 		    execute(t->right->left, flags & XERROK, xerrok) : | ||||||
| 		    execute(t->right->right, flags & XERROK); | 		    execute(t->right->right, flags & XERROK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TCASE: | 	case TCASE: | ||||||
| @@ -312,11 +320,11 @@ execute(struct op *volatile t, | |||||||
| 				goto Found; | 				goto Found; | ||||||
| 		break; | 		break; | ||||||
|  Found: |  Found: | ||||||
| 		rv = execute(t->left, flags & XERROK); | 		rv = execute(t->left, flags & XERROK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TBRACE: | 	case TBRACE: | ||||||
| 		rv = execute(t->left, flags & XERROK); | 		rv = execute(t->left, flags & XERROK, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TFUNCT: | 	case TFUNCT: | ||||||
| @@ -327,7 +335,7 @@ execute(struct op *volatile t, | |||||||
| 		/* Clear XEXEC so nested execute() call doesn't exit | 		/* Clear XEXEC so nested execute() call doesn't exit | ||||||
| 		 * (allows "ls -l | time grep foo"). | 		 * (allows "ls -l | time grep foo"). | ||||||
| 		 */ | 		 */ | ||||||
| 		rv = timex(t, flags & ~XEXEC); | 		rv = timex(t, flags & ~XEXEC, xerrok); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case TEXEC:		/* an eval'd TCOM */ | 	case TEXEC:		/* an eval'd TCOM */ | ||||||
| @@ -353,7 +361,8 @@ execute(struct op *volatile t, | |||||||
| 	quitenv(NULL);		/* restores IO */ | 	quitenv(NULL);		/* restores IO */ | ||||||
| 	if ((flags&XEXEC)) | 	if ((flags&XEXEC)) | ||||||
| 		unwind(LEXIT);	/* exit child */ | 		unwind(LEXIT);	/* exit child */ | ||||||
| 	if (rv != 0 && !(flags & XERROK)) { | 	if (rv != 0 && !(flags & XERROK) && | ||||||
|  | 	    (xerrok == NULL || !*xerrok)) { | ||||||
| 		trapsig(SIGERR_); | 		trapsig(SIGERR_); | ||||||
| 		if (Flag(FERREXIT)) | 		if (Flag(FERREXIT)) | ||||||
| 			unwind(LERROR); | 			unwind(LERROR); | ||||||
| @@ -367,7 +376,7 @@ execute(struct op *volatile t, | |||||||
|  |  | ||||||
| static int | static int | ||||||
| comexec(struct op *t, struct tbl *volatile tp, const char **ap, | comexec(struct op *t, struct tbl *volatile tp, const char **ap, | ||||||
|     volatile int flags) |     volatile int flags, volatile int *xerrok) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	volatile int rv = 0; | 	volatile int rv = 0; | ||||||
| @@ -579,7 +588,7 @@ comexec(struct op *t, struct tbl *volatile tp, const char **ap, | |||||||
| 		i = sigsetjmp(e->jbuf, 0); | 		i = sigsetjmp(e->jbuf, 0); | ||||||
| 		if (i == 0) { | 		if (i == 0) { | ||||||
| 			/* seems odd to pass XERROK here, but at&t ksh does */ | 			/* seems odd to pass XERROK here, but at&t ksh does */ | ||||||
| 			exstat = execute(tp->val.t, flags & XERROK); | 			exstat = execute(tp->val.t, flags & XERROK, xerrok); | ||||||
| 			i = LRETURN; | 			i = LRETURN; | ||||||
| 		} | 		} | ||||||
| 		kshname = old_kshname; | 		kshname = old_kshname; | ||||||
| @@ -652,7 +661,7 @@ comexec(struct op *t, struct tbl *volatile tp, const char **ap, | |||||||
| 		texec.left = t;	/* for tprint */ | 		texec.left = t;	/* for tprint */ | ||||||
| 		texec.str = tp->val.s; | 		texec.str = tp->val.s; | ||||||
| 		texec.args = ap; | 		texec.args = ap; | ||||||
| 		rv = exchild(&texec, flags, -1); | 		rv = exchild(&texec, flags, xerrok, -1); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  Leave: |  Leave: | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								funcs.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								funcs.c
									
									
									
									
									
								
							| @@ -1,11 +1,11 @@ | |||||||
| /*	$OpenBSD: c_ksh.c,v 1.31 2008/05/17 23:31:52 sobrado Exp $	*/ | /*	$OpenBSD: c_ksh.c,v 1.31 2008/05/17 23:31:52 sobrado Exp $	*/ | ||||||
| /*	$OpenBSD: c_sh.c,v 1.38 2008/07/23 16:34:38 jaredy Exp $	*/ | /*	$OpenBSD: c_sh.c,v 1.39 2009/01/29 23:27:26 jaredy Exp $	*/ | ||||||
| /*	$OpenBSD: c_test.c,v 1.17 2005/03/30 17:16:37 deraadt Exp $	*/ | /*	$OpenBSD: c_test.c,v 1.17 2005/03/30 17:16:37 deraadt Exp $	*/ | ||||||
| /*	$OpenBSD: c_ulimit.c,v 1.17 2008/03/21 12:51:19 millert Exp $	*/ | /*	$OpenBSD: c_ulimit.c,v 1.17 2008/03/21 12:51:19 millert Exp $	*/ | ||||||
|  |  | ||||||
| #include "sh.h" | #include "sh.h" | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.95 2009/03/15 16:13:39 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.96 2009/03/22 17:47:36 tg Exp $"); | ||||||
|  |  | ||||||
| /* A leading = means assignments before command are kept; | /* A leading = means assignments before command are kept; | ||||||
|  * a leading * means a POSIX special builtin; |  * a leading * means a POSIX special builtin; | ||||||
| @@ -2196,7 +2196,7 @@ c_times(const char **wp __unused) | |||||||
|  * time pipeline (really a statement, not a built-in command) |  * time pipeline (really a statement, not a built-in command) | ||||||
|  */ |  */ | ||||||
| int | int | ||||||
| timex(struct op *t, int f) | timex(struct op *t, int f, volatile int *xerrok) | ||||||
| { | { | ||||||
| #define TF_NOARGS	BIT(0) | #define TF_NOARGS	BIT(0) | ||||||
| #define TF_NOREAL	BIT(1)		/* don't report real time */ | #define TF_NOREAL	BIT(1)		/* don't report real time */ | ||||||
| @@ -2222,7 +2222,7 @@ timex(struct op *t, int f) | |||||||
| 		 */ | 		 */ | ||||||
| 		timerclear(&j_usrtime); | 		timerclear(&j_usrtime); | ||||||
| 		timerclear(&j_systime); | 		timerclear(&j_systime); | ||||||
| 		rv = execute(t->left, f | XTIME); | 		rv = execute(t->left, f | XTIME, xerrok); | ||||||
| 		if (t->left->type == TCOM) | 		if (t->left->type == TCOM) | ||||||
| 			tf |= t->left->str[0]; | 			tf |= t->left->str[0]; | ||||||
| 		gettimeofday(&tv1, NULL); | 		gettimeofday(&tv1, NULL); | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								jobs.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								jobs.c
									
									
									
									
									
								
							| @@ -1,8 +1,8 @@ | |||||||
| /*	$OpenBSD: jobs.c,v 1.36 2007/09/06 19:57:47 otto Exp $	*/ | /*	$OpenBSD: jobs.c,v 1.37 2009/01/29 23:27:26 jaredy Exp $	*/ | ||||||
|  |  | ||||||
| #include "sh.h" | #include "sh.h" | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.44 2009/02/23 16:17:44 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.45 2009/03/22 17:47:37 tg Exp $"); | ||||||
|  |  | ||||||
| /* Order important! */ | /* Order important! */ | ||||||
| #define PRUNNING	0 | #define PRUNNING	0 | ||||||
| @@ -289,7 +289,9 @@ j_change(void) | |||||||
|  |  | ||||||
| /* execute tree in child subprocess */ | /* execute tree in child subprocess */ | ||||||
| int | int | ||||||
| exchild(struct op *t, int flags, /* used if XPCLOSE or XCCLOSE */ int close_fd) | exchild(struct op *t, int flags, | ||||||
|  |     volatile int *xerrok, | ||||||
|  |     /* used if XPCLOSE or XCCLOSE */ int close_fd) | ||||||
| { | { | ||||||
| 	static Proc	*last_proc;	/* for pipelines */ | 	static Proc	*last_proc;	/* for pipelines */ | ||||||
|  |  | ||||||
| @@ -305,7 +307,7 @@ exchild(struct op *t, int flags, /* used if XPCLOSE or XCCLOSE */ int close_fd) | |||||||
| 		/* Clear XFORK|XPCLOSE|XCCLOSE|XCOPROC|XPIPEO|XPIPEI|XXCOM|XBGND | 		/* Clear XFORK|XPCLOSE|XCCLOSE|XCOPROC|XPIPEO|XPIPEI|XXCOM|XBGND | ||||||
| 		 * (also done in another execute() below) | 		 * (also done in another execute() below) | ||||||
| 		 */ | 		 */ | ||||||
| 		return execute(t, flags & (XEXEC | XERROK)); | 		return execute(t, flags & (XEXEC | XERROK), xerrok); | ||||||
|  |  | ||||||
| 	/* no SIGCHLDs while messing with job and process lists */ | 	/* no SIGCHLDs while messing with job and process lists */ | ||||||
| 	sigprocmask(SIG_BLOCK, &sm_sigchld, &omask); | 	sigprocmask(SIG_BLOCK, &sm_sigchld, &omask); | ||||||
| @@ -430,7 +432,8 @@ exchild(struct op *t, int flags, /* used if XPCLOSE or XCCLOSE */ int close_fd) | |||||||
| 		Flag(FTALKING) = 0; | 		Flag(FTALKING) = 0; | ||||||
| 		tty_close(); | 		tty_close(); | ||||||
| 		cleartraps(); | 		cleartraps(); | ||||||
| 		execute(t, (flags & XERROK) | XEXEC); /* no return */ | 		/* no return */ | ||||||
|  | 		execute(t, (flags & XERROK) | XEXEC, NULL); | ||||||
| #ifndef MKSH_SMALL | #ifndef MKSH_SMALL | ||||||
| 		if (t->type == TPIPE) | 		if (t->type == TPIPE) | ||||||
| 			unwind(LLEAVE); | 			unwind(LLEAVE); | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								main.c
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| /*	$OpenBSD: main.c,v 1.44 2008/07/05 07:25:18 djm Exp $	*/ | /*	$OpenBSD: main.c,v 1.45 2009/01/29 23:27:26 jaredy Exp $	*/ | ||||||
| /*	$OpenBSD: tty.c,v 1.9 2006/03/14 22:08:01 deraadt Exp $	*/ | /*	$OpenBSD: tty.c,v 1.9 2006/03/14 22:08:01 deraadt Exp $	*/ | ||||||
| /*	$OpenBSD: io.c,v 1.22 2006/03/17 16:30:13 millert Exp $	*/ | /*	$OpenBSD: io.c,v 1.22 2006/03/17 16:30:13 millert Exp $	*/ | ||||||
| /*	$OpenBSD: table.c,v 1.13 2009/01/17 22:06:44 millert Exp $	*/ | /*	$OpenBSD: table.c,v 1.13 2009/01/17 22:06:44 millert Exp $	*/ | ||||||
| @@ -13,7 +13,7 @@ | |||||||
| #include <locale.h> | #include <locale.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| __RCSID("$MirOS: src/bin/mksh/main.c,v 1.121 2009/03/22 17:31:16 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/main.c,v 1.122 2009/03/22 17:47:37 tg Exp $"); | ||||||
|  |  | ||||||
| extern char **environ; | extern char **environ; | ||||||
|  |  | ||||||
| @@ -566,7 +566,7 @@ shell(Source * volatile s, volatile int toplevel) | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if (t && (!Flag(FNOEXEC) || (s->flags & SF_TTY))) | 		if (t && (!Flag(FNOEXEC) || (s->flags & SF_TTY))) | ||||||
| 			exstat = execute(t, 0); | 			exstat = execute(t, 0, NULL); | ||||||
|  |  | ||||||
| 		if (t != NULL && t->type != TEOF && interactive && really_exit) | 		if (t != NULL && t->type != TEOF && interactive && really_exit) | ||||||
| 			really_exit = 0; | 			really_exit = 0; | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								sh.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								sh.h
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
| /*	$OpenBSD: tree.h,v 1.10 2005/03/28 21:28:22 deraadt Exp $	*/ | /*	$OpenBSD: tree.h,v 1.10 2005/03/28 21:28:22 deraadt Exp $	*/ | ||||||
| /*	$OpenBSD: expand.h,v 1.6 2005/03/30 17:16:37 deraadt Exp $	*/ | /*	$OpenBSD: expand.h,v 1.6 2005/03/30 17:16:37 deraadt Exp $	*/ | ||||||
| /*	$OpenBSD: lex.h,v 1.11 2006/05/29 18:22:24 otto Exp $	*/ | /*	$OpenBSD: lex.h,v 1.11 2006/05/29 18:22:24 otto Exp $	*/ | ||||||
| /*	$OpenBSD: proto.h,v 1.31 2009/01/17 22:06:44 millert Exp $	*/ | /*	$OpenBSD: proto.h,v 1.32 2009/01/29 23:27:26 jaredy Exp $	*/ | ||||||
| /*	$OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $	*/ | /*	$OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $	*/ | ||||||
| /*	$OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $	*/ | /*	$OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $	*/ | ||||||
|  |  | ||||||
| @@ -102,7 +102,7 @@ | |||||||
| #define __SCCSID(x)	__IDSTRING(sccsid,x) | #define __SCCSID(x)	__IDSTRING(sccsid,x) | ||||||
|  |  | ||||||
| #ifdef EXTERN | #ifdef EXTERN | ||||||
| __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.281 2009/03/22 17:31:17 tg Exp $"); | __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.282 2009/03/22 17:47:38 tg Exp $"); | ||||||
| #endif | #endif | ||||||
| #define MKSH_VERSION "R36 2009/03/17" | #define MKSH_VERSION "R36 2009/03/17" | ||||||
|  |  | ||||||
| @@ -1289,7 +1289,7 @@ char *debunk(char *, const char *, size_t); | |||||||
| void expand(const char *, XPtrV *, int); | void expand(const char *, XPtrV *, int); | ||||||
| int glob_str(char *, XPtrV *, int); | int glob_str(char *, XPtrV *, int); | ||||||
| /* exec.c */ | /* exec.c */ | ||||||
| int execute(struct op * volatile, volatile int); | int execute(struct op * volatile, volatile int, volatile int *); | ||||||
| int shcomexec(const char **); | int shcomexec(const char **); | ||||||
| struct tbl *findfunc(const char *, unsigned int, int); | struct tbl *findfunc(const char *, unsigned int, int); | ||||||
| int define(const char *, struct op *); | int define(const char *, struct op *); | ||||||
| @@ -1334,7 +1334,7 @@ int c_set(const char **); | |||||||
| int c_unset(const char **); | int c_unset(const char **); | ||||||
| int c_ulimit(const char **); | int c_ulimit(const char **); | ||||||
| int c_times(const char **); | int c_times(const char **); | ||||||
| int timex(struct op *, int); | int timex(struct op *, int, volatile int *); | ||||||
| void timex_hook(struct op *, char ** volatile *); | void timex_hook(struct op *, char ** volatile *); | ||||||
| int c_exec(const char **); | int c_exec(const char **); | ||||||
| int c_builtin(const char **); | int c_builtin(const char **); | ||||||
| @@ -1383,7 +1383,7 @@ void setexecsig(Trap *, int); | |||||||
| void j_init(int); | void j_init(int); | ||||||
| void j_exit(void); | void j_exit(void); | ||||||
| void j_change(void); | void j_change(void); | ||||||
| int exchild(struct op *, int, int); | int exchild(struct op *, int, volatile int *, int); | ||||||
| void startlast(void); | void startlast(void); | ||||||
| int waitlast(void); | int waitlast(void); | ||||||
| int waitfor(const char *, int *); | int waitfor(const char *, int *); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user