1c0ff6aa23
Later, the aports folder will probably get split up in its own repository. But right now this is simply convenient.
91 lines
3.5 KiB
Diff
91 lines
3.5 KiB
Diff
From e139ae307e4fd9eb3b86a6fc2e97b4e212925199 Mon Sep 17 00:00:00 2001
|
|
From: Denys Vlasenko <vda.linux@googlemail.com>
|
|
Date: Wed, 12 Apr 2017 21:02:33 +0200
|
|
Subject: [PATCH 13/14] ash: make shellexec capable of using separate argv[0]
|
|
and filename to exec
|
|
|
|
function old new delta
|
|
execcmd 71 78 +7
|
|
shellexec 221 224 +3
|
|
evalcommand 1158 1161 +3
|
|
------------------------------------------------------------------------------
|
|
(add/remove: 0/0 grow/shrink: 3/0 up/down: 13/0) Total: 13 bytes
|
|
|
|
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
|
---
|
|
shell/ash.c | 21 ++++++++++-----------
|
|
1 file changed, 10 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/shell/ash.c b/shell/ash.c
|
|
index 983f7b1..044f166 100644
|
|
--- a/shell/ash.c
|
|
+++ b/shell/ash.c
|
|
@@ -7744,9 +7744,8 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) char *cmd, char **argv, char **
|
|
* have to change the find_command routine as well.
|
|
* argv[-1] must exist and be writable! See tryexec() for why.
|
|
*/
|
|
-static void shellexec(char **, const char *, int) NORETURN;
|
|
-static void
|
|
-shellexec(char **argv, const char *path, int idx)
|
|
+static void shellexec(char *prog, char **argv, const char *path, int idx) NORETURN;
|
|
+static void shellexec(char *prog, char **argv, const char *path, int idx)
|
|
{
|
|
char *cmdname;
|
|
int e;
|
|
@@ -7755,12 +7754,12 @@ shellexec(char **argv, const char *path, int idx)
|
|
int applet_no = -1; /* used only by FEATURE_SH_STANDALONE */
|
|
|
|
envp = listvars(VEXPORT, VUNSET, /*end:*/ NULL);
|
|
- if (strchr(argv[0], '/') != NULL
|
|
+ if (strchr(prog, '/') != NULL
|
|
#if ENABLE_FEATURE_SH_STANDALONE
|
|
- || (applet_no = find_applet_by_name(argv[0])) >= 0
|
|
+ || (applet_no = find_applet_by_name(prog)) >= 0
|
|
#endif
|
|
) {
|
|
- tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) argv[0], argv, envp);
|
|
+ tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
|
|
if (applet_no >= 0) {
|
|
/* We tried execing ourself, but it didn't work.
|
|
* Maybe /proc/self/exe doesn't exist?
|
|
@@ -7772,7 +7771,7 @@ shellexec(char **argv, const char *path, int idx)
|
|
} else {
|
|
try_PATH:
|
|
e = ENOENT;
|
|
- while ((cmdname = path_advance(&path, argv[0])) != NULL) {
|
|
+ while ((cmdname = path_advance(&path, prog)) != NULL) {
|
|
if (--idx < 0 && pathopt == NULL) {
|
|
tryexec(IF_FEATURE_SH_STANDALONE(-1,) cmdname, argv, envp);
|
|
if (errno != ENOENT && errno != ENOTDIR)
|
|
@@ -7796,8 +7795,8 @@ shellexec(char **argv, const char *path, int idx)
|
|
}
|
|
exitstatus = exerrno;
|
|
TRACE(("shellexec failed for %s, errno %d, suppress_int %d\n",
|
|
- argv[0], e, suppress_int));
|
|
- ash_msg_and_raise(EXEXIT, "%s: %s", argv[0], errmsg(e, "not found"));
|
|
+ prog, e, suppress_int));
|
|
+ ash_msg_and_raise(EXEXIT, "%s: %s", prog, errmsg(e, "not found"));
|
|
/* NOTREACHED */
|
|
}
|
|
|
|
@@ -9371,7 +9370,7 @@ execcmd(int argc UNUSED_PARAM, char **argv)
|
|
/*setsignal(SIGTSTP); - unnecessary because of mflag=0 */
|
|
/*setsignal(SIGTTOU); - unnecessary because of mflag=0 */
|
|
|
|
- shellexec(argv + 1, pathval(), 0);
|
|
+ shellexec(argv[1], argv + 1, pathval(), 0);
|
|
/* NOTREACHED */
|
|
}
|
|
return 0;
|
|
@@ -9773,7 +9772,7 @@ evalcommand(union node *cmd, int flags)
|
|
/* fall through to exec'ing external program */
|
|
}
|
|
listsetvar(varlist.list, VEXPORT|VSTACK);
|
|
- shellexec(argv, path, cmdentry.u.index);
|
|
+ shellexec(argv[0], argv, path, cmdentry.u.index);
|
|
/* NOTREACHED */
|
|
} /* default */
|
|
case CMDBUILTIN:
|
|
--
|
|
2.9.3
|
|
|