diff options
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 59 |
1 files changed, 24 insertions, 35 deletions
diff --git a/shell/hush.c b/shell/hush.c index c5821259a..fecc89294 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -99,7 +99,7 @@ | |||
99 | //config:config HUSH_BASH_COMPAT | 99 | //config:config HUSH_BASH_COMPAT |
100 | //config: bool "bash-compatible extensions" | 100 | //config: bool "bash-compatible extensions" |
101 | //config: default y | 101 | //config: default y |
102 | //config: depends on HUSH | 102 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
103 | //config: help | 103 | //config: help |
104 | //config: Enable bash-compatible extensions. | 104 | //config: Enable bash-compatible extensions. |
105 | //config: | 105 | //config: |
@@ -113,14 +113,14 @@ | |||
113 | //config:config HUSH_HELP | 113 | //config:config HUSH_HELP |
114 | //config: bool "help builtin" | 114 | //config: bool "help builtin" |
115 | //config: default y | 115 | //config: default y |
116 | //config: depends on HUSH | 116 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
117 | //config: help | 117 | //config: help |
118 | //config: Enable help builtin in hush. Code size + ~1 kbyte. | 118 | //config: Enable help builtin in hush. Code size + ~1 kbyte. |
119 | //config: | 119 | //config: |
120 | //config:config HUSH_INTERACTIVE | 120 | //config:config HUSH_INTERACTIVE |
121 | //config: bool "Interactive mode" | 121 | //config: bool "Interactive mode" |
122 | //config: default y | 122 | //config: default y |
123 | //config: depends on HUSH | 123 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
124 | //config: help | 124 | //config: help |
125 | //config: Enable interactive mode (prompt and command editing). | 125 | //config: Enable interactive mode (prompt and command editing). |
126 | //config: Without this, hush simply reads and executes commands | 126 | //config: Without this, hush simply reads and executes commands |
@@ -148,35 +148,35 @@ | |||
148 | //config:config HUSH_TICK | 148 | //config:config HUSH_TICK |
149 | //config: bool "Process substitution" | 149 | //config: bool "Process substitution" |
150 | //config: default y | 150 | //config: default y |
151 | //config: depends on HUSH | 151 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
152 | //config: help | 152 | //config: help |
153 | //config: Enable process substitution `command` and $(command) in hush. | 153 | //config: Enable process substitution `command` and $(command) in hush. |
154 | //config: | 154 | //config: |
155 | //config:config HUSH_IF | 155 | //config:config HUSH_IF |
156 | //config: bool "Support if/then/elif/else/fi" | 156 | //config: bool "Support if/then/elif/else/fi" |
157 | //config: default y | 157 | //config: default y |
158 | //config: depends on HUSH | 158 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
159 | //config: help | 159 | //config: help |
160 | //config: Enable if/then/elif/else/fi in hush. | 160 | //config: Enable if/then/elif/else/fi in hush. |
161 | //config: | 161 | //config: |
162 | //config:config HUSH_LOOPS | 162 | //config:config HUSH_LOOPS |
163 | //config: bool "Support for, while and until loops" | 163 | //config: bool "Support for, while and until loops" |
164 | //config: default y | 164 | //config: default y |
165 | //config: depends on HUSH | 165 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
166 | //config: help | 166 | //config: help |
167 | //config: Enable for, while and until loops in hush. | 167 | //config: Enable for, while and until loops in hush. |
168 | //config: | 168 | //config: |
169 | //config:config HUSH_CASE | 169 | //config:config HUSH_CASE |
170 | //config: bool "Support case ... esac statement" | 170 | //config: bool "Support case ... esac statement" |
171 | //config: default y | 171 | //config: default y |
172 | //config: depends on HUSH | 172 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
173 | //config: help | 173 | //config: help |
174 | //config: Enable case ... esac statement in hush. +400 bytes. | 174 | //config: Enable case ... esac statement in hush. +400 bytes. |
175 | //config: | 175 | //config: |
176 | //config:config HUSH_FUNCTIONS | 176 | //config:config HUSH_FUNCTIONS |
177 | //config: bool "Support funcname() { commands; } syntax" | 177 | //config: bool "Support funcname() { commands; } syntax" |
178 | //config: default y | 178 | //config: default y |
179 | //config: depends on HUSH | 179 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
180 | //config: help | 180 | //config: help |
181 | //config: Enable support for shell functions in hush. +800 bytes. | 181 | //config: Enable support for shell functions in hush. +800 bytes. |
182 | //config: | 182 | //config: |
@@ -190,7 +190,7 @@ | |||
190 | //config:config HUSH_RANDOM_SUPPORT | 190 | //config:config HUSH_RANDOM_SUPPORT |
191 | //config: bool "Pseudorandom generator and $RANDOM variable" | 191 | //config: bool "Pseudorandom generator and $RANDOM variable" |
192 | //config: default y | 192 | //config: default y |
193 | //config: depends on HUSH | 193 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
194 | //config: help | 194 | //config: help |
195 | //config: Enable pseudorandom generator and dynamic variable "$RANDOM". | 195 | //config: Enable pseudorandom generator and dynamic variable "$RANDOM". |
196 | //config: Each read of "$RANDOM" will generate a new pseudorandom value. | 196 | //config: Each read of "$RANDOM" will generate a new pseudorandom value. |
@@ -198,14 +198,14 @@ | |||
198 | //config:config HUSH_EXPORT_N | 198 | //config:config HUSH_EXPORT_N |
199 | //config: bool "Support 'export -n' option" | 199 | //config: bool "Support 'export -n' option" |
200 | //config: default y | 200 | //config: default y |
201 | //config: depends on HUSH | 201 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
202 | //config: help | 202 | //config: help |
203 | //config: export -n unexports variables. It is a bash extension. | 203 | //config: export -n unexports variables. It is a bash extension. |
204 | //config: | 204 | //config: |
205 | //config:config HUSH_MODE_X | 205 | //config:config HUSH_MODE_X |
206 | //config: bool "Support 'hush -x' option and 'set -x' command" | 206 | //config: bool "Support 'hush -x' option and 'set -x' command" |
207 | //config: default y | 207 | //config: default y |
208 | //config: depends on HUSH | 208 | //config: depends on HUSH || SH_IS_HUSH || BASH_IS_HUSH |
209 | //config: help | 209 | //config: help |
210 | //config: This instructs hush to print commands before execution. | 210 | //config: This instructs hush to print commands before execution. |
211 | //config: Adds ~300 bytes. | 211 | //config: Adds ~300 bytes. |
@@ -216,14 +216,15 @@ | |||
216 | //config: select HUSH | 216 | //config: select HUSH |
217 | //config: help | 217 | //config: help |
218 | //config: msh is deprecated and will be removed, please migrate to hush. | 218 | //config: msh is deprecated and will be removed, please migrate to hush. |
219 | //config: | ||
220 | 219 | ||
221 | //applet:IF_HUSH(APPLET(hush, BB_DIR_BIN, BB_SUID_DROP)) | 220 | //applet:IF_HUSH(APPLET(hush, BB_DIR_BIN, BB_SUID_DROP)) |
222 | //applet:IF_MSH(APPLET(msh, BB_DIR_BIN, BB_SUID_DROP)) | 221 | //applet:IF_MSH(APPLET_ODDNAME(msh, hush, BB_DIR_BIN, BB_SUID_DROP, hush)) |
223 | //applet:IF_FEATURE_SH_IS_HUSH(APPLET_ODDNAME(sh, hush, BB_DIR_BIN, BB_SUID_DROP, sh)) | 222 | //applet:IF_SH_IS_HUSH(APPLET_ODDNAME(sh, hush, BB_DIR_BIN, BB_SUID_DROP, hush)) |
224 | //applet:IF_FEATURE_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, BB_DIR_BIN, BB_SUID_DROP, bash)) | 223 | //applet:IF_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, BB_DIR_BIN, BB_SUID_DROP, hush)) |
225 | 224 | ||
226 | //kbuild:lib-$(CONFIG_HUSH) += hush.o match.o shell_common.o | 225 | //kbuild:lib-$(CONFIG_HUSH) += hush.o match.o shell_common.o |
226 | //kbuild:lib-$(CONFIG_SH_IS_HUSH) += hush.o match.o shell_common.o | ||
227 | //kbuild:lib-$(CONFIG_BASH_IS_HUSH) += hush.o match.o shell_common.o | ||
227 | //kbuild:lib-$(CONFIG_HUSH_RANDOM_SUPPORT) += random.o | 228 | //kbuild:lib-$(CONFIG_HUSH_RANDOM_SUPPORT) += random.o |
228 | 229 | ||
229 | /* -i (interactive) and -s (read stdin) are also accepted, | 230 | /* -i (interactive) and -s (read stdin) are also accepted, |
@@ -236,18 +237,6 @@ | |||
236 | //usage:#define hush_full_usage "\n\n" | 237 | //usage:#define hush_full_usage "\n\n" |
237 | //usage: "Unix shell interpreter" | 238 | //usage: "Unix shell interpreter" |
238 | 239 | ||
239 | //usage:#define msh_trivial_usage hush_trivial_usage | ||
240 | //usage:#define msh_full_usage hush_full_usage | ||
241 | |||
242 | //usage:#if ENABLE_FEATURE_SH_IS_HUSH | ||
243 | //usage:# define sh_trivial_usage hush_trivial_usage | ||
244 | //usage:# define sh_full_usage hush_full_usage | ||
245 | //usage:#endif | ||
246 | //usage:#if ENABLE_FEATURE_BASH_IS_HUSH | ||
247 | //usage:# define bash_trivial_usage hush_trivial_usage | ||
248 | //usage:# define bash_full_usage hush_full_usage | ||
249 | //usage:#endif | ||
250 | |||
251 | #if !(defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ | 240 | #if !(defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ |
252 | || defined(__APPLE__) \ | 241 | || defined(__APPLE__) \ |
253 | ) | 242 | ) |
@@ -4011,7 +4000,7 @@ static int i_peek_and_eat_bkslash_nl(struct in_str *input) | |||
4011 | } | 4000 | } |
4012 | } | 4001 | } |
4013 | 4002 | ||
4014 | #if ENABLE_HUSH_TICK || ENABLE_SH_MATH_SUPPORT || ENABLE_HUSH_DOLLAR_OPS | 4003 | #if ENABLE_HUSH_TICK || ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_DOLLAR_OPS |
4015 | /* Subroutines for copying $(...) and `...` things */ | 4004 | /* Subroutines for copying $(...) and `...` things */ |
4016 | static int add_till_backquote(o_string *dest, struct in_str *input, int in_dquote); | 4005 | static int add_till_backquote(o_string *dest, struct in_str *input, int in_dquote); |
4017 | /* '...' */ | 4006 | /* '...' */ |
@@ -4179,7 +4168,7 @@ static int add_till_closing_bracket(o_string *dest, struct in_str *input, unsign | |||
4179 | } | 4168 | } |
4180 | return ch; | 4169 | return ch; |
4181 | } | 4170 | } |
4182 | #endif /* ENABLE_HUSH_TICK || ENABLE_SH_MATH_SUPPORT || ENABLE_HUSH_DOLLAR_OPS */ | 4171 | #endif /* ENABLE_HUSH_TICK || ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_DOLLAR_OPS */ |
4183 | 4172 | ||
4184 | /* Return code: 0 for OK, 1 for syntax error */ | 4173 | /* Return code: 0 for OK, 1 for syntax error */ |
4185 | #if BB_MMU | 4174 | #if BB_MMU |
@@ -4333,13 +4322,13 @@ static int parse_dollar(o_string *as_string, | |||
4333 | o_addchr(dest, SPECIAL_VAR_SYMBOL); | 4322 | o_addchr(dest, SPECIAL_VAR_SYMBOL); |
4334 | break; | 4323 | break; |
4335 | } | 4324 | } |
4336 | #if ENABLE_SH_MATH_SUPPORT || ENABLE_HUSH_TICK | 4325 | #if ENABLE_FEATURE_SH_MATH || ENABLE_HUSH_TICK |
4337 | case '(': { | 4326 | case '(': { |
4338 | unsigned pos; | 4327 | unsigned pos; |
4339 | 4328 | ||
4340 | ch = i_getch(input); | 4329 | ch = i_getch(input); |
4341 | nommu_addchr(as_string, ch); | 4330 | nommu_addchr(as_string, ch); |
4342 | # if ENABLE_SH_MATH_SUPPORT | 4331 | # if ENABLE_FEATURE_SH_MATH |
4343 | if (i_peek_and_eat_bkslash_nl(input) == '(') { | 4332 | if (i_peek_and_eat_bkslash_nl(input) == '(') { |
4344 | ch = i_getch(input); | 4333 | ch = i_getch(input); |
4345 | nommu_addchr(as_string, ch); | 4334 | nommu_addchr(as_string, ch); |
@@ -5217,7 +5206,7 @@ static char *encode_then_expand_string(const char *str, int process_bkslash, int | |||
5217 | return exp_str; | 5206 | return exp_str; |
5218 | } | 5207 | } |
5219 | 5208 | ||
5220 | #if ENABLE_SH_MATH_SUPPORT | 5209 | #if ENABLE_FEATURE_SH_MATH |
5221 | static arith_t expand_and_evaluate_arith(const char *arg, const char **errmsg_p) | 5210 | static arith_t expand_and_evaluate_arith(const char *arg, const char **errmsg_p) |
5222 | { | 5211 | { |
5223 | arith_state_t math_state; | 5212 | arith_state_t math_state; |
@@ -5469,7 +5458,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha | |||
5469 | } | 5458 | } |
5470 | #endif | 5459 | #endif |
5471 | else if (exp_op == ':') { | 5460 | else if (exp_op == ':') { |
5472 | #if ENABLE_HUSH_BASH_COMPAT && ENABLE_SH_MATH_SUPPORT | 5461 | #if ENABLE_HUSH_BASH_COMPAT && ENABLE_FEATURE_SH_MATH |
5473 | /* It's ${var:N[:M]} bashism. | 5462 | /* It's ${var:N[:M]} bashism. |
5474 | * Note that in encoded form it has TWO parts: | 5463 | * Note that in encoded form it has TWO parts: |
5475 | * var:N<SPECIAL_VAR_SYMBOL>M<SPECIAL_VAR_SYMBOL> | 5464 | * var:N<SPECIAL_VAR_SYMBOL>M<SPECIAL_VAR_SYMBOL> |
@@ -5604,7 +5593,7 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg) | |||
5604 | #if ENABLE_HUSH_TICK | 5593 | #if ENABLE_HUSH_TICK |
5605 | o_string subst_result = NULL_O_STRING; | 5594 | o_string subst_result = NULL_O_STRING; |
5606 | #endif | 5595 | #endif |
5607 | #if ENABLE_SH_MATH_SUPPORT | 5596 | #if ENABLE_FEATURE_SH_MATH |
5608 | char arith_buf[sizeof(arith_t)*3 + 2]; | 5597 | char arith_buf[sizeof(arith_t)*3 + 2]; |
5609 | #endif | 5598 | #endif |
5610 | 5599 | ||
@@ -5698,7 +5687,7 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg) | |||
5698 | val = subst_result.data; | 5687 | val = subst_result.data; |
5699 | goto store_val; | 5688 | goto store_val; |
5700 | #endif | 5689 | #endif |
5701 | #if ENABLE_SH_MATH_SUPPORT | 5690 | #if ENABLE_FEATURE_SH_MATH |
5702 | case '+': { /* <SPECIAL_VAR_SYMBOL>+cmd<SPECIAL_VAR_SYMBOL> */ | 5691 | case '+': { /* <SPECIAL_VAR_SYMBOL>+cmd<SPECIAL_VAR_SYMBOL> */ |
5703 | arith_t res; | 5692 | arith_t res; |
5704 | 5693 | ||