123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- From: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
- Date: Thu, 19 Apr 2018 18:16:12 +0800
- > ash originally had support for omitting the fork when expanding a
- > builtin in backquotes. dash has gradually been removing this support,
- > most recently in commit 66b614e29038e31745c4a5d296f64f8d64f5c377
- > ("[EVAL] Remove unused EV_BACKCMD flag").
- >
- > Some traces still remain, however. Remove:
- >
- > - the buf and nleft elements of the backcmd structure;
- > - a misleading comment regarding handling of builtins.
- >
- > Signed-off-by: Ron Yorston <rmy@xxxxxxxxxxxx>
- Unfortunately we may need this at some point in the future due
- to changes in POSIX. So let's keep it around for now until we
- get things such as `jobs -p` to work.
- *************************************
- From: Ron Yorston <rmy@xxxxxxxxxxxx>
- Date: Thu, 19 Apr 2018 17:18:47 +0100
- >Unfortunately we may need this at some point in the future due
- >to changes in POSIX. So let's keep it around for now until we
- >get things such as `jobs -p` to work.
- As you wish.
- Something even more trivial I noticed later: the TRACE at the end of
- expbackq incorrectly refers to the function as evalbackq.
- *************************************
- Date: Tue, 10 Apr 2018 13:23:35 +0100
- From: Ron Yorston <rmy@pobox.com>
- To: busybox@busybox.net
- Subject: [PATCH] ash: remove unnecessary code in backquote expansion
- Some traces remain of ash's ancient support for omitting the fork when
- expanding a builtin command in backquotes.
- Remove:
- - the buf and nleft elements of the backcmd structure;
- - a misleading comment regarding handling of builtins.
- I've submitted a similar patch to dash.
- Signed-off-by: Ron Yorston <rmy@pobox.com>
- ---
- shell/ash.c | 37 +++++++++----------------------------
- 1 file changed, 9 insertions(+), 28 deletions(-)
- diff --git a/shell/ash.c b/shell/ash.c
- index 45c747dbc..6f1458722 100644
- --- a/shell/ash.c
- +++ b/shell/ash.c
- @@ -6356,15 +6356,12 @@ exptilde(char *startp, char *p, int flags)
- }
-
- /*
- - * Execute a command inside back quotes. If it's a builtin command, we
- - * want to save its output in a block obtained from malloc. Otherwise
- - * we fork off a subprocess and get the output of the command via a pipe.
- - * Should be called with interrupts off.
- + * Execute a command inside back quotes. We fork off a subprocess and
- + * get the output of the command via a pipe. Should be called with
- + * interrupts off.
- */
- struct backcmd { /* result of evalbackcmd */
- int fd; /* file descriptor to read from */
- - int nleft; /* number of chars in buffer */
- - char *buf; /* buffer */
- struct job *jp; /* job structure for command */
- };
-
- @@ -6394,8 +6391,6 @@ evalbackcmd(union node *n, struct backcmd *result)
- struct job *jp;
-
- result->fd = -1;
- - result->buf = NULL;
- - result->nleft = 0;
- result->jp = NULL;
- if (n == NULL) {
- goto out;
- @@ -6432,8 +6427,7 @@ evalbackcmd(union node *n, struct backcmd *result)
- 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));
- + TRACE(("evalbackcmd done: fd=%d jp=0x%x\n", result->fd, result->jp));
- }
-
- /*
- @@ -6445,7 +6439,6 @@ expbackq(union node *cmd, int flag)
- struct backcmd in;
- int i;
- char buf[128];
- - char *p;
- char *dest;
- int startloc;
- int syntax = flag & EXP_QUOTED ? DQSYNTAX : BASESYNTAX;
- @@ -6457,24 +6450,12 @@ expbackq(union node *cmd, int flag)
- evalbackcmd(cmd, &in);
- popstackmark(&smark);
-
- - p = in.buf;
- - i = in.nleft;
- - if (i == 0)
- - goto read;
- - for (;;) {
- - memtodest(p, i, syntax, flag & QUOTES_ESC);
- - read:
- - if (in.fd < 0)
- - break;
- - i = nonblock_immune_read(in.fd, buf, sizeof(buf));
- - TRACE(("expbackq: read returns %d\n", i));
- - if (i <= 0)
- - break;
- - p = buf;
- - }
- -
- - free(in.buf);
- if (in.fd >= 0) {
- + while ((i = nonblock_immune_read(in.fd, buf, sizeof(buf))) > 0) {
- + TRACE(("expbackq: read returns %d\n", i));
- + memtodest(buf, i, syntax, flag & QUOTES_ESC);
- + }
- +
- close(in.fd);
- back_exitstatus = waitforjob(in.jp);
- }
|