]> granicus.if.org Git - procps-ng/commitdiff
pgrep: a few tweaks to the <pids> interface conversion
authorJim Warner <james.warner@comcast.net>
Sun, 4 Oct 2015 16:00:00 +0000 (11:00 -0500)
committerCraig Small <csmall@enc.com.au>
Mon, 5 Oct 2015 09:30:40 +0000 (20:30 +1100)
Signed-off-by: Jim Warner <james.warner@comcast.net>
pgrep.c

diff --git a/pgrep.c b/pgrep.c
index 9e60977c9cce6c5c25aec4840315744ff7790b4f..e1a7c831a68027cc699ed05679e7fb427a27c3d8 100644 (file)
--- a/pgrep.c
+++ b/pgrep.c
@@ -61,14 +61,15 @@ enum pids_item Items[] = {
     PROCPS_PIDS_ID_RUID,
     PROCPS_PIDS_ID_RGID,
     PROCPS_PIDS_ID_SESSION,
+    PROCPS_PIDS_ID_TGID,
     PROCPS_PIDS_TIME_START,
     PROCPS_PIDS_TTY_NAME,
     PROCPS_PIDS_CMD,
-    PROCPS_PIDS_CMDLINE,
+    PROCPS_PIDS_CMDLINE
 };
 enum rel_items {
-    EU_TGID, EU_PPID, EU_PGRP, EU_EUID, EU_RUID, EU_RGID, EU_SESSION,
-    EU_STARTTIME, EU_TTY_NAME, EU_CMD, EU_CMDLINE
+    EU_PID, EU_PPID, EU_PGRP, EU_EUID, EU_RUID, EU_RGID, EU_SESSION,
+    EU_TGID, EU_STARTTIME, EU_TTYNAME, EU_CMD, EU_CMDLINE
 };
 static int i_am_pkill = 0;
 
@@ -478,9 +479,8 @@ static struct el * select_procs (int *num)
     struct procps_pidsinfo *info=NULL;
     struct procps_namespaces nsp;
     struct pids_stack *stack;
-
     unsigned long long saved_start_time;      /* for new/old support */
-    pid_t saved_pid = 0;                      /* for new/old support */
+    int saved_pid = 0;                        /* for new/old support */
     int matches = 0;
     int size = 0;
     regex_t *preg;
@@ -503,7 +503,7 @@ static struct el * select_procs (int *num)
               _("Error reading reference namespace information\n"));
     }
 
-    if (procps_pids_new(&info, 11, Items) < 0)
+    if (procps_pids_new(&info, 12, Items) < 0)
         xerrx(EXIT_FATAL,
               _("Unable to create pid info structure"));
     if (opt_threads && !i_am_pkill)
@@ -517,7 +517,7 @@ static struct el * select_procs (int *num)
     while ((stack = procps_pids_read_next(info))) {
         int match = 1;
 
-        if (PIDS_GETINT(TGID) == myself)
+        if (PIDS_GETINT(PID) == myself)
             continue;
         else if (opt_newest && PIDS_GETULL(STARTTIME) < saved_start_time)
             match = 0;
@@ -537,21 +537,23 @@ static struct el * select_procs (int *num)
             match = 0;
         else if (opt_sid && ! match_numlist (PIDS_GETINT(SESSION), opt_sid))
             match = 0;
-        else if (opt_ns_pid && ! match_ns (PIDS_GETINT(TGID), &nsp))
+        else if (opt_ns_pid && ! match_ns (PIDS_GETINT(PID), &nsp))
             match = 0;
         else if (opt_term)
-            match = match_strlist(PIDS_GETSTR(TTY_NAME), opt_term);
+            match = match_strlist(PIDS_GETSTR(TTYNAME), opt_term);
 
         task_cmdline = PIDS_GETSTR(CMDLINE);
+        task_cmdline[CMDSTRSIZE -1] = '\0';
+
         if (opt_long || opt_longlong || (match && opt_pattern)) {
-            if (opt_longlong && task_cmdline)
+            if (opt_longlong)
                 strncpy (cmdoutput, task_cmdline, CMDSTRSIZE);
             else
                 strncpy (cmdoutput, PIDS_GETSTR(CMD), CMDSTRSIZE);
         }
 
         if (match && opt_pattern) {
-            if (opt_full && task_cmdline)
+            if (opt_full)
                 strncpy (cmdsearch, task_cmdline, CMDSTRSIZE);
             else
                 strncpy (cmdsearch, PIDS_GETSTR(CMD), CMDSTRSIZE);
@@ -563,18 +565,18 @@ static struct el * select_procs (int *num)
         if (match ^ opt_negate) {    /* Exclusive OR is neat */
             if (opt_newest) {
                 if (saved_start_time == PIDS_GETULL(STARTTIME) &&
-                    saved_pid > PIDS_GETINT(TGID))
+                    saved_pid > PIDS_GETINT(PID))
                     continue;
                 saved_start_time = PIDS_GETULL(STARTTIME);
-                saved_pid = PIDS_GETINT(TGID);
+                saved_pid = PIDS_GETINT(PID);
                 matches = 0;
             }
             if (opt_oldest) {
                 if (saved_start_time == PIDS_GETULL(STARTTIME) &&
-                    saved_pid < PIDS_GETINT(TGID))
+                    saved_pid < PIDS_GETINT(PID))
                     continue;
                 saved_start_time = PIDS_GETULL(STARTTIME);
-                saved_pid = PIDS_GETINT(TGID);
+                saved_pid = PIDS_GETINT(PID);
                 matches = 0;
             }
             if (matches == size) {
@@ -582,18 +584,22 @@ static struct el * select_procs (int *num)
                 list = xrealloc(list, size * sizeof *list);
             }
             if (list && (opt_long || opt_longlong || opt_echo)) {
-                list[matches].num = PIDS_GETINT(TGID);
+                list[matches].num = PIDS_GETINT(PID);
                 list[matches++].str = xstrdup (cmdoutput);
             } else if (list) {
-                list[matches++].num = PIDS_GETINT(TGID);
+                list[matches++].num = PIDS_GETINT(PID);
             } else {
                 xerrx(EXIT_FATAL, _("internal error"));
             }
         }
     }
+    procps_pids_read_shut(info);
 
     *num = matches;
     return list;
+#undef PIDS_GETINT
+#undef PIDS_GETULL
+#undef PIDS_GETSTR
 }
 
 static int signal_option(int *argc, char **argv)
@@ -614,9 +620,6 @@ static int signal_option(int *argc, char **argv)
         }
     }
     return -1;
-#undef PIDS_GETINT
-#undef PIDS_GETULL
-#undef PIDS_GETSTR
 }
 
 static void parse_opts (int argc, char **argv)