On 12/10/12 14:09, Todd C. Miller wrote: > On Sun, 09 Dec 2012 00:04:57 +0100, Alexander Hall wrote: > >> This diff follows your line, but allows *action to return match, error >> or nomatch, handled appropriately by the main loop. Also make the same >> changes to killact(). >> >> I have yet to make it fail my tests. Makes sense? OK? > > Looks good to me, OK millert@
Hm, reading the diff again, I felt grepact() got a bit messy. This cleans it up a bit. Rest should be the same. OK? /Alexander Index: pkill.c =================================================================== RCS file: /data/openbsd/cvs/src/usr.bin/pkill/pkill.c,v retrieving revision 1.30 diff -u -p -r1.30 pkill.c --- pkill.c 21 Aug 2012 10:32:38 -0000 1.30 +++ pkill.c 11 Dec 2012 23:35:50 -0000 @@ -419,10 +419,18 @@ main(int argc, char **argv) if (selected[i] == inverse) continue; - if ((*action)(kp, j++) == -1) + switch ((*action)(kp, j++)) { + case STATUS_MATCH: + if (rv != STATUS_ERROR) + rv = STATUS_MATCH; + break; + case STATUS_NOMATCH: + j--; + break; + case STATUS_ERROR: rv = STATUS_ERROR; - else if (rv != STATUS_ERROR) - rv = STATUS_MATCH; + break; + } } if (pgrep && j && !quiet) putchar('\n'); @@ -453,11 +461,13 @@ killact(struct kinfo_proc *kp, int dummy if (longfmt && !quiet) printf("%d %s\n", (int)kp->p_pid, kp->p_comm); - if (kill(kp->p_pid, signum) == -1 && errno != ESRCH) { + if (kill(kp->p_pid, signum) == -1) { + if (errno == ESRCH) + return (STATUS_NOMATCH); warn("signalling pid %d", (int)kp->p_pid); - return (-1); + return (STATUS_ERROR); } - return (0); + return (STATUS_MATCH); } int @@ -466,13 +476,13 @@ grepact(struct kinfo_proc *kp, int print char **argv; if (quiet) - return (0); + return (STATUS_MATCH); + if (longfmt && matchargs) + if ((argv = kvm_getargv(kd, kp, 0)) == NULL) + return (errno == ESRCH ? STATUS_NOMATCH : STATUS_ERROR); if (printdelim) fputs(delim, stdout); if (longfmt && matchargs) { - if ((argv = kvm_getargv(kd, kp, 0)) == NULL) - return (-1); - printf("%d ", (int)kp->p_pid); for (; *argv != NULL; argv++) { printf("%s", *argv); @@ -484,7 +494,7 @@ grepact(struct kinfo_proc *kp, int print else printf("%d", (int)kp->p_pid); - return (0); + return (STATUS_MATCH); } void