aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-11-28 10:28:18 +0000
committerRon Yorston <rmy@pobox.com>2018-11-28 10:28:18 +0000
commit2a69a2200a141c1504b662eca64b802cdab71b12 (patch)
treeeab0cc01852db237a26052a83c8f582ed92b7cd9 /shell
parent97ca1f4b955f486cd26461cb09185335483d2921 (diff)
parent572dfb8e78323b9837f7c5e3369ee233a440b8f2 (diff)
downloadbusybox-w32-2a69a2200a141c1504b662eca64b802cdab71b12.tar.gz
busybox-w32-2a69a2200a141c1504b662eca64b802cdab71b12.tar.bz2
busybox-w32-2a69a2200a141c1504b662eca64b802cdab71b12.zip
Merge branch 'busybox' into merge
Diffstat (limited to 'shell')
-rw-r--r--shell/Config.src14
-rw-r--r--shell/ash.c29
-rw-r--r--shell/hush.c18
3 files changed, 56 insertions, 5 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 7131609e4..1b40e3407 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -208,6 +208,11 @@
208#include <sys/times.h> 208#include <sys/times.h>
209#include <sys/utsname.h> /* for setting $HOSTNAME */ 209#include <sys/utsname.h> /* for setting $HOSTNAME */
210#include "busybox.h" /* for applet_names */ 210#include "busybox.h" /* for applet_names */
211#if ENABLE_FEATURE_SH_EMBEDDED_SCRIPTS
212# include "embedded_scripts.h"
213#else
214# define NUM_SCRIPTS 0
215#endif
211 216
212/* So far, all bash compat is controlled by one config option */ 217/* So far, all bash compat is controlled by one config option */
213/* Separate defines document which part of code implements what */ 218/* Separate defines document which part of code implements what */
@@ -2503,13 +2508,12 @@ setvar(const char *name, const char *val, int flags)
2503 } 2508 }
2504 2509
2505 INT_OFF; 2510 INT_OFF;
2506 nameeq = ckmalloc(namelen + vallen + 2); 2511 nameeq = ckzalloc(namelen + vallen + 2);
2507 p = mempcpy(nameeq, name, namelen); 2512 p = mempcpy(nameeq, name, namelen);
2508 if (val) { 2513 if (val) {
2509 *p++ = '='; 2514 *p++ = '=';
2510 p = mempcpy(p, val, vallen); 2515 memcpy(p, val, vallen);
2511 } 2516 }
2512 *p = '\0';
2513 vp = setvareq(nameeq, flags | VNOSAVE); 2517 vp = setvareq(nameeq, flags | VNOSAVE);
2514 INT_ON; 2518 INT_ON;
2515 2519
@@ -8420,6 +8424,7 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c
8420#else 8424#else
8421 execve(cmd, argv, envp); 8425 execve(cmd, argv, envp);
8422#endif 8426#endif
8427
8423 if (cmd != bb_busybox_exec_path && errno == ENOEXEC) { 8428 if (cmd != bb_busybox_exec_path && errno == ENOEXEC) {
8424 /* Run "cmd" as a shell script: 8429 /* Run "cmd" as a shell script:
8425 * http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html 8430 * http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
@@ -13459,6 +13464,7 @@ parseheredoc(void)
13459 heredoclist = NULL; 13464 heredoclist = NULL;
13460 13465
13461 while (here) { 13466 while (here) {
13467 tokpushback = 0;
13462 setprompt_if(needprompt, 2); 13468 setprompt_if(needprompt, 2);
13463 readtoken1(pgetc(), here->here->type == NHERE ? SQSYNTAX : DQSYNTAX, 13469 readtoken1(pgetc(), here->here->type == NHERE ? SQSYNTAX : DQSYNTAX,
13464 here->eofmark, here->striptabs); 13470 here->eofmark, here->striptabs);
@@ -14662,12 +14668,16 @@ procargs(char **argv)
14662 14668
14663 xargv = argv; 14669 xargv = argv;
14664 login_sh = xargv[0] && xargv[0][0] == '-'; 14670 login_sh = xargv[0] && xargv[0][0] == '-';
14671#if NUM_SCRIPTS > 0
14672 if (minusc)
14673 goto setarg0;
14674#endif
14665 arg0 = xargv[0]; 14675 arg0 = xargv[0];
14666 /* if (xargv[0]) - mmm, this is always true! */ 14676 /* if (xargv[0]) - mmm, this is always true! */
14667 xargv++; 14677 xargv++;
14678 argptr = xargv;
14668 for (i = 0; i < NOPTS; i++) 14679 for (i = 0; i < NOPTS; i++)
14669 optlist[i] = 2; 14680 optlist[i] = 2;
14670 argptr = xargv;
14671 if (options(/*cmdline:*/ 1, &login_sh)) { 14681 if (options(/*cmdline:*/ 1, &login_sh)) {
14672 /* it already printed err message */ 14682 /* it already printed err message */
14673 raise_exception(EXERROR); 14683 raise_exception(EXERROR);
@@ -14772,7 +14782,12 @@ extern int etext();
14772 * is used to figure out how far we had gotten. 14782 * is used to figure out how far we had gotten.
14773 */ 14783 */
14774int ash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 14784int ash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
14785#if NUM_SCRIPTS > 0
14786int ash_main(int argc, char **argv)
14787#else
14775int ash_main(int argc UNUSED_PARAM, char **argv) 14788int ash_main(int argc UNUSED_PARAM, char **argv)
14789#endif
14790/* note: 'argc' is used only if embedded scripts are enabled */
14776{ 14791{
14777 volatile smallint state; 14792 volatile smallint state;
14778 struct jmploc jmploc; 14793 struct jmploc jmploc;
@@ -14839,6 +14854,12 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
14839 bb_error_msg_and_die("forkshell failed"); 14854 bb_error_msg_and_die("forkshell failed");
14840 } 14855 }
14841#endif 14856#endif
14857
14858#if NUM_SCRIPTS > 0
14859 if (argc < 0)
14860 /* Non-NULL minusc tells procargs that an embedded script is being run */
14861 minusc = get_script_content(-argc - 1);
14862#endif
14842 login_sh = procargs(argv); 14863 login_sh = procargs(argv);
14843#if DEBUG 14864#if DEBUG
14844 TRACE(("Shell args: ")); 14865 TRACE(("Shell args: "));
diff --git a/shell/hush.c b/shell/hush.c
index 881331c5b..90191408d 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -157,7 +157,7 @@
157//config: but no separate process group is formed. 157//config: but no separate process group is formed.
158//config: 158//config:
159//config:config HUSH_TICK 159//config:config HUSH_TICK
160//config: bool "Support process substitution" 160//config: bool "Support command substitution"
161//config: default y 161//config: default y
162//config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH 162//config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH
163//config: help 163//config: help
@@ -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();