diff options
-rw-r--r-- | shell/ash.c | 132 |
1 files changed, 57 insertions, 75 deletions
diff --git a/shell/ash.c b/shell/ash.c index 1de4cb50b..a7e282377 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -155,8 +155,9 @@ static char gotsig[NSIG - 1]; static char *arg0; /* value of $0 */ -/* ============ Interrupts / exceptions - * +/* ============ Interrupts / exceptions */ + +/* * We enclose jmp_buf in a structure so that we can declare pointers to * jump locations. The global variable handler contains the location to * jump to when an exception occurs, and the global variable exception @@ -8045,14 +8046,46 @@ localcmd(int argc, char **argv) return 0; } +static int +falsecmd(int argc, char **argv) +{ + return 1; +} + +static int +truecmd(int argc, char **argv) +{ + return 0; +} + +static int +execcmd(int argc, char **argv) +{ + if (argc > 1) { + iflag = 0; /* exit on error */ + mflag = 0; + optschanged(); + shellexec(argv + 1, pathval(), 0); + } + return 0; +} + +/* + * The return command. + */ +static int +returncmd(int argc, char **argv) +{ + /* + * If called outside a function, do what ksh does; + * skip the rest of the file. + */ + evalskip = funcnest ? SKIPFUNC : SKIPFILE; + return argv[1] ? number(argv[1]) : exitstatus; +} + /* Forward declarations for builtintab[] */ -#if JOBS -static int fg_bgcmd(int, char **); -#endif static int breakcmd(int, char **); -#if ENABLE_ASH_CMDCMD -static int commandcmd(int, char **); -#endif static int dotcmd(int, char **); static int evalcmd(int, char **); #if ENABLE_ASH_BUILTIN_ECHO @@ -8061,39 +8094,22 @@ static int echocmd(int, char **); #if ENABLE_ASH_BUILTIN_TEST static int testcmd(int, char **); #endif -static int execcmd(int, char **); static int exitcmd(int, char **); static int exportcmd(int, char **); -static int falsecmd(int, char **); #if ENABLE_ASH_GETOPTS static int getoptscmd(int, char **); #endif -static int hashcmd(int, char **); -#if !ENABLE_FEATURE_SH_EXTRA_QUIET -static int helpcmd(int argc, char **argv); -#endif -#if JOBS -static int jobscmd(int, char **); -#endif #if ENABLE_ASH_MATH_SUPPORT static int letcmd(int, char **); #endif -static int pwdcmd(int, char **); static int readcmd(int, char **); -static int returncmd(int, char **); static int setcmd(int, char **); static int shiftcmd(int, char **); static int timescmd(int, char **); static int trapcmd(int, char **); -static int truecmd(int, char **); -static int typecmd(int, char **); static int umaskcmd(int, char **); static int unsetcmd(int, char **); -static int waitcmd(int, char **); static int ulimitcmd(int, char **); -#if JOBS -static int killcmd(int, char **); -#endif #define BUILTIN_NOSPEC "0" #define BUILTIN_SPECIAL "1" @@ -8505,9 +8521,10 @@ prehash(union node *n) } -/* - * Builtin commands. Builtin commands whose functions are closely - * tied to evaluation are implemented here. +/* ============ Builtin commands + * + * Builtin commands whose functions are closely tied to evaluation + * are implemented here. */ /* @@ -8520,7 +8537,6 @@ prehash(union node *n) * be an error to break out of more loops than exist, but it isn't * in the standard shell so we don't make it one here. */ - static int breakcmd(int argc, char **argv) { @@ -8531,50 +8547,12 @@ breakcmd(int argc, char **argv) if (n > loopnest) n = loopnest; if (n > 0) { - evalskip = (**argv == 'c')? SKIPCONT : SKIPBREAK; + evalskip = (**argv == 'c') ? SKIPCONT : SKIPBREAK; skipcount = n; } return 0; } -/* - * The return command. - */ -static int -returncmd(int argc, char **argv) -{ - /* - * If called outside a function, do what ksh does; - * skip the rest of the file. - */ - evalskip = funcnest ? SKIPFUNC : SKIPFILE; - return argv[1] ? number(argv[1]) : exitstatus; -} - -static int -falsecmd(int argc, char **argv) -{ - return 1; -} - -static int -truecmd(int argc, char **argv) -{ - return 0; -} - -static int -execcmd(int argc, char **argv) -{ - if (argc > 1) { - iflag = 0; /* exit on error */ - mflag = 0; - optschanged(); - shellexec(argv + 1, pathval(), 0); - } - return 0; -} - /* ============ input.c * @@ -10876,8 +10854,7 @@ parseheredoc(void) /* - * called by editline -- any expansions to the prompt - * should be added here. + * called by editline -- any expansions to the prompt should be added here. */ #if ENABLE_ASH_EXPAND_PRMT static const char * @@ -10900,7 +10877,6 @@ expandstr(const char *ps) } #endif - /* * Execute a command or commands contained in a string. */ @@ -11207,10 +11183,16 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path) /* If %builtin not in path, check for builtin next */ bcmd = find_builtin(name); - if (bcmd && (IS_BUILTIN_REGULAR(bcmd) || ( - act & DO_ALTPATH ? !(act & DO_ALTBLTIN) : builtinloc <= 0 - ))) - goto builtin_success; + if (bcmd) { + if (IS_BUILTIN_REGULAR(bcmd)) + goto builtin_success; + if (act & DO_ALTPATH) { + if (!(act & DO_ALTBLTIN)) + goto builtin_success; + } else if (builtinloc <= 0) { + goto builtin_success; + } + } /* We have to search path. */ prev = -1; /* where to start */ |