diff options
author | Elliott Hughes <enh@google.com> | 2019-07-01 16:15:55 -0700 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2019-07-06 16:15:35 -0500 |
commit | 82a33b3f060e163b14155e8f6833ec30514a609b (patch) | |
tree | 8ea5cce41b024233ef8af23dcaf12a1068e9b0be | |
parent | 3d8bbdc83d8b4891c1b887942e054974eb6291b7 (diff) | |
download | toybox-82a33b3f060e163b14155e8f6833ec30514a609b.tar.gz |
killall: better handling of long names.
Change names_to_pid() so that we can actually match shell scripts with
long names (the code to get the shell script's name was correct, but
there was an extra test preventing us from actually comparing it to the
sought name).
In kill.c itself, remove a dead test for -l and switch to the FLAG()
macro.
Also extend the tests to explicitly cover long and short names.
-rw-r--r-- | lib/lib.c | 2 | ||||
-rw-r--r-- | tests/killall.test | 12 | ||||
-rw-r--r-- | toys/lsb/killall.c | 12 |
3 files changed, 16 insertions, 10 deletions
@@ -1093,7 +1093,7 @@ void names_to_pid(char **names, int (*callback)(pid_t pid, char *name)) cmd[len] = 0; } if (!strcmp(bb, getbasename(cmd))) goto match; - if (bb!=*cur && !strcmp(bb, getbasename(cmd+strlen(cmd)+1))) goto match; + if (!strcmp(bb, getbasename(cmd+strlen(cmd)+1))) goto match; continue; match: if (callback(u, *cur)) break; diff --git a/tests/killall.test b/tests/killall.test index 40f6cb35..7e171d46 100644 --- a/tests/killall.test +++ b/tests/killall.test @@ -5,10 +5,16 @@ #testing "name" "command" "result" "infile" "stdin" echo "#!$(which sh) -yes > /dev/null" > toybox.killall.test.script +while true; do + sleep 0.1 +done" > toybox.killall.test.script chmod a+x toybox.killall.test.script +cp toybox.killall.test.script toybox.test + +./toybox.test & +testing "short name" "killall toybox.test && echo killed ; pgrep -l toybox.test || echo really" "killed\nreally\n" "" "" ./toybox.killall.test.script & -testing "script" "killall toybox.killall.test.script && echo killed ; pgrep -l toybox.killall.test.script || echo really" "killed\nreally\n" "" "" +testing "long name" "killall toybox.killall.test.script && echo killed ; pgrep -l toybox.killall.test.script || echo really" "killed\nreally\n" "" "" -rm -f toybox.killall.test.script +rm -f toybox.killall.test.script toybox.test diff --git a/toys/lsb/killall.c b/toys/lsb/killall.c index 119e01fa..47aea23d 100644 --- a/toys/lsb/killall.c +++ b/toys/lsb/killall.c @@ -39,7 +39,7 @@ static int kill_process(pid_t pid, char *name) if (pid == TT.cur_pid) return 0; - if (toys.optflags & FLAG_i) { + if (FLAG(i)) { fprintf(stderr, "Signal %s(%d)", name, (int)pid); if (!yesno(0)) return 0; } @@ -53,8 +53,8 @@ static int kill_process(pid_t pid, char *name) } else offset++; } if (errno) { - if (!(toys.optflags & FLAG_q)) perror_msg("pid %d", (int)pid); - } else if (toys.optflags & FLAG_v) + if (!FLAG(q)) perror_msg("pid %d", (int)pid); + } else if (FLAG(v)) printf("Killed %s(%d) with signal %d\n", name, pid, TT.signum); return 0; @@ -67,14 +67,14 @@ void killall_main(void) TT.names = toys.optargs; TT.signum = SIGTERM; - if (toys.optflags & FLAG_l) { + if (FLAG(l)) { list_signals(); return; } if (TT.s || (*TT.names && **TT.names == '-')) { if (0 > (TT.signum = sig_to_num(TT.s ? TT.s : (*TT.names)+1))) { - if (toys.optflags & FLAG_q) exit(1); + if (FLAG(q)) exit(1); error_exit("Invalid signal"); } if (!TT.s) { @@ -83,7 +83,7 @@ void killall_main(void) } } - if (!(toys.optflags & FLAG_l) && !toys.optc) help_exit("no name"); + if (!toys.optc) help_exit("no name"); TT.cur_pid = getpid(); |