aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-11-17 17:48:14 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2018-11-17 21:16:33 +0100
commit3778898f97a64e7b42b53194af7f3b93cc9c07a3 (patch)
tree9452b954be8861feff32a40072615ee95caaa4c6 /shell
parente6a63bf683f47027d36dc21b62b2f5cc3eb30a30 (diff)
downloadbusybox-w32-3778898f97a64e7b42b53194af7f3b93cc9c07a3.tar.gz
busybox-w32-3778898f97a64e7b42b53194af7f3b93cc9c07a3.tar.bz2
busybox-w32-3778898f97a64e7b42b53194af7f3b93cc9c07a3.zip
Treat custom and applet scripts as applets
BusyBox has support for embedded shell scripts. Two types can be distinguished: custom scripts and scripts implementing applets. Custom scripts should be placed in the 'embed' directory at build time. They are given a default applet configuration and appear as applets to the user but no further configuration is possible. Applet scripts are integrated with the BusyBox build system and are intended to be used to ship standard applets that just happen to be implemented as scripts. They can be configured at build time and appear just like native applets. Such scripts should be placed in the 'applets_sh' directory. A stub C program should be written to provide the usual applet configuration details and placed in a suitable subsystem directory. It may be helpful to have a configuration option to enable any dependencies the script requires: see the 'nologin' applet for an example. function old new delta scripted_main - 41 +41 applet_names 2773 2781 +8 applet_main 1600 1604 +4 i2cdetect_main 672 674 +2 applet_suid 100 101 +1 applet_install_loc 200 201 +1 applet_flags 100 101 +1 packed_usage 33180 33179 -1 tryexec 159 152 -7 evalcommand 1661 1653 -8 script_names 9 - -9 packed_scripts 123 114 -9 complete_cmd_dir_file 826 811 -15 shellexec 271 254 -17 find_command 1007 990 -17 busybox_main 642 624 -18 run_applet_and_exit 100 78 -22 find_script_by_name 51 - -51 ------------------------------------------------------------------------------ (add/remove: 1/2 grow/shrink: 6/9 up/down: 58/-174) Total: -116 bytes text data bss dec hex filename 950034 477 7296 957807 e9d6f busybox_old 949918 477 7296 957691 e9cfb busybox_unstripped Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c19
1 files changed, 4 insertions, 15 deletions
diff --git a/shell/ash.c b/shell/ash.c
index b1f8f15d2..44b3569dc 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -158,6 +158,10 @@
158//config: at build time. Like applets, scripts can be run as 158//config: at build time. Like applets, scripts can be run as
159//config: 'busybox SCRIPT ...' or by linking their name to the binary. 159//config: 'busybox SCRIPT ...' or by linking their name to the binary.
160//config: 160//config:
161//config: This also allows applets to be implemented as scripts: place
162//config: the script in 'applets_sh' and a stub C file containing
163//config: configuration in the appropriate subsystem directory.
164//config:
161//config:endif # ash options 165//config:endif # ash options
162 166
163//applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP)) 167//applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
@@ -8016,9 +8020,6 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c
8016{ 8020{
8017#if ENABLE_FEATURE_SH_STANDALONE 8021#if ENABLE_FEATURE_SH_STANDALONE
8018 if (applet_no >= 0) { 8022 if (applet_no >= 0) {
8019# if NUM_SCRIPTS > 0
8020 if (applet_no < NUM_APPLETS)
8021# endif
8022 if (APPLET_IS_NOEXEC(applet_no)) { 8023 if (APPLET_IS_NOEXEC(applet_no)) {
8023 clearenv(); 8024 clearenv();
8024 while (*envp) 8025 while (*envp)
@@ -8088,9 +8089,6 @@ static void shellexec(char *prog, char **argv, const char *path, int idx)
8088 if (strchr(prog, '/') != NULL 8089 if (strchr(prog, '/') != NULL
8089#if ENABLE_FEATURE_SH_STANDALONE 8090#if ENABLE_FEATURE_SH_STANDALONE
8090 || (applet_no = find_applet_by_name(prog)) >= 0 8091 || (applet_no = find_applet_by_name(prog)) >= 0
8091# if NUM_SCRIPTS > 0
8092 || (applet_no = NUM_APPLETS + find_script_by_name(prog)) >= 0
8093# endif
8094#endif 8092#endif
8095 ) { 8093 ) {
8096 tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); 8094 tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
@@ -10192,10 +10190,6 @@ evalcommand(union node *cmd, int flags)
10192 */ 10190 */
10193 /* find_command() encodes applet_no as (-2 - applet_no) */ 10191 /* find_command() encodes applet_no as (-2 - applet_no) */
10194 int applet_no = (- cmdentry.u.index - 2); 10192 int applet_no = (- cmdentry.u.index - 2);
10195# if NUM_SCRIPTS > 0
10196 /* Applets are ok, but not embedded scripts */
10197 if (applet_no < NUM_APPLETS)
10198# endif
10199 if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) { 10193 if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
10200 char **sv_environ; 10194 char **sv_environ;
10201 10195
@@ -13378,11 +13372,6 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
13378#if ENABLE_FEATURE_SH_STANDALONE 13372#if ENABLE_FEATURE_SH_STANDALONE
13379 { 13373 {
13380 int applet_no = find_applet_by_name(name); 13374 int applet_no = find_applet_by_name(name);
13381# if NUM_SCRIPTS > 0
13382 if (applet_no < 0)
13383 /* embedded script indices are offset by NUM_APPLETS */
13384 applet_no = NUM_APPLETS + find_script_by_name(name);
13385# endif
13386 if (applet_no >= 0) { 13375 if (applet_no >= 0) {
13387 entry->cmdtype = CMDNORMAL; 13376 entry->cmdtype = CMDNORMAL;
13388 entry->u.index = -2 - applet_no; 13377 entry->u.index = -2 - applet_no;