--- ./shell/ash.c.orig 2004-02-18 10:40:41.000000000 +0100 +++ ./shell/ash.c 2004-03-17 12:22:54.000000000 +0100 @@ -3640,11 +3640,27 @@ static void delete_cmd_entry(void); * have to change the find_command routine as well. */ +static inline void _applet_exec(char **argv, char **envp) +{ + tryexec(argv[0], argv, envp); +} + +static inline void _binary_exec(char **argv, char **envp, const char *path, int idx) +{ + char *cmdname; + while ((cmdname = padvance(&path, argv[0])) != NULL) { + if (--idx < 0 && pathopt == NULL) { + tryexec(cmdname, argv, envp); + } + stunalloc(cmdname); + } +} + + static void shellexec(char **argv, const char *path, int idx) { - char *cmdname; - int e; + int e, builtin=0; char **envp; clearredir(1); @@ -3653,20 +3669,17 @@ shellexec(char **argv, const char *path, #ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL || find_applet_by_name(argv[0]) #endif - ) { - tryexec(argv[0], argv, envp); - e = errno; - } else { - e = ENOENT; - while ((cmdname = padvance(&path, argv[0])) != NULL) { - if (--idx < 0 && pathopt == NULL) { - tryexec(cmdname, argv, envp); - if (errno != ENOENT && errno != ENOTDIR) - e = errno; - } - stunalloc(cmdname); - } - } + ) builtin=1; +#ifdef CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN + _applet_exec(argv, envp); + if (errno == ENOENT) + _binary_exec(argv, envp, path, idx); +#else + _binary_exec(argv, envp, path, idx); + if (errno == ENOENT) + _applet_exec(argv, envp); +#endif + e = errno; /* Map to POSIX errors */ switch (e) {