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

Reply via email to