]> granicus.if.org Git - psmisc/commitdiff
added Davids suggestion for process name selection
authorCraig Small <csmall@users.sourceforge.net>
Mon, 19 Mar 2001 02:10:59 +0000 (02:10 +0000)
committerCraig Small <csmall@users.sourceforge.net>
Mon, 19 Mar 2001 02:10:59 +0000 (02:10 +0000)
ChangeLog
src/killall.c

index c6b14a4ced9ae005e1e914088447809387067de3..ef87d2bfde1badedeb3ebeb2c8003000a3f6d1c7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,7 +6,8 @@ Changes from 19 to 20 (14-DEC-2000)
  - signames.h generated better (suggested by Grant Erickson)
  - uses getopt() for better command line stuff
  - makes less assumptions about process name, closes Debian Bug #53337
- - Doesn't use losetup for loop deivces in fuser.
+ - Doesn't use losetup for loop devices in fuser.
+ - Better selection of process name (thanks to David desJardins)
 
 Changes from version 18 to 19 (25-OCT-1999)
 =============================
index 8453678250de0bff97164a70b5f443821258f079..bc25c07c5fb4bae777b44f448b2bb81ae3fabee2 100644 (file)
@@ -154,8 +154,32 @@ kill_all (int signal, int names, char **namelist)
          sprintf (path, PROC_BASE "/%d/cmdline", pid_table[i]);
          if (!(file = fopen (path, "r")))
            continue;
-         okay = fscanf (file, "%s", command_buf) == 1;
-         (void) fclose (file);
+          while (1) {
+            /* look for actual command so we skip over initial "sh" if any */
+            char *p;
+            /* 'cmdline' has arguments separated by nulls */
+            for (p=command_buf; p<command_buf+PATH_MAX; p++) {
+              int c = fgetc(file);
+              if (c == EOF || c == '\0') {
+                *p = '\0';
+                break;
+              } else {
+                *p = c;
+              }
+            }
+            if (strlen(command_buf) == 0) {
+              okay = 0;
+              break;
+            }
+            p = strrchr(command_buf,'/');
+            p = p ? p+1 : command_buf;
+            if (strncmp(p, comm, COMM_LEN-1) == 0) {
+              okay = 1;
+              command = p;
+              break;
+            }
+          }
+          (void) fclose(file);
          if (exact && !okay)
            {
              if (verbose)
@@ -164,14 +188,6 @@ kill_all (int signal, int names, char **namelist)
              continue;
            }
          got_long = okay;
-         if (okay)
-           {
-             command = strrchr (command_buf, '/');
-             if (command)
-               command++;
-             else
-               command = command_buf;
-           }
        }
       for (j = 0; j < names; j++)
        {