]> granicus.if.org Git - procps-ng/commitdiff
pgrep: make --terminal respect other criteria
authorJason Cox <me@jasoncarloscox.com>
Wed, 25 Jan 2023 09:34:21 +0000 (20:34 +1100)
committerCraig Small <csmall@dropbear.xyz>
Wed, 25 Jan 2023 09:34:21 +0000 (20:34 +1100)
In some cases the --terminal option to pgrep will cause all processes
matching the terminal to be output, even if other criteria would exclude them.
Specifically, I noticed that it overrides the --runstates option.

Signed-off-by: Craig Small <csmall@dropbear.xyz>
NEWS
src/pgrep.c
testsuite/pgrep.test/pgrep.exp

diff --git a/NEWS b/NEWS
index 40a39e9abc7e0261760dd942f4203d767c48e8f9..a0cb848f083562115ad88e940db370cc8a9d2494 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ procps-ng-NEXT
 ---------------
   * docs: Don't install English manpages twice
   * pgrep: Add -H match on userspace signal handler        merge #165
+  * pgrep: make --terminal respect other criteria
   * ps: c flag shows command name again                    Debian #1026326
   * ps.1: Match drs description from top.1                 merge #156
   * skill: Match on -p again                               Debian #1025915
index 7d0cc932460de3fc281c504e092f0bf5aa3521c1..6679a8c60efbb0367047943b46e66b248edcccd3 100644 (file)
@@ -706,8 +706,8 @@ static struct el * select_procs (int *num)
             match = 0;
        else if (opt_older && (int)PIDS_GETFLT(ELAPSED) < opt_older)
            match = 0;
-        else if (opt_term)
-            match = match_strlist(PIDS_GETSTR(TTYNAME), opt_term);
+        else if (opt_term && ! match_strlist(PIDS_GETSTR(TTYNAME), opt_term))
+            match = 0;
         else if (opt_runstates && ! strchr(opt_runstates, PIDS_GETSCH(STA)))
             match = 0;
         else if (opt_cgroup && ! match_cgroup_list (PIDS_GETSTV(CGROUP), opt_cgroup))
index 1110e70f07e7a65eed4ff857ffa928d67739d419..0c4836f6c5d357fba3068c1d50f3871f445ebf45 100644 (file)
@@ -5,9 +5,9 @@ set mypid [pid]
 set not_ppid [ expr { $mypid + 1 } ]
 set pgrep "${topdir}src/pgrep"
 set uid [ exec id -u ]
-set not_uid [ expr { $uid + 1 } ] 
+set not_uid [ expr { $uid + 1 } ]
 set gid [ exec id -g ]
-set not_gid [ expr { $gid + 1 } ] 
+set not_gid [ expr { $gid + 1 } ]
 set ps "${topdir}src/ps/pscommand"
 set tty [ get_tty ]
 
@@ -79,12 +79,16 @@ set test "pgrep doesn't match with bogus sid"
 spawn $pgrep -s $not_testproc1_sid $testproc_comm
 expect_blank "$test"
 
-set test "pgrep matches on tty"
+set test1 "pgrep matches on tty"
+set test2 "pgrep doesn't match on tty and wrong runstate"
 if { $tty == "" } {
-  untested "$test"
+  untested "$test1"
+  untested "$test2"
 } else {
     spawn $pgrep -t $tty $testproc_comm
-    expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
+    expect_pass "$test1" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
+    spawn $pgrep -t $tty -r D $testproc_comm
+    expect_blank "$test2"
 }
 
 set test "pgrep doesn't match with bogus tty"