[git commit] ash: recognize embedded scripts in SH_STANDALONE mode

Denys Vlasenko vda.linux at googlemail.com
Thu Nov 1 10:07:26 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=151de441e7a19ce3afba0c59b083240a801222cf
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
find_script_by_name                                    -      51     +51
shellexec                                            254     271     +17
find_command                                         990    1007     +17
evalcommand                                         1653    1661      +8
doCommands                                          2233    2222     -11
run_applet_and_exit                                  128     100     -28
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 6/4 up/down: 104/-52)            Total: 52 bytes

Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/libbb.h   |  2 +-
 libbb/appletlib.c |  8 ++++----
 shell/ash.c       | 12 ++++++++++++
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index affff5874..a32608ebd 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1322,7 +1322,7 @@ void bb_logenv_override(void) FAST_FUNC;
 #endif
 
 /* Embedded script support */
-//int find_script_by_name(const char *arg IF_FEATURE_SH_STANDALONE(, int offset)) FAST_FUNC;
+int find_script_by_name(const char *name) FAST_FUNC;
 char *get_script_content(unsigned n) FAST_FUNC;
 
 /* Applets which are useful from another applets */
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index 4e6d1c3d6..92d99fbe8 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -964,20 +964,20 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar
 # endif /* NUM_APPLETS > 0 */
 
 # if NUM_SCRIPTS > 0
-static int
-find_script_by_name(const char *arg)
+int FAST_FUNC
+find_script_by_name(const char *name)
 {
 	const char *s = script_names;
 	int i = 0;
 
 	while (*s) {
-		if (strcmp(arg, s) == 0)
+		if (strcmp(name, s) == 0)
 			return i;
 		i++;
 		while (*s++ != '\0')
 			continue;
 	}
-	return -1;
+	return -0x10000; /* make it so that NUM_APPLETS + <error> is still < 0 */
 }
 
 static char *
diff --git a/shell/ash.c b/shell/ash.c
index 3adb6d0d2..58ecf6d2c 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -8085,6 +8085,9 @@ static void shellexec(char *prog, char **argv, const char *path, int idx)
 	if (strchr(prog, '/') != NULL
 #if ENABLE_FEATURE_SH_STANDALONE
 	 || (applet_no = find_applet_by_name(prog)) >= 0
+# if NUM_SCRIPTS > 0
+	 || (applet_no = NUM_APPLETS + find_script_by_name(prog)) >= 0
+# endif
 #endif
 	) {
 		tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
@@ -10186,6 +10189,10 @@ evalcommand(union node *cmd, int flags)
  */
 		/* find_command() encodes applet_no as (-2 - applet_no) */
 		int applet_no = (- cmdentry.u.index - 2);
+# if NUM_SCRIPTS > 0
+		/* Applets are ok, but not embedded scripts */
+		if (applet_no < NUM_APPLETS)
+# endif
 		if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
 			char **sv_environ;
 
@@ -13368,6 +13375,11 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
 #if ENABLE_FEATURE_SH_STANDALONE
 	{
 		int applet_no = find_applet_by_name(name);
+# if NUM_SCRIPTS > 0
+		if (applet_no < 0)
+			/* embedded script indices are offset by NUM_APPLETS */
+			applet_no = NUM_APPLETS + find_script_by_name(name);
+# endif
 		if (applet_no >= 0) {
 			entry->cmdtype = CMDNORMAL;
 			entry->u.index = -2 - applet_no;


More information about the busybox-cvs mailing list