aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-11-27 14:34:25 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2018-11-27 16:13:07 +0100
commit71df2d3589e3e682cd6770f41f0b184841b78702 (patch)
tree0c71963e9d622bc48256a3917c1ce55ccc019a4f /shell
parentf4709d78cb0c4f54283046e8f86edb9ecd7e41ca (diff)
downloadbusybox-w32-71df2d3589e3e682cd6770f41f0b184841b78702.tar.gz
busybox-w32-71df2d3589e3e682cd6770f41f0b184841b78702.tar.bz2
busybox-w32-71df2d3589e3e682cd6770f41f0b184841b78702.zip
hush: allow hush to run embedded scripts
Embedded scripts require a shell to be present in the BusyBox binary. Allow either ash or hush to be used for this purpose. If both are enabled ash takes precedence. The size of the binary is unchanged in the default configuration: both ash and hush are present but support for embedded scripts isn't compiled into hush. 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/Config.src14
-rw-r--r--shell/ash.c16
-rw-r--r--shell/hush.c16
3 files changed, 31 insertions, 15 deletions
diff --git a/shell/Config.src b/shell/Config.src
index 959d3cb42..bc7218fe5 100644
--- a/shell/Config.src
+++ b/shell/Config.src
@@ -161,6 +161,20 @@ config FEATURE_SH_HISTFILESIZE
161 to set shell history size. Note that its max value is capped 161 to set shell history size. Note that its max value is capped
162 by "History size" setting in library tuning section. 162 by "History size" setting in library tuning section.
163 163
164config FEATURE_SH_EMBEDDED_SCRIPTS
165 bool "Embed scripts in the binary"
166 default y
167 depends on ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_HUSH
168 help
169 Allow scripts to be compressed and embedded in the busybox
170 binary. The scripts should be placed in the 'embed' directory
171 at build time. Like applets, scripts can be run as
172 'busybox SCRIPT ...' or by linking their name to the binary.
173
174 This also allows applets to be implemented as scripts: place
175 the script in 'applets_sh' and a stub C file containing
176 configuration in the appropriate subsystem directory.
177
164endif # Options common to all shells 178endif # Options common to all shells
165 179
166endmenu 180endmenu
diff --git a/shell/ash.c b/shell/ash.c
index 04e4006c8..9ce1d1a76 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -148,20 +148,6 @@
148//config: you to run the specified command or builtin, 148//config: you to run the specified command or builtin,
149//config: even when there is a function with the same name. 149//config: even when there is a function with the same name.
150//config: 150//config:
151//config:config ASH_EMBEDDED_SCRIPTS
152//config: bool "Embed scripts in the binary"
153//config: default y
154//config: depends on ASH || SH_IS_ASH || BASH_IS_ASH
155//config: help
156//config: Allow scripts to be compressed and embedded in the busybox
157//config: binary. The scripts should be placed in the 'embed' directory
158//config: at build time. Like applets, scripts can be run as
159//config: 'busybox SCRIPT ...' or by linking their name to the binary.
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:
165//config:endif # ash options 151//config:endif # ash options
166 152
167//applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP)) 153//applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
@@ -195,7 +181,7 @@
195#include <sys/times.h> 181#include <sys/times.h>
196#include <sys/utsname.h> /* for setting $HOSTNAME */ 182#include <sys/utsname.h> /* for setting $HOSTNAME */
197#include "busybox.h" /* for applet_names */ 183#include "busybox.h" /* for applet_names */
198#if ENABLE_ASH_EMBEDDED_SCRIPTS 184#if ENABLE_FEATURE_SH_EMBEDDED_SCRIPTS
199# include "embedded_scripts.h" 185# include "embedded_scripts.h"
200#else 186#else
201# define NUM_SCRIPTS 0 187# define NUM_SCRIPTS 0
diff --git a/shell/hush.c b/shell/hush.c
index 431010f09..90191408d 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -367,6 +367,11 @@
367# define PIPE_BUF 4096 /* amount of buffering in a pipe */ 367# define PIPE_BUF 4096 /* amount of buffering in a pipe */
368#endif 368#endif
369 369
370#if ENABLE_FEATURE_SH_EMBEDDED_SCRIPTS && !(ENABLE_ASH || ENABLE_SH_IS_ASH || ENABLE_BASH_IS_ASH)
371# include "embedded_scripts.h"
372#else
373# define NUM_SCRIPTS 0
374#endif
370 375
371/* So far, all bash compat is controlled by one config option */ 376/* So far, all bash compat is controlled by one config option */
372/* Separate defines document which part of code implements what */ 377/* Separate defines document which part of code implements what */
@@ -9951,6 +9956,14 @@ int hush_main(int argc, char **argv)
9951 /* http://www.opengroup.org/onlinepubs/9699919799/utilities/sh.html */ 9956 /* http://www.opengroup.org/onlinepubs/9699919799/utilities/sh.html */
9952 flags = (argv[0] && argv[0][0] == '-') ? OPT_login : 0; 9957 flags = (argv[0] && argv[0][0] == '-') ? OPT_login : 0;
9953 builtin_argc = 0; 9958 builtin_argc = 0;
9959#if NUM_SCRIPTS > 0
9960 if (argc < 0) {
9961 optarg = get_script_content(-argc - 1);
9962 optind = 0;
9963 argc = string_array_len(argv);
9964 goto run_script;
9965 }
9966#endif
9954 while (1) { 9967 while (1) {
9955 int opt = getopt(argc, argv, "+c:exinsl" 9968 int opt = getopt(argc, argv, "+c:exinsl"
9956#if !BB_MMU 9969#if !BB_MMU
@@ -9974,6 +9987,9 @@ int hush_main(int argc, char **argv)
9974 * Note: the form without ARG0 never happens: 9987 * Note: the form without ARG0 never happens:
9975 * sh ... -c 'builtin' BARGV... "" 9988 * sh ... -c 'builtin' BARGV... ""
9976 */ 9989 */
9990#if NUM_SCRIPTS > 0
9991 run_script:
9992#endif
9977 if (!G.root_pid) { 9993 if (!G.root_pid) {
9978 G.root_pid = getpid(); 9994 G.root_pid = getpid();
9979 G.root_ppid = getppid(); 9995 G.root_ppid = getppid();