diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-12 21:02:33 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-04-12 21:02:33 +0200 |
| commit | e139ae307e4fd9eb3b86a6fc2e97b4e212925199 (patch) | |
| tree | df7c2706fda186ae84ddd2c1fcca17b69226c915 /shell | |
| parent | 352ddd3d216131757ac278e97a09ce2f4d7f53f0 (diff) | |
| download | busybox-w32-e139ae307e4fd9eb3b86a6fc2e97b4e212925199.tar.gz busybox-w32-e139ae307e4fd9eb3b86a6fc2e97b4e212925199.tar.bz2 busybox-w32-e139ae307e4fd9eb3b86a6fc2e97b4e212925199.zip | |
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>
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/shell/ash.c b/shell/ash.c index 983f7b108..044f166be 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 ** | |||
| 7744 | * have to change the find_command routine as well. | 7744 | * have to change the find_command routine as well. |
| 7745 | * argv[-1] must exist and be writable! See tryexec() for why. | 7745 | * argv[-1] must exist and be writable! See tryexec() for why. |
| 7746 | */ | 7746 | */ |
| 7747 | static void shellexec(char **, const char *, int) NORETURN; | 7747 | static void shellexec(char *prog, char **argv, const char *path, int idx) NORETURN; |
| 7748 | static void | 7748 | static void shellexec(char *prog, char **argv, const char *path, int idx) |
| 7749 | shellexec(char **argv, const char *path, int idx) | ||
| 7750 | { | 7749 | { |
| 7751 | char *cmdname; | 7750 | char *cmdname; |
| 7752 | int e; | 7751 | int e; |
| @@ -7755,12 +7754,12 @@ shellexec(char **argv, const char *path, int idx) | |||
| 7755 | int applet_no = -1; /* used only by FEATURE_SH_STANDALONE */ | 7754 | int applet_no = -1; /* used only by FEATURE_SH_STANDALONE */ |
| 7756 | 7755 | ||
| 7757 | envp = listvars(VEXPORT, VUNSET, /*end:*/ NULL); | 7756 | envp = listvars(VEXPORT, VUNSET, /*end:*/ NULL); |
| 7758 | if (strchr(argv[0], '/') != NULL | 7757 | if (strchr(prog, '/') != NULL |
| 7759 | #if ENABLE_FEATURE_SH_STANDALONE | 7758 | #if ENABLE_FEATURE_SH_STANDALONE |
| 7760 | || (applet_no = find_applet_by_name(argv[0])) >= 0 | 7759 | || (applet_no = find_applet_by_name(prog)) >= 0 |
| 7761 | #endif | 7760 | #endif |
| 7762 | ) { | 7761 | ) { |
| 7763 | tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) argv[0], argv, envp); | 7762 | tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); |
| 7764 | if (applet_no >= 0) { | 7763 | if (applet_no >= 0) { |
| 7765 | /* We tried execing ourself, but it didn't work. | 7764 | /* We tried execing ourself, but it didn't work. |
| 7766 | * Maybe /proc/self/exe doesn't exist? | 7765 | * Maybe /proc/self/exe doesn't exist? |
| @@ -7772,7 +7771,7 @@ shellexec(char **argv, const char *path, int idx) | |||
| 7772 | } else { | 7771 | } else { |
| 7773 | try_PATH: | 7772 | try_PATH: |
| 7774 | e = ENOENT; | 7773 | e = ENOENT; |
| 7775 | while ((cmdname = path_advance(&path, argv[0])) != NULL) { | 7774 | while ((cmdname = path_advance(&path, prog)) != NULL) { |
| 7776 | if (--idx < 0 && pathopt == NULL) { | 7775 | if (--idx < 0 && pathopt == NULL) { |
| 7777 | tryexec(IF_FEATURE_SH_STANDALONE(-1,) cmdname, argv, envp); | 7776 | tryexec(IF_FEATURE_SH_STANDALONE(-1,) cmdname, argv, envp); |
| 7778 | if (errno != ENOENT && errno != ENOTDIR) | 7777 | if (errno != ENOENT && errno != ENOTDIR) |
| @@ -7796,8 +7795,8 @@ shellexec(char **argv, const char *path, int idx) | |||
| 7796 | } | 7795 | } |
| 7797 | exitstatus = exerrno; | 7796 | exitstatus = exerrno; |
| 7798 | TRACE(("shellexec failed for %s, errno %d, suppress_int %d\n", | 7797 | TRACE(("shellexec failed for %s, errno %d, suppress_int %d\n", |
| 7799 | argv[0], e, suppress_int)); | 7798 | prog, e, suppress_int)); |
| 7800 | ash_msg_and_raise(EXEXIT, "%s: %s", argv[0], errmsg(e, "not found")); | 7799 | ash_msg_and_raise(EXEXIT, "%s: %s", prog, errmsg(e, "not found")); |
| 7801 | /* NOTREACHED */ | 7800 | /* NOTREACHED */ |
| 7802 | } | 7801 | } |
| 7803 | 7802 | ||
| @@ -9371,7 +9370,7 @@ execcmd(int argc UNUSED_PARAM, char **argv) | |||
| 9371 | /*setsignal(SIGTSTP); - unnecessary because of mflag=0 */ | 9370 | /*setsignal(SIGTSTP); - unnecessary because of mflag=0 */ |
| 9372 | /*setsignal(SIGTTOU); - unnecessary because of mflag=0 */ | 9371 | /*setsignal(SIGTTOU); - unnecessary because of mflag=0 */ |
| 9373 | 9372 | ||
| 9374 | shellexec(argv + 1, pathval(), 0); | 9373 | shellexec(argv[1], argv + 1, pathval(), 0); |
| 9375 | /* NOTREACHED */ | 9374 | /* NOTREACHED */ |
| 9376 | } | 9375 | } |
| 9377 | return 0; | 9376 | return 0; |
| @@ -9773,7 +9772,7 @@ evalcommand(union node *cmd, int flags) | |||
| 9773 | /* fall through to exec'ing external program */ | 9772 | /* fall through to exec'ing external program */ |
| 9774 | } | 9773 | } |
| 9775 | listsetvar(varlist.list, VEXPORT|VSTACK); | 9774 | listsetvar(varlist.list, VEXPORT|VSTACK); |
| 9776 | shellexec(argv, path, cmdentry.u.index); | 9775 | shellexec(argv[0], argv, path, cmdentry.u.index); |
| 9777 | /* NOTREACHED */ | 9776 | /* NOTREACHED */ |
| 9778 | } /* default */ | 9777 | } /* default */ |
| 9779 | case CMDBUILTIN: | 9778 | case CMDBUILTIN: |
