diff --git a/exec.c b/exec.c index c8dd4c4..75c75a2 100644 --- a/exec.c +++ b/exec.c @@ -22,7 +22,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.96 2011/09/07 15:24:14 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.97 2012/03/31 17:29:58 tg Exp $"); #ifndef MKSH_DEFAULT_EXECSHELL #define MKSH_DEFAULT_EXECSHELL "/bin/sh" @@ -234,8 +234,7 @@ execute(struct op * volatile t, */ sigprocmask(SIG_BLOCK, &sm_sigchld, &omask); e->type = E_ERRH; - i = sigsetjmp(e->jbuf, 0); - if (i) { + if ((i = kshsetjmp(e->jbuf))) { sigprocmask(SIG_SETMASK, &omask, NULL); quitenv(NULL); unwind(i); @@ -337,10 +336,7 @@ execute(struct op * volatile t, (const char **)eval((const char **)t->vars, DOBLANK | DOGLOB | DOTILDE); e->type = E_LOOP; - while (/* CONSTCOND */ 1) { - i = sigsetjmp(e->jbuf, 0); - if (!i) - break; + while ((i = kshsetjmp(e->jbuf))) { if ((e->flags&EF_BRKCONT_PASS) || (i != LBREAK && i != LCONTIN)) { quitenv(NULL); @@ -375,10 +371,7 @@ execute(struct op * volatile t, case TWHILE: case TUNTIL: e->type = E_LOOP; - while (/* CONSTCOND */ 1) { - i = sigsetjmp(e->jbuf, 0); - if (!i) - break; + while ((i = kshsetjmp(e->jbuf))) { if ((e->flags&EF_BRKCONT_PASS) || (i != LBREAK && i != LCONTIN)) { quitenv(NULL); @@ -733,8 +726,7 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap, tp->flag |= FINUSE; e->type = E_FUNC; - i = sigsetjmp(e->jbuf, 0); - if (i == 0) { + if (!(i = kshsetjmp(e->jbuf))) { /* seems odd to pass XERROK here, but AT&T ksh does */ exstat = execute(tp->val.t, flags & XERROK, xerrok); i = LRETURN; @@ -1424,7 +1416,7 @@ hereinval(const char *content, int sub, char **resbuf, struct shf *shf) osource = source; newenv(E_ERRH); - if (sigsetjmp(e->jbuf, 0)) { + if (kshsetjmp(e->jbuf)) { source = osource; quitenv(shf); /* special to iosetup(): don't print error */ diff --git a/expr.c b/expr.c index d920e59..dd95e3c 100644 --- a/expr.c +++ b/expr.c @@ -23,7 +23,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/expr.c,v 1.54 2012/03/29 19:22:58 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/expr.c,v 1.55 2012/03/31 17:29:59 tg Exp $"); /* The order of these enums is constrained by the order of opinfo[] */ enum token { @@ -199,8 +199,7 @@ v_evaluate(struct tbl *vp, const char *expr, volatile int error_ok, curstate.natural = false; newenv(E_ERRH); - i = sigsetjmp(e->jbuf, 0); - if (i) { + if ((i = kshsetjmp(e->jbuf))) { /* Clear EXPRINEVAL in of any variables we were playing with */ if (curstate.evaling) curstate.evaling->flag &= ~EXPRINEVAL; diff --git a/lex.c b/lex.c index e0cf7df..4b7d055 100644 --- a/lex.c +++ b/lex.c @@ -22,7 +22,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.159 2012/03/29 19:23:00 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.160 2012/03/31 17:29:59 tg Exp $"); /* * states while lexing word @@ -1514,7 +1514,7 @@ set_prompt(int to, Source *s) ps1 = shf_sclose(shf); saved_atemp = ATEMP; newenv(E_ERRH); - if (sigsetjmp(e->jbuf, 0)) { + if (kshsetjmp(e->jbuf)) { prompt = safe_prompt; /* * Don't print an error - assume it has already diff --git a/main.c b/main.c index 9791b5a..3598cb0 100644 --- a/main.c +++ b/main.c @@ -34,7 +34,7 @@ #include #endif -__RCSID("$MirOS: src/bin/mksh/main.c,v 1.213 2012/03/31 17:08:52 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/main.c,v 1.214 2012/03/31 17:30:00 tg Exp $"); extern char **environ; @@ -652,8 +652,7 @@ include(const char *name, int argc, const char **argv, int intr_ok) old_argc = 0; } newenv(E_INCL); - i = sigsetjmp(e->jbuf, 0); - if (i) { + if ((i = kshsetjmp(e->jbuf))) { quitenv(s ? s->u.shf : NULL); if (old_argv) { e->loc->argv = old_argv; @@ -728,49 +727,47 @@ shell(Source * volatile s, volatile int toplevel) newenv(E_PARSE); if (interactive) really_exit = 0; - i = sigsetjmp(e->jbuf, 0); - if (i) { - switch (i) { - case LINTR: - /* we get here if SIGINT not caught or ignored */ - case LERROR: - case LSHELL: - if (interactive) { - if (i == LINTR) - shellf("\n"); - /* - * Reset any eof that was read as part of a - * multiline command. - */ - if (Flag(FIGNOREEOF) && s->type == SEOF && - wastty) - s->type = SSTDIN; - /* - * Used by exit command to get back to - * top level shell. Kind of strange since - * interactive is set if we are reading from - * a tty, but to have stopped jobs, one only - * needs FMONITOR set (not FTALKING/SF_TTY)... - */ - /* toss any input we have so far */ - s->start = s->str = null; - break; - } - /* FALLTHROUGH */ - case LEXIT: - case LLEAVE: - case LRETURN: - source = old_source; - quitenv(NULL); - /* keep on going */ - unwind(i); - /* NOTREACHED */ - default: - source = old_source; - quitenv(NULL); - internal_errorf("%s %d", "shell", i); - /* NOTREACHED */ + switch ((i = kshsetjmp(e->jbuf))) { + case 0: + break; + case LINTR: + /* we get here if SIGINT not caught or ignored */ + case LERROR: + case LSHELL: + if (interactive) { + if (i == LINTR) + shellf("\n"); + /* + * Reset any eof that was read as part of a + * multiline command. + */ + if (Flag(FIGNOREEOF) && s->type == SEOF && wastty) + s->type = SSTDIN; + /* + * Used by exit command to get back to + * top level shell. Kind of strange since + * interactive is set if we are reading from + * a tty, but to have stopped jobs, one only + * needs FMONITOR set (not FTALKING/SF_TTY)... + */ + /* toss any input we have so far */ + s->start = s->str = null; + break; } + /* FALLTHROUGH */ + case LEXIT: + case LLEAVE: + case LRETURN: + source = old_source; + quitenv(NULL); + /* keep on going */ + unwind(i); + /* NOTREACHED */ + default: + source = old_source; + quitenv(NULL); + internal_errorf("%s %d", "shell", i); + /* NOTREACHED */ } while (/* CONSTCOND */ 1) { if (trap) @@ -845,7 +842,7 @@ unwind(int i) case E_INCL: case E_LOOP: case E_ERRH: - siglongjmp(e->jbuf, i); + kshlongjmp(e->jbuf, i); /* NOTREACHED */ case E_NONE: if (i == LINTR) diff --git a/sh.h b/sh.h index dca8878..cd59f84 100644 --- a/sh.h +++ b/sh.h @@ -152,7 +152,7 @@ #endif #ifdef EXTERN -__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.538 2012/03/29 19:23:01 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.539 2012/03/31 17:30:00 tg Exp $"); #endif #define MKSH_VERSION "R40 2012/03/29" @@ -582,6 +582,16 @@ enum sh_flag { /* * parsing & execution environment */ +#if defined(NeXT) && !defined(__GLIBC__) +#define kshjmp_buf jmp_buf +#define kshsetjmp(jbuf) _setjmp(jbuf) +#define kshlongjmp _longjmp +#else +#define kshjmp_buf sigjmp_buf +#define kshsetjmp(jbuf) sigsetjmp((jbuf), 0) +#define kshlongjmp siglongjmp +#endif + extern struct env { ALLOC_ITEM alloc_INT; /* internal, do not touch */ Area area; /* temporary allocation area */ @@ -589,7 +599,7 @@ extern struct env { struct block *loc; /* local variables and functions */ short *savefd; /* original redirected fds */ struct temp *temps; /* temp files */ - sigjmp_buf jbuf; /* long jump back to env creator */ + kshjmp_buf jbuf; /* long jump back to env creator */ uint8_t type; /* environment type - see below */ uint8_t flags; /* EF_* */ } *e; @@ -615,7 +625,7 @@ extern struct env { /* Do returns stop at env type e? */ #define STOP_RETURN(t) ((t) == E_FUNC || (t) == E_INCL) -/* values for siglongjmp(e->jbuf, 0) */ +/* values for kshlongjmp(e->jbuf, i) */ #define LRETURN 1 /* return statement */ #define LEXIT 2 /* exit statement */ #define LERROR 3 /* errorf() called */ @@ -898,7 +908,7 @@ EXTERN mksh_ari_t x_lins E_INIT(24); /* tty lines */ /* Used by v_evaluate() and setstr() to control action when error occurs */ -#define KSH_UNWIND_ERROR 0 /* unwind the stack (longjmp) */ +#define KSH_UNWIND_ERROR 0 /* unwind the stack (kshlongjmp) */ #define KSH_RETURN_ERROR 1 /* return 1/0 for success/failure */ /*