136 lines
4.0 KiB
Diff
136 lines
4.0 KiB
Diff
|
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);
|
||
|
}
|