diff options
author | Rob Landley <rob@landley.net> | 2012-02-26 16:11:25 -0600 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2012-02-26 16:11:25 -0600 |
commit | b081ce98999111aa5518388ed7eb8e5ceb5629f9 (patch) | |
tree | c77a18ab860a7ee9a33fe8830a8b1bc3d05c5d44 | |
parent | 2dd50adc460e63c57eddb696f908dd6b1abfd723 (diff) | |
download | toybox-b081ce98999111aa5518388ed7eb8e5ceb5629f9.tar.gz |
Teach lib/args.c that " " this option must take a _separate_ argument, so "kill -stop" and "kill -s top" aren't the same thing. Make kill.c use it, and remove leftover debug printfs.
-rw-r--r-- | lib/args.c | 14 | ||||
-rw-r--r-- | toys/kill.c | 4 |
2 files changed, 10 insertions, 8 deletions
@@ -23,8 +23,10 @@ // Same <LOW>HIGH=DEFAULT as # // @ plus an occurrence counter (which is a long) // (longopt) -// | this is required. If more than one marked, only one required. +// | this is required. If more than one marked, only one required. TODO // ^ Stop parsing after encountering this argument +// " " (space char) the "plus an argument" must be separate +// I.E. "-j 3" not "-j3". So "kill -stop" != "kill -s top" // // These modify other option letters (previously seen in string): // +X enabling this enables X (switch on) @@ -175,7 +177,8 @@ static int gotflag(struct getoptflagstate *gof) void parse_optflaglist(struct getoptflagstate *gof) { - char *options = toys.which->options, *plustildenot = "+~!", *limits = "<>="; + char *options = toys.which->options, *plustildenot = "+~!", + *limits = "<>=", *flagbits="|^ "; long *nextarg = (long *)&this; struct opts *new = 0; int i; @@ -255,8 +258,8 @@ void parse_optflaglist(struct getoptflagstate *gof) } new->edx[idx] |= 1<<i; } else if (*options == '[') { // TODO - } else if (*options == '|') new->flags |= 1; - else if (*options == '^') new->flags |= 2; + } else if (0 != (temp = strchr(flagbits, *options))) + new->flags |= 1<<(temp-flagbits); // bounds checking else if (0 != (temp = strchr(limits, *options))) { i = temp - limits; @@ -382,7 +385,8 @@ void get_optflags(void) // Identify next option char. for (gof.this = gof.opts; gof.this; gof.this = gof.this->next) - if (*gof.arg == gof.this->c) break; + if (*gof.arg == gof.this->c) + if (!((gof.this->flags&4) && gof.arg[1])) break; // Handle option char (advancing past what was used) if (gotflag(&gof) ) { diff --git a/toys/kill.c b/toys/kill.c index d9beda33..e64a146b 100644 --- a/toys/kill.c +++ b/toys/kill.c @@ -6,7 +6,7 @@ * * See http://opengroup.org/onlinepubs/9699919799/utilities/kill.html -USE_KILL(NEWTOY(kill, "?s:l", TOYFLAG_BIN)) +USE_KILL(NEWTOY(kill, "?s: l", TOYFLAG_BIN)) config KILL bool "kill" @@ -45,10 +45,8 @@ void kill_main(void) } // signal must come before pids, so "kill -9 -1" isn't confusing. -printf("*args=%s\n", *args); if (!TT.signame && *args && **args=='-') TT.signame=*(args++)+1; -printf("TT.signame=%s\n", TT.signame); if (TT.signame) { char *arg; int i = strtol(TT.signame, &arg, 10); |