hush: functions have priority over builtins (!)
function old new delta pseudo_exec_argv 291 305 +14 run_pipe 1560 1555 -5 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 14/-5) Total: 9 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
bf1c344dfd
commit
75481d3634
5
shell/ash_test/ash-misc/func_prio_over_builtins.right
Normal file
5
shell/ash_test/ash-misc/func_prio_over_builtins.right
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
YES
|
||||||
|
YES
|
||||||
|
YES
|
||||||
|
YES
|
||||||
|
Ok:YES
|
5
shell/ash_test/ash-misc/func_prio_over_builtins.tests
Executable file
5
shell/ash_test/ash-misc/func_prio_over_builtins.tests
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
true() { echo YES >&2; }
|
||||||
|
true
|
||||||
|
true | true
|
||||||
|
(true)
|
||||||
|
echo Ok:`true 2>&1`
|
31
shell/hush.c
31
shell/hush.c
@ -7090,11 +7090,13 @@ static void exec_function(char ***to_free,
|
|||||||
argv[0] = G.global_argv[0];
|
argv[0] = G.global_argv[0];
|
||||||
G.global_argv = argv;
|
G.global_argv = argv;
|
||||||
G.global_argc = n = 1 + string_array_len(argv + 1);
|
G.global_argc = n = 1 + string_array_len(argv + 1);
|
||||||
|
//? close_saved_fds_and_FILE_list();
|
||||||
/* On MMU, funcp->body is always non-NULL */
|
/* On MMU, funcp->body is always non-NULL */
|
||||||
n = run_list(funcp->body);
|
n = run_list(funcp->body);
|
||||||
fflush_all();
|
fflush_all();
|
||||||
_exit(n);
|
_exit(n);
|
||||||
# else
|
# else
|
||||||
|
//? close_saved_fds_and_FILE_list();
|
||||||
re_execute_shell(to_free,
|
re_execute_shell(to_free,
|
||||||
funcp->body_as_string,
|
funcp->body_as_string,
|
||||||
G.global_argv[0],
|
G.global_argv[0],
|
||||||
@ -7180,6 +7182,7 @@ static void exec_builtin(char ***to_free,
|
|||||||
#if BB_MMU
|
#if BB_MMU
|
||||||
int rcode;
|
int rcode;
|
||||||
fflush_all();
|
fflush_all();
|
||||||
|
//? close_saved_fds_and_FILE_list();
|
||||||
rcode = x->b_function(argv);
|
rcode = x->b_function(argv);
|
||||||
fflush_all();
|
fflush_all();
|
||||||
_exit(rcode);
|
_exit(rcode);
|
||||||
@ -7301,6 +7304,16 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save,
|
|||||||
goto skip;
|
goto skip;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ENABLE_HUSH_FUNCTIONS
|
||||||
|
/* Check if the command matches any functions (this goes before bltins) */
|
||||||
|
{
|
||||||
|
const struct function *funcp = find_function(argv[0]);
|
||||||
|
if (funcp) {
|
||||||
|
exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check if the command matches any of the builtins.
|
/* Check if the command matches any of the builtins.
|
||||||
* Depending on context, this might be redundant. But it's
|
* Depending on context, this might be redundant. But it's
|
||||||
* 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
|
||||||
@ -7317,15 +7330,6 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save,
|
|||||||
exec_builtin(&nommu_save->argv_from_re_execing, x, argv);
|
exec_builtin(&nommu_save->argv_from_re_execing, x, argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if ENABLE_HUSH_FUNCTIONS
|
|
||||||
/* Check if the command matches any functions */
|
|
||||||
{
|
|
||||||
const struct function *funcp = find_function(argv[0]);
|
|
||||||
if (funcp) {
|
|
||||||
exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLE_FEATURE_SH_STANDALONE
|
#if ENABLE_FEATURE_SH_STANDALONE
|
||||||
/* Check if the command matches any busybox applets */
|
/* Check if the command matches any busybox applets */
|
||||||
@ -7339,7 +7343,7 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save,
|
|||||||
* should not show tty fd open.
|
* should not show tty fd open.
|
||||||
*/
|
*/
|
||||||
close_saved_fds_and_FILE_list();
|
close_saved_fds_and_FILE_list();
|
||||||
///FIXME: should also close saved redir fds
|
//FIXME: should also close saved redir fds
|
||||||
debug_printf_exec("running applet '%s'\n", argv[0]);
|
debug_printf_exec("running applet '%s'\n", argv[0]);
|
||||||
run_applet_no_and_exit(a, argv[0], argv);
|
run_applet_no_and_exit(a, argv[0], argv);
|
||||||
}
|
}
|
||||||
@ -7976,12 +7980,13 @@ static NOINLINE int run_pipe(struct pipe *pi)
|
|||||||
return G.last_exitcode;
|
return G.last_exitcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
x = find_builtin(argv_expanded[0]);
|
|
||||||
#if ENABLE_HUSH_FUNCTIONS
|
#if ENABLE_HUSH_FUNCTIONS
|
||||||
funcp = NULL;
|
/* Check if argv[0] matches any functions (this goes before bltins) */
|
||||||
if (!x)
|
|
||||||
funcp = find_function(argv_expanded[0]);
|
funcp = find_function(argv_expanded[0]);
|
||||||
#endif
|
#endif
|
||||||
|
x = NULL;
|
||||||
|
if (!funcp)
|
||||||
|
x = find_builtin(argv_expanded[0]);
|
||||||
if (x || funcp) {
|
if (x || funcp) {
|
||||||
if (!funcp) {
|
if (!funcp) {
|
||||||
if (x->b_function == builtin_exec && argv_expanded[1] == NULL) {
|
if (x->b_function == builtin_exec && argv_expanded[1] == NULL) {
|
||||||
|
5
shell/hush_test/hush-misc/func_prio_over_builtins.right
Normal file
5
shell/hush_test/hush-misc/func_prio_over_builtins.right
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
YES
|
||||||
|
YES
|
||||||
|
YES
|
||||||
|
YES
|
||||||
|
Ok:YES
|
5
shell/hush_test/hush-misc/func_prio_over_builtins.tests
Executable file
5
shell/hush_test/hush-misc/func_prio_over_builtins.tests
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
true() { echo YES >&2; }
|
||||||
|
true
|
||||||
|
true | true
|
||||||
|
(true)
|
||||||
|
echo Ok:`true 2>&1`
|
Loading…
Reference in New Issue
Block a user