summaryrefslogtreecommitdiffhomepage
path: root/shell
diff options
context:
space:
mode:
authorPaul Fox <pgf@brightstareng.com>2006-06-08 21:37:26 +0000
committerPaul Fox <pgf@brightstareng.com>2006-06-08 21:37:26 +0000
commit6ab037872fa294d20d1f84403d1ac4dd4b8cbd86 (patch)
tree5f109ab555b2e3ca7df717cd7590058ab12d54c1 /shell
parent176f2df69b70ad53d4e2f893d9d8fe1c254e405d (diff)
made "test" an ash built-in.
moved the contents of libbb/bb_echo.c back into coreutils/echo.c, which is a more reasonable place for them than libbb. this forces anyone who wants echo and test to be builtin to ash to also have them available as applets. their cost is very small, and the number of people who wouldn't want them as applets is also very small. added warning about shell builtins vs. CONFIG_FEATURE_SH_STANDALONE_SHELL, which conflicts with their use. thanks to nathanael copa for debugging help. some string size optimization in test.c may have been lost with this commit, but this is a good new baseline.
Diffstat (limited to 'shell')
-rw-r--r--shell/Config.in38
-rw-r--r--shell/ash.c30
2 files changed, 49 insertions, 19 deletions
diff --git a/shell/Config.in b/shell/Config.in
index dde8fd1dd..8f2f98e68 100644
--- a/shell/Config.in
+++ b/shell/Config.in
@@ -95,12 +95,28 @@ config CONFIG_ASH_MATH_SUPPORT_64
large numbers.
config CONFIG_ASH_GETOPTS
- bool "Enable getopts builtin to parse positional parameters"
+ bool "Builtin getopt to parse positional parameters"
default n
depends on CONFIG_ASH
help
Enable getopts builtin in the ash shell.
+config CONFIG_ASH_BUILTIN_ECHO
+ bool "Builtin version of 'echo'"
+ default y
+ select CONFIG_ECHO
+ depends on CONFIG_ASH
+ help
+ Enable support for echo, built in to ash.
+
+config CONFIG_ASH_BUILTIN_TEST
+ bool "Builtin version of 'test'"
+ default y
+ select CONFIG_TEST
+ depends on CONFIG_ASH
+ help
+ Enable support for test, built in to ash.
+
config CONFIG_ASH_CMDCMD
bool "Enable cmdcmd to override shell builtins"
default n
@@ -110,21 +126,6 @@ config CONFIG_ASH_CMDCMD
you to run the specified command with the specified arguments,
even when there is an ash builtin command with the same name.
-config CONFIG_ASH_BUILTIN_ECHO
- bool "Enable builtin version of 'echo'"
- default n
- depends on CONFIG_ASH
- help
- Enable support for echo, built in to ash.
-
-# this entry also appears in coreutils/Config.in, next to the echo applet
-config CONFIG_FEATURE_FANCY_ECHO
- bool "Enable echo options (-n and -e)"
- default y
- depends on CONFIG_ASH_BUILTIN_ECHO
- help
- This adds options (-n and -e) to echo.
-
config CONFIG_ASH_MAIL
bool "Check for new mail on interactive shells"
default y
@@ -229,6 +230,11 @@ config CONFIG_FEATURE_SH_STANDALONE_SHELL
is generally used when creating a statically linked version of busybox
for use as a rescue shell, in the event that you screw up your system.
+ Note that this will *also* cause applets to take precedence
+ over shell builtins of the same name. So turning this on will
+ eliminate any performance gained by turning on the builtin "echo"
+ and "test" commands in ash.
+
Note that when using this option, the shell will attempt to directly
run '/bin/busybox'. If you do not have the busybox binary sitting in
that exact location with that exact name, this option will not work at
diff --git a/shell/ash.c b/shell/ash.c
index 962813dbd..713898a9f 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -1225,6 +1225,9 @@ static int evalcmd(int, char **);
#ifdef CONFIG_ASH_BUILTIN_ECHO
static int echocmd(int, char **);
#endif
+#ifdef CONFIG_ASH_BUILTIN_TEST
+static int testcmd(int, char **);
+#endif
static int execcmd(int, char **);
static int exitcmd(int, char **);
static int exportcmd(int, char **);
@@ -1286,10 +1289,15 @@ struct builtincmd {
#define COMMANDCMD (builtincmd + 5 + \
- ENABLE_ASH_ALIAS + ENABLE_ASH_JOB_CONTROL)
+ 2 * ENABLE_ASH_BUILTIN_TEST + \
+ ENABLE_ASH_ALIAS + \
+ ENABLE_ASH_JOB_CONTROL)
#define EXECCMD (builtincmd + 7 + \
- ENABLE_ASH_CMDCMD + ENABLE_ASH_ALIAS + \
- ENABLE_ASH_BUILTIN_ECHO + ENABLE_ASH_JOB_CONTROL)
+ 2 * ENABLE_ASH_BUILTIN_TEST + \
+ ENABLE_ASH_ALIAS + \
+ ENABLE_ASH_JOB_CONTROL + \
+ ENABLE_ASH_CMDCMD + \
+ ENABLE_ASH_BUILTIN_ECHO)
#define BUILTIN_NOSPEC "0"
#define BUILTIN_SPECIAL "1"
@@ -1307,6 +1315,10 @@ struct builtincmd {
static const struct builtincmd builtincmd[] = {
{ BUILTIN_SPEC_REG ".", dotcmd },
{ BUILTIN_SPEC_REG ":", truecmd },
+#ifdef CONFIG_ASH_BUILTIN_TEST
+ { BUILTIN_REGULAR "[", testcmd },
+ { BUILTIN_REGULAR "[[", testcmd },
+#endif
#ifdef CONFIG_ASH_ALIAS
{ BUILTIN_REG_ASSG "alias", aliascmd },
#endif
@@ -1353,6 +1365,9 @@ static const struct builtincmd builtincmd[] = {
{ BUILTIN_SPEC_REG "set", setcmd },
{ BUILTIN_SPEC_REG "source", dotcmd },
{ BUILTIN_SPEC_REG "shift", shiftcmd },
+#ifdef CONFIG_ASH_BUILTIN_TEST
+ { BUILTIN_REGULAR "test", testcmd },
+#endif
{ BUILTIN_SPEC_REG "times", timescmd },
{ BUILTIN_SPEC_REG "trap", trapcmd },
{ BUILTIN_REGULAR "true", truecmd },
@@ -8143,6 +8158,15 @@ echocmd(int argc, char **argv)
return bb_echo(argc, argv);
}
#endif
+
+#ifdef CONFIG_ASH_BUILTIN_TEST
+static int
+testcmd(int argc, char **argv)
+{
+ return bb_test(argc, argv);
+}
+#endif
+
/* memalloc.c */
/*