klibc-bot for Jonathan Nieder
2012-Jul-02 09:12 UTC
[klibc] [klibc:master] [EVAL] Remove unused EV_BACKCMD flag
Commit-ID: 4467d6e5caa5c97023c824114cf76c7d862340e5 Gitweb: http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=4467d6e5caa5c97023c824114cf76c7d862340e5 Author: Jonathan Nieder <jrnieder at gmail.com> AuthorDate: Thu, 7 Jul 2011 11:55:42 +0800 Committer: maximilian attems <max at stro.at> CommitDate: Mon, 2 Jul 2012 10:38:03 +0200 [klibc] [EVAL] Remove unused EV_BACKCMD flag The original ash defered forking commands in backquotes so builtins could be run in the same context as the shell. This behavior was controlled using the EV_BACKCMD to evaltree. Unfortunately, as Matthias Scheler noticed in 1999 (NetBSD PR/7814), the result was counterintuitive; for example, echo "`cd /`" would change the cwd. So ash 0.3.5 left out that optimization. The EV_BACKCMD codepath stayed around, unused. Some time between ash 0.3.5-11 and ash 0.3.8-37, Debian ash omitted the EV_BACKCMD pathway by guarding it with #ifdef notyet. In dash 0.5.1 and later, the commented code is no more. Let's finish the job and remove the last vestiges. If someone wants to work on omitting the fork in backcmd, the remaining hints are not going to be very helpful, anyway. Signed-off-by: Jonathan Nieder <jrnieder at gmail.com> Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au> Signed-off-by: maximilian attems <max at stro.at> --- usr/dash/eval.c | 64 ++++++++++++++++-------------------------------------- 1 files changed, 19 insertions(+), 45 deletions(-) diff --git a/usr/dash/eval.c b/usr/dash/eval.c index 26302a7..d675ba7 100644 --- a/usr/dash/eval.c +++ b/usr/dash/eval.c @@ -68,7 +68,6 @@ /* flags in argument to evaltree */ #define EV_EXIT 01 /* exit after evaluating tree */ #define EV_TESTED 02 /* exit status is checked; ignore -e flag */ -#define EV_BACKCMD 04 /* command executing within back quotes */ int evalskip; /* set if we are skipping commands */ STATIC int skipcount; /* number of levels to skip */ @@ -594,6 +593,9 @@ evalpipe(union node *n, int flags) void evalbackcmd(union node *n, struct backcmd *result) { + int pip[2]; + struct job *jp; + result->fd = -1; result->buf = NULL; result->nleft = 0; @@ -602,52 +604,24 @@ evalbackcmd(union node *n, struct backcmd *result) goto out; } -#ifdef notyet - /* - * For now we disable executing builtins in the same - * context as the shell, because we are not keeping - * enough state to recover from changes that are - * supposed only to affect subshells. eg. echo "`cd /`" - */ - if (n->type == NCMD) { - struct ifsregion saveifs; - struct ifsregion *savelastp; - struct nodelist *saveargbackq; - - saveifs = ifsfirst; - savelastp = ifslastp; - saveargbackq = argbackq; - - exitstatus = oexitstatus; - evalcommand(n, EV_BACKCMD, result); - - ifsfirst = saveifs; - ifslastp = savelastp; - argbackq = saveargbackq; - } else -#endif - { - int pip[2]; - struct job *jp; - - if (pipe(pip) < 0) - sh_error("Pipe call failed"); - jp = makejob(n, 1); - if (forkshell(jp, n, FORK_NOJOB) == 0) { - FORCEINTON; - close(pip[0]); - if (pip[1] != 1) { - dup2(pip[1], 1); - close(pip[1]); - } - ifsfree(); - evaltreenr(n, EV_EXIT); - /* NOTREACHED */ + if (pipe(pip) < 0) + sh_error("Pipe call failed"); + jp = makejob(n, 1); + if (forkshell(jp, n, FORK_NOJOB) == 0) { + FORCEINTON; + close(pip[0]); + if (pip[1] != 1) { + dup2(pip[1], 1); + close(pip[1]); } - close(pip[1]); - result->fd = pip[0]; - result->jp = jp; + ifsfree(); + evaltreenr(n, EV_EXIT); + /* NOTREACHED */ } + close(pip[1]); + result->fd = pip[0]; + result->jp = jp; + out: TRACE(("evalbackcmd done: fd=%d buf=0x%x nleft=%d jp=0x%x\n", result->fd, result->buf, result->nleft, result->jp));
Reasonably Related Threads
- klibc 1.5.23 release
- [klibc:update-dash] dash: eval: Reset handler when entering a subshell
- [klibc:update-dash] eval: Return status in eval functions
- [klibc:update-dash] dash: eval: Return status in eval functions
- [klibc:update-dash] dash: expand: Do not reprocess data when expanding words