mirror of
https://github.com/sheumann/hush.git
synced 2025-01-27 21:33:05 +00:00
hush: add support for ':'; create testsuite entries
text data bss dec hex filename 809569 612 7044 817225 c7849 busybox_old 809528 612 7044 817184 c7820 busybox_unstripped
This commit is contained in:
parent
a84420062a
commit
dd316dd283
@ -126,11 +126,12 @@ try $CC $CFLAGS $LDFLAGS \
|
|||||||
while test "$LDLIBS"; do
|
while test "$LDLIBS"; do
|
||||||
$debug && echo "Trying libraries: $LDLIBS"
|
$debug && echo "Trying libraries: $LDLIBS"
|
||||||
all_needed=true
|
all_needed=true
|
||||||
|
last_needed=false
|
||||||
for one in $LDLIBS; do
|
for one in $LDLIBS; do
|
||||||
without_one=`echo " $LDLIBS " | sed "s/ $one / /g" | xargs`
|
without_one=`echo " $LDLIBS " | sed "s/ $one / /g" | xargs`
|
||||||
# "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
|
# "lib1 lib2 lib3" -> "-llib1 -llib2 -llib3"
|
||||||
l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
|
l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
|
||||||
test "x$l_list" != "x" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
|
test x"$l_list" != x"" && l_list="-Wl,--start-group $l_list -Wl,--end-group"
|
||||||
$debug && echo "Trying -l options: '$l_list'"
|
$debug && echo "Trying -l options: '$l_list'"
|
||||||
try $CC $CFLAGS $LDFLAGS \
|
try $CC $CFLAGS $LDFLAGS \
|
||||||
-o $EXE \
|
-o $EXE \
|
||||||
@ -143,16 +144,19 @@ while test "$LDLIBS"; do
|
|||||||
echo " Library $one is not needed"
|
echo " Library $one is not needed"
|
||||||
LDLIBS="$without_one"
|
LDLIBS="$without_one"
|
||||||
all_needed=false
|
all_needed=false
|
||||||
|
last_needed=false
|
||||||
else
|
else
|
||||||
echo " Library $one is needed"
|
echo " Library $one is needed"
|
||||||
|
last_needed=true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
# All libs were needed, can't remove any
|
# All libs were needed, can't remove any
|
||||||
$all_needed && break
|
$all_needed && break
|
||||||
# If there is no space char, the list has just one lib.
|
# Optimization: was the last tried lib needed?
|
||||||
# I'm not sure that in this case lib really is 100% needed.
|
if $last_needed; then
|
||||||
# Let's try linking without it anyway... thus commented out.
|
# Was it the only one lib left? Don't test again then.
|
||||||
#{ echo "$LDLIBS" | grep -q ' '; } || break
|
{ echo "$LDLIBS" | grep -q ' '; } || break
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Make the binary with final, minimal list of libs
|
# Make the binary with final, minimal list of libs
|
||||||
|
36
shell/hush.c
36
shell/hush.c
@ -615,6 +615,7 @@ static int builtin_help(char **argv);
|
|||||||
static int builtin_pwd(char **argv);
|
static int builtin_pwd(char **argv);
|
||||||
static int builtin_read(char **argv);
|
static int builtin_read(char **argv);
|
||||||
static int builtin_test(char **argv);
|
static int builtin_test(char **argv);
|
||||||
|
static int builtin_true(char **argv);
|
||||||
static int builtin_set(char **argv);
|
static int builtin_set(char **argv);
|
||||||
static int builtin_shift(char **argv);
|
static int builtin_shift(char **argv);
|
||||||
static int builtin_source(char **argv);
|
static int builtin_source(char **argv);
|
||||||
@ -629,10 +630,10 @@ static int builtin_unset(char **argv);
|
|||||||
* For example, 'unset foo | whatever' will parse and run, but foo will
|
* For example, 'unset foo | whatever' will parse and run, but foo will
|
||||||
* still be set at the end. */
|
* still be set at the end. */
|
||||||
struct built_in_command {
|
struct built_in_command {
|
||||||
const char *cmd; /* name */
|
const char *cmd;
|
||||||
int (*function) (char **argv); /* function ptr */
|
int (*function)(char **argv);
|
||||||
#if ENABLE_HUSH_HELP
|
#if ENABLE_HUSH_HELP
|
||||||
const char *descr; /* description */
|
const char *descr;
|
||||||
#define BLTIN(cmd, func, help) { cmd, func, help }
|
#define BLTIN(cmd, func, help) { cmd, func, help }
|
||||||
#else
|
#else
|
||||||
#define BLTIN(cmd, func, help) { cmd, func }
|
#define BLTIN(cmd, func, help) { cmd, func }
|
||||||
@ -642,24 +643,25 @@ struct built_in_command {
|
|||||||
/* For now, echo and test are unconditionally enabled.
|
/* For now, echo and test are unconditionally enabled.
|
||||||
* Maybe make it configurable? */
|
* Maybe make it configurable? */
|
||||||
static const struct built_in_command bltins[] = {
|
static const struct built_in_command bltins[] = {
|
||||||
|
BLTIN("." , builtin_source, "Run commands in a file"),
|
||||||
|
BLTIN(":" , builtin_true, "No-op"),
|
||||||
BLTIN("[" , builtin_test, "Test condition"),
|
BLTIN("[" , builtin_test, "Test condition"),
|
||||||
BLTIN("[[" , builtin_test, "Test condition"),
|
BLTIN("[[" , builtin_test, "Test condition"),
|
||||||
#if ENABLE_HUSH_JOB
|
#if ENABLE_HUSH_JOB
|
||||||
BLTIN("bg" , builtin_fg_bg, "Resume a job in the background"),
|
BLTIN("bg" , builtin_fg_bg, "Resume a job in the background"),
|
||||||
#endif
|
#endif
|
||||||
// BLTIN("break" , builtin_not_written, "Exit for, while or until loop"),
|
// BLTIN("break" , builtin_not_written, "Exit for, while or until loop"),
|
||||||
BLTIN("cd" , builtin_cd, "Change working directory"),
|
BLTIN("cd" , builtin_cd, "Change directory"),
|
||||||
// BLTIN("continue", builtin_not_written, "Continue for, while or until loop"),
|
// BLTIN("continue", builtin_not_written, "Continue for, while or until loop"),
|
||||||
BLTIN("echo" , builtin_echo, "Write strings to stdout"),
|
BLTIN("echo" , builtin_echo, "Write strings to stdout"),
|
||||||
BLTIN("eval" , builtin_eval, "Construct and run shell command"),
|
BLTIN("eval" , builtin_eval, "Construct and run shell command"),
|
||||||
BLTIN("exec" , builtin_exec, "Exec command, replacing this shell with the exec'd process"),
|
BLTIN("exec" , builtin_exec, "Execute command, don't return to shell"),
|
||||||
BLTIN("exit" , builtin_exit, "Exit from shell"),
|
BLTIN("exit" , builtin_exit, "Exit"),
|
||||||
BLTIN("export", builtin_export, "Set environment variable"),
|
BLTIN("export", builtin_export, "Set environment variable"),
|
||||||
#if ENABLE_HUSH_JOB
|
#if ENABLE_HUSH_JOB
|
||||||
BLTIN("fg" , builtin_fg_bg, "Bring job into the foreground"),
|
BLTIN("fg" , builtin_fg_bg, "Bring job into the foreground"),
|
||||||
BLTIN("jobs" , builtin_jobs, "Lists the active jobs"),
|
BLTIN("jobs" , builtin_jobs, "List active jobs"),
|
||||||
#endif
|
#endif
|
||||||
// TODO: remove pwd? we have it as an applet...
|
|
||||||
BLTIN("pwd" , builtin_pwd, "Print current directory"),
|
BLTIN("pwd" , builtin_pwd, "Print current directory"),
|
||||||
BLTIN("read" , builtin_read, "Input environment variable"),
|
BLTIN("read" , builtin_read, "Input environment variable"),
|
||||||
// BLTIN("return", builtin_not_written, "Return from a function"),
|
// BLTIN("return", builtin_not_written, "Return from a function"),
|
||||||
@ -667,14 +669,12 @@ static const struct built_in_command bltins[] = {
|
|||||||
BLTIN("shift" , builtin_shift, "Shift positional parameters"),
|
BLTIN("shift" , builtin_shift, "Shift positional parameters"),
|
||||||
// BLTIN("trap" , builtin_not_written, "Trap signals"),
|
// BLTIN("trap" , builtin_not_written, "Trap signals"),
|
||||||
BLTIN("test" , builtin_test, "Test condition"),
|
BLTIN("test" , builtin_test, "Test condition"),
|
||||||
// BLTIN("ulimit", builtin_not_written, "Controls resource limits"),
|
// BLTIN("ulimit", builtin_not_written, "Control resource limits"),
|
||||||
BLTIN("umask" , builtin_umask, "Sets file creation mask"),
|
BLTIN("umask" , builtin_umask, "Set file creation mask"),
|
||||||
BLTIN("unset" , builtin_unset, "Unset environment variable"),
|
BLTIN("unset" , builtin_unset, "Unset environment variable"),
|
||||||
BLTIN("." , builtin_source, "Source-in and run commands in a file"),
|
|
||||||
#if ENABLE_HUSH_HELP
|
#if ENABLE_HUSH_HELP
|
||||||
BLTIN("help" , builtin_help, "List shell built-in commands"),
|
BLTIN("help" , builtin_help, "List shell built-in commands"),
|
||||||
#endif
|
#endif
|
||||||
BLTIN(NULL, NULL, NULL)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Signals are grouped, we handle them in batches */
|
/* Signals are grouped, we handle them in batches */
|
||||||
@ -810,6 +810,12 @@ static const char *set_cwd(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* built-in 'true' handler */
|
||||||
|
static int builtin_true(char **argv ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* built-in 'test' handler */
|
/* built-in 'test' handler */
|
||||||
static int builtin_test(char **argv)
|
static int builtin_test(char **argv)
|
||||||
{
|
{
|
||||||
@ -1005,7 +1011,7 @@ static int builtin_help(char **argv ATTRIBUTE_UNUSED)
|
|||||||
|
|
||||||
printf("\nBuilt-in commands:\n");
|
printf("\nBuilt-in commands:\n");
|
||||||
printf("-------------------\n");
|
printf("-------------------\n");
|
||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x != &bltins[ARRAY_SIZE(bltins)]; x++) {
|
||||||
printf("%s\t%s\n", x->cmd, x->descr);
|
printf("%s\t%s\n", x->cmd, x->descr);
|
||||||
}
|
}
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
@ -1583,7 +1589,7 @@ static void pseudo_exec_argv(char **ptrs2free, char **argv)
|
|||||||
* easier to waste a few CPU cycles than it is to figure out
|
* easier to waste a few CPU cycles than it is to figure out
|
||||||
* if this is one of those cases.
|
* if this is one of those cases.
|
||||||
*/
|
*/
|
||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x != &bltins[ARRAY_SIZE(bltins)]; x++) {
|
||||||
if (strcmp(argv[0], x->cmd) == 0) {
|
if (strcmp(argv[0], x->cmd) == 0) {
|
||||||
debug_printf_exec("running builtin '%s'\n", argv[0]);
|
debug_printf_exec("running builtin '%s'\n", argv[0]);
|
||||||
rcode = x->function(argv);
|
rcode = x->function(argv);
|
||||||
@ -1965,7 +1971,7 @@ static int run_pipe(struct pipe *pi)
|
|||||||
p = expand_string_to_string(argv[i]);
|
p = expand_string_to_string(argv[i]);
|
||||||
putenv(p);
|
putenv(p);
|
||||||
}
|
}
|
||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x != &bltins[ARRAY_SIZE(bltins)]; x++) {
|
||||||
if (strcmp(argv[i], x->cmd) == 0) {
|
if (strcmp(argv[i], x->cmd) == 0) {
|
||||||
if (x->function == builtin_exec && argv[i+1] == NULL) {
|
if (x->function == builtin_exec && argv[i+1] == NULL) {
|
||||||
debug_printf("magic exec\n");
|
debug_printf("magic exec\n");
|
||||||
|
2
shell/hush_test/hush-bugs/glob_and_assign.right
Normal file
2
shell/hush_test/hush-bugs/glob_and_assign.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
ZVAR=z.map
|
||||||
|
*.map
|
3
shell/hush_test/zbad2 → shell/hush_test/hush-bugs/glob_and_assign.tests
Normal file → Executable file
3
shell/hush_test/zbad2 → shell/hush_test/hush-bugs/glob_and_assign.tests
Normal file → Executable file
@ -1,5 +1,3 @@
|
|||||||
## TODO: fix and add to testsuite
|
|
||||||
|
|
||||||
## # bash zbad2
|
## # bash zbad2
|
||||||
## ZVAR=z.map
|
## ZVAR=z.map
|
||||||
## *.map
|
## *.map
|
||||||
@ -17,3 +15,4 @@
|
|||||||
ZVAR=*.map /bin/echo ZVAR=*.map
|
ZVAR=*.map /bin/echo ZVAR=*.map
|
||||||
ZVAR=*.map
|
ZVAR=*.map
|
||||||
echo "$ZVAR"
|
echo "$ZVAR"
|
||||||
|
rm ZVAR=z.map
|
1
shell/hush_test/hush-bugs/glob_and_vars.right
Normal file
1
shell/hush_test/hush-bugs/glob_and_vars.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
./glob_and_vars.right ./glob_and_vars.tests
|
2
shell/hush_test/hush-bugs/glob_and_vars.tests
Executable file
2
shell/hush_test/hush-bugs/glob_and_vars.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
v=.
|
||||||
|
echo $v/glob_and_vars.*
|
1
shell/hush_test/hush-bugs/while_in_subshell.right
Normal file
1
shell/hush_test/hush-bugs/while_in_subshell.right
Normal file
@ -0,0 +1 @@
|
|||||||
|
OK: 0
|
2
shell/hush_test/hush-bugs/while_in_subshell.tests
Executable file
2
shell/hush_test/hush-bugs/while_in_subshell.tests
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
(while true; do exit; done)
|
||||||
|
echo OK: $?
|
2
shell/hush_test/hush-misc/colon.right
Normal file
2
shell/hush_test/hush-misc/colon.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
0
|
||||||
|
OK: 0
|
6
shell/hush_test/hush-misc/colon.tests
Executable file
6
shell/hush_test/hush-misc/colon.tests
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
false
|
||||||
|
:
|
||||||
|
echo $?
|
||||||
|
# Extra ; after done is due to a bug
|
||||||
|
(while :; do exit; done;)
|
||||||
|
echo OK: $?
|
@ -1,3 +0,0 @@
|
|||||||
# TODO: hush doesn't know ':' null command
|
|
||||||
|
|
||||||
while :; do exit; done
|
|
Loading…
x
Reference in New Issue
Block a user