diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-14 15:01:47 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-02-14 15:01:47 +0000 |
commit | 28bf671d6d92d0c2842bd5f4555f5af937a0a6db (patch) | |
tree | 2c4a7e733078ca46d6c14079f7a7a2b930ae3648 | |
parent | f1d93ec4206b50f7971f7df391dfc9bd52da8344 (diff) |
ash: make ash -c 'if set -o barfoo 2>/dev/null; then echo foo; else echo bar; fi' work
(fixes bug 1142)
function old new delta
options 551 565 +14
ash_main 1397 1411 +14
setcmd 77 90 +13
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 41/0) Total: 41 bytes
-rw-r--r-- | shell/ash.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/shell/ash.c b/shell/ash.c index 0634f1868..612172043 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -9076,7 +9076,7 @@ setparam(char **argv) * Process shell options. The global variable argptr contains a pointer * to the argument list; we advance it past the options. */ -static void +static int minus_o(char *name, int val) { int i; @@ -9085,15 +9085,17 @@ minus_o(char *name, int val) for (i = 0; i < NOPTS; i++) { if (strcmp(name, optnames(i)) == 0) { optlist[i] = val; - return; + return 0; } } - ash_msg_and_raise_error("illegal option -o %s", name); + ash_msg("illegal option -o %s", name); + return 1; } out1str("Current option settings\n"); for (i = 0; i < NOPTS; i++) out1fmt("%-16s%s\n", optnames(i), optlist[i] ? "on" : "off"); + return 0; } static void setoption(int flag, int val) @@ -9109,7 +9111,7 @@ setoption(int flag, int val) ash_msg_and_raise_error("illegal option -%c", flag); /* NOTREACHED */ } -static void +static int options(int cmdline) { char *p; @@ -9144,7 +9146,10 @@ options(int cmdline) if (c == 'c' && cmdline) { minusc = p; /* command is after shell args */ } else if (c == 'o') { - minus_o(*argptr, val); + if (minus_o(*argptr, val)) { + /* it already printed err message */ + return 1; /* error */ + } if (*argptr) argptr++; } else if (cmdline && (c == 'l')) { /* -l or +l == --login */ @@ -9159,6 +9164,7 @@ options(int cmdline) } } } + return 0; } /* @@ -9228,16 +9234,21 @@ showvars(const char *sep_prefix, int on, int off) static int setcmd(int argc, char **argv) { + int retval; + if (argc == 1) return showvars(nullstr, 0, VUNSET); INT_OFF; - options(0); - optschanged(); - if (*argptr != NULL) { - setparam(argptr); + retval = 1; + if (!options(0)) { /* if no parse error... */ + retval = 0; + optschanged(); + if (*argptr != NULL) { + setparam(argptr); + } } INT_ON; - return 0; + return retval; } #if ENABLE_ASH_RANDOM_SUPPORT @@ -12790,7 +12801,10 @@ procargs(int argc, char **argv) for (i = 0; i < NOPTS; i++) optlist[i] = 2; argptr = xargv; - options(1); + if (options(1)) { + /* it already printed err message */ + raise_exception(EXERROR); + } xargv = argptr; xminusc = minusc; if (*xargv == NULL) { |