diff options
Diffstat (limited to '')
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | src/eval.c | 6 | ||||
-rw-r--r-- | src/redir.c | 14 |
3 files changed, 6 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog index 4fc35a6..1fd184b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * Fix poplocalvar on abnormal exit from function. * Do not poplocalvars prematurely on regular utilities. + * Move null redirect checks into caller. 2010-05-26 Herbert Xu <herbert@gondor.apana.org.au> diff --git a/src/eval.c b/src/eval.c index 337667f..59bded9 100644 --- a/src/eval.c +++ b/src/eval.c @@ -224,7 +224,8 @@ evaltree(union node *n, int flags) evaltree(n->nredir.n, flags & EV_TESTED); status = exitstatus; } - popredir(0); + if (n->nredir.redirect) + popredir(0); goto setstatus; case NCMD: #ifdef notyet @@ -879,7 +880,8 @@ raise: } out: - popredir(execcmd); + if (cmd->ncmd.redirect) + popredir(execcmd); unwindlocalvars(localvar_stop); if (lastarg) /* dsl: I think this is intended to be used to support diff --git a/src/redir.c b/src/redir.c index 54af96b..16decfc 100644 --- a/src/redir.c +++ b/src/redir.c @@ -72,12 +72,10 @@ MKINIT struct redirtab { struct redirtab *next; int renamed[10]; - int nullredirs; }; MKINIT struct redirtab *redirlist; -MKINIT int nullredirs; STATIC int openredirect(union node *); #ifdef notyet @@ -113,7 +111,6 @@ redirect(union node *redir, int flags) memory[i] = 0; memory[1] = flags & REDIR_BACKQ; #endif - nullredirs++; if (!redir) { return; } @@ -124,10 +121,8 @@ redirect(union node *redir, int flags) q = ckmalloc(sizeof (struct redirtab)); q->next = redirlist; redirlist = q; - q->nullredirs = nullredirs - 1; for (i = 0 ; i < 10 ; i++) q->renamed[i] = EMPTY; - nullredirs = 0; sv = q; } n = redir; @@ -343,8 +338,6 @@ popredir(int drop) struct redirtab *rp; int i; - if (--nullredirs >= 0) - return; INTOFF; rp = redirlist; for (i = 0 ; i < 10 ; i++) { @@ -364,7 +357,6 @@ popredir(int drop) } } redirlist = rp->next; - nullredirs = rp->nullredirs; ckfree(rp); INTON; } @@ -381,12 +373,8 @@ RESET { /* * Discard all saved file descriptors. */ - for (;;) { - nullredirs = 0; - if (!redirlist) - break; + while (redirlist) popredir(0); - } } #endif |