| @@ -7090,11 +7090,13 @@ static void exec_function(char ***to_free, |
| argv[0] = G.global_argv[0]; |
| G.global_argv = argv; |
| G.global_argc = n = 1 + string_array_len(argv + 1); |
| + | //? close_saved_fds_and_FILE_list(); |
| /* On MMU, funcp->body is always non-NULL */ |
| n = run_list(funcp->body); |
| fflush_all(); |
| _exit(n); |
| # else |
| + | //? close_saved_fds_and_FILE_list(); |
| re_execute_shell(to_free, |
| funcp->body_as_string, |
| G.global_argv[0], |
| @@ -7180,6 +7182,7 @@ static void exec_builtin(char ***to_free, |
| #if BB_MMU |
| int rcode; |
| fflush_all(); |
| + | //? close_saved_fds_and_FILE_list(); |
| rcode = x->b_function(argv); |
| fflush_all(); |
| _exit(rcode); |
| @@ -7301,6 +7304,16 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save, |
| goto skip; |
| #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. |
| * Depending on context, this might be redundant. But it's |
| * 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); |
| } |
| } |
| - | #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 |
| /* 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. |
| */ |
| 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]); |
| 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; |
| } |
| |
| - | x = find_builtin(argv_expanded[0]); |
| #if ENABLE_HUSH_FUNCTIONS |
| - | funcp = NULL; |
| - | if (!x) |
| - | funcp = find_function(argv_expanded[0]); |
| + | /* Check if argv[0] matches any functions (this goes before bltins) */ |
| + | funcp = find_function(argv_expanded[0]); |
| #endif |
| + | x = NULL; |
| + | if (!funcp) |
| + | x = find_builtin(argv_expanded[0]); |
| if (x || funcp) { |
| if (!funcp) { |
| if (x->b_function == builtin_exec && argv_expanded[1] == NULL) { |