--- trunk/mkinitrd-magellan/klibc/usr/dash/eval.c 2010/07/22 07:47:49 1121 +++ trunk/mkinitrd-magellan/klibc/usr/dash/eval.c 2010/08/18 21:11:40 1122 @@ -97,7 +97,7 @@ #else STATIC void evalcommand(union node *, int); #endif -STATIC int evalbltin(const struct builtincmd *, int, char **); +STATIC int evalbltin(const struct builtincmd *, int, char **, int); STATIC int evalfun(struct funcnode *, int, char **, int); STATIC void prehash(union node *); STATIC int eprintlist(struct output *, struct strlist *, int); @@ -129,8 +129,7 @@ * The eval commmand. */ -int -evalcmd(int argc, char **argv) +static int evalcmd(int argc, char **argv, int flags) { char *p; char *concat; @@ -150,7 +149,7 @@ STPUTC('\0', concat); p = grabstackstr(concat); } - return evalstring(p, ~SKIPEVAL); + return evalstring(p, flags & EV_TESTED); } return 0; } @@ -161,7 +160,7 @@ */ int -evalstring(char *s, int mask) +evalstring(char *s, int flags) { union node *n; struct stackmark smark; @@ -172,7 +171,7 @@ status = 0; while ((n = parsecmd(0)) != NEOF) { - evaltree(n, 0); + evaltree(n, flags); status = exitstatus; popstackmark(&smark); if (evalskip) @@ -180,7 +179,6 @@ } popfile(); - evalskip &= mask; return status; } @@ -311,22 +309,25 @@ break; } out: - if ((checkexit & exitstatus)) - evalskip |= SKIPEVAL; - else if (pendingsigs && dotrap()) - goto exexit; - - if (flags & EV_EXIT) { -exexit: + if ((checkexit & exitstatus) || + (pendingsigs && dotrap()) || + (flags & EV_EXIT)) exraise(EXEXIT); - } } #if !defined(__alpha__) || (defined(__GNUC__) && __GNUC__ >= 3) STATIC #endif -void evaltreenr(union node *, int) __attribute__ ((alias("evaltree"))); +void evaltreenr(union node *n, int flags) +#ifdef HAVE_ATTRIBUTE_ALIAS + __attribute__ ((alias("evaltree"))); +#else +{ + evaltree(n, flags); + abort(); +} +#endif STATIC void @@ -377,7 +378,7 @@ setstackmark(&smark); arglist.lastp = &arglist.list; for (argp = n->nfor.args ; argp ; argp = argp->narg.next) { - expandarg(argp, &arglist, EXP_FULL | EXP_TILDE | EXP_RECORD); + expandarg(argp, &arglist, EXP_FULL | EXP_TILDE); /* XXX */ if (evalskip) goto out; @@ -577,8 +578,6 @@ void evalbackcmd(union node *n, struct backcmd *result) { - int saveherefd; - result->fd = -1; result->buf = NULL; result->nleft = 0; @@ -587,9 +586,6 @@ goto out; } - saveherefd = herefd; - herefd = -1; - #ifdef notyet /* * For now we disable executing builtins in the same @@ -636,7 +632,6 @@ result->fd = pip[0]; result->jp = jp; } - herefd = saveherefd; out: TRACE(("evalbackcmd done: fd=%d buf=0x%x nleft=%d jp=0x%x\n", result->fd, result->buf, result->nleft, result->jp)); @@ -727,7 +722,9 @@ argc++; } - argv = nargv = stalloc(sizeof (char *) * (argc + 1)); + /* Reserve one extra spot at the front for shellexec. */ + nargv = stalloc(sizeof (char *) * (argc + 2)); + argv = ++nargv; for (sp = arglist.list ; sp ; sp = sp->next) { TRACE(("evalcommand arg: %s\n", sp->text)); *nargv++ = sp->text; @@ -857,22 +854,15 @@ } listsetvar(list, i); } - if (evalbltin(cmdentry.u.cmd, argc, argv)) { + if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) { int status; - int i, j; + int i; i = exception; if (i == EXEXIT) goto raise; - status = 2; - j = 0; - if (i == EXINT) - j = SIGINT; - if (i == EXSIG) - j = pendingsigs; - if (j) - status = j + 128; + status = (i == EXINT) ? SIGINT + 128 : 2; exitstatus = status; if (i == EXINT || spclbltin > 0) { @@ -902,10 +892,12 @@ } STATIC int -evalbltin(const struct builtincmd *cmd, int argc, char **argv) { +evalbltin(const struct builtincmd *cmd, int argc, char **argv, int flags) +{ char *volatile savecmdname; struct jmploc *volatile savehandler; struct jmploc jmploc; + int status; int i; savecmdname = commandname; @@ -916,13 +908,16 @@ commandname = argv[0]; argptr = argv + 1; optptr = NULL; /* initialize nextopt */ - exitstatus = (*cmd->builtin)(argc, argv); + if (cmd == EVALCMD) + status = evalcmd(argc, argv, flags); + else + status = (*cmd->builtin)(argc, argv); flushall(); + status |= outerr(out1); + exitstatus = status; cmddone: - exitstatus |= outerr(out1); freestdout(); commandname = savecmdname; - exsig = 0; handler = savehandler; return i; @@ -1027,7 +1022,7 @@ int n = argc > 1 ? number(argv[1]) : 1; if (n <= 0) - sh_error(illnum, argv[1]); + badnum(argv[1]); if (n > loopnest) n = loopnest; if (n > 0) {