aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/hush.c17
-rw-r--r--shell/hush_test/hush-misc/builtin1.right2
-rwxr-xr-xshell/hush_test/hush-misc/builtin1.tests6
3 files changed, 24 insertions, 1 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 5b2f188cd..5af939d06 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -434,13 +434,17 @@ struct globals {
struct pipe *toplevel_list;
smallint ctrl_z_flag;
#endif
+#if ENABLE_HUSH_LOOPS
smallint flag_break_continue;
+#endif
smallint fake_mode;
/* these three support $?, $#, and $1 */
smalluint last_return_code;
char **global_argv;
int global_argc;
+#if ENABLE_HUSH_LOOPS
unsigned depth_break_continue;
+#endif
pid_t last_bg_pid;
const char *ifs;
const char *cwd;
@@ -722,8 +726,10 @@ static int builtin_shift(char **argv);
static int builtin_source(char **argv);
static int builtin_umask(char **argv);
static int builtin_unset(char **argv);
+#if ENABLE_HUSH_LOOPS
static int builtin_break(char **argv);
static int builtin_continue(char **argv);
+#endif
//static int builtin_not_written(char **argv);
/* Table of built-in functions. They can be forked or not, depending on
@@ -753,9 +759,13 @@ static const struct built_in_command bltins[] = {
#if ENABLE_HUSH_JOB
BLTIN("bg" , builtin_fg_bg, "Resume a job in the background"),
#endif
+#if ENABLE_HUSH_LOOPS
BLTIN("break" , builtin_break, "Exit from a loop"),
+#endif
BLTIN("cd" , builtin_cd, "Change directory"),
+#if ENABLE_HUSH_LOOPS
BLTIN("continue", builtin_continue, "Start new loop iteration"),
+#endif
BLTIN("echo" , builtin_echo, "Write to stdout"),
BLTIN("eval" , builtin_eval, "Construct and run shell command"),
BLTIN("exec" , builtin_exec, "Execute command, don't return to shell"),
@@ -2246,13 +2256,15 @@ static int run_list(struct pipe *pi)
debug_printf_exec(": run_pipe with %d members\n", pi->num_progs);
{
int r;
+#if ENABLE_HUSH_LOOPS
flag_break_continue = 0;
+#endif
rcode = r = run_pipe(pi); /* NB: rcode is a smallint */
if (r != -1) {
/* we only ran a builtin: rcode is already known
* and we don't need to wait for anything. */
+#if ENABLE_HUSH_LOOPS
/* was it "break" or "continue"? */
-
if (flag_break_continue) {
smallint fbc = flag_break_continue;
/* we might fall into outer *loop*,
@@ -2271,6 +2283,7 @@ static int run_list(struct pipe *pi)
bb_error_msg("break/continue: only meaningful in a loop");
/* bash compat: exit code is still 0 */
}
+#endif
} else if (pi->followup == PIPE_BG) {
/* what does bash do with attempts to background builtins? */
/* even bash 3.2 doesn't do that well with nested bg:
@@ -4534,6 +4547,7 @@ static int builtin_unset(char **argv)
return EXIT_SUCCESS;
}
+#if ENABLE_HUSH_LOOPS
static int builtin_break(char **argv)
{
flag_break_continue++; /* BC_BREAK = 1 */
@@ -4554,3 +4568,4 @@ static int builtin_continue(char **argv)
flag_break_continue++; /* BC_CONTINUE = 2 = 1+1 */
return builtin_break(argv);
}
+#endif
diff --git a/shell/hush_test/hush-misc/builtin1.right b/shell/hush_test/hush-misc/builtin1.right
new file mode 100644
index 000000000..2e55ecb09
--- /dev/null
+++ b/shell/hush_test/hush-misc/builtin1.right
@@ -0,0 +1,2 @@
+VARIABLE=export
+OK:0
diff --git a/shell/hush_test/hush-misc/builtin1.tests b/shell/hush_test/hush-misc/builtin1.tests
new file mode 100755
index 000000000..1a2941faa
--- /dev/null
+++ b/shell/hush_test/hush-misc/builtin1.tests
@@ -0,0 +1,6 @@
+# builtins, unlike keywords like "while", can be constructed
+# with substitutions
+VARIABLE=export
+$VARIABLE VARIABLE
+env | grep ^VARIABLE
+echo OK:$?