pgrep: make --terminal respect other criteria

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>
This commit is contained in:
Jason Cox 2023-01-25 20:34:21 +11:00 committed by Craig Small
parent 356730edbb
commit 848be2b1e2
3 changed files with 12 additions and 7 deletions

1
NEWS
View File

@ -2,6 +2,7 @@ procps-ng-NEXT
--------------- ---------------
* docs: Don't install English manpages twice * docs: Don't install English manpages twice
* pgrep: Add -H match on userspace signal handler merge #165 * 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: c flag shows command name again Debian #1026326
* ps.1: Match drs description from top.1 merge #156 * ps.1: Match drs description from top.1 merge #156
* skill: Match on -p again Debian #1025915 * skill: Match on -p again Debian #1025915

View File

@ -706,8 +706,8 @@ static struct el * select_procs (int *num)
match = 0; match = 0;
else if (opt_older && (int)PIDS_GETFLT(ELAPSED) < opt_older) else if (opt_older && (int)PIDS_GETFLT(ELAPSED) < opt_older)
match = 0; match = 0;
else if (opt_term) else if (opt_term && ! match_strlist(PIDS_GETSTR(TTYNAME), opt_term))
match = match_strlist(PIDS_GETSTR(TTYNAME), opt_term); match = 0;
else if (opt_runstates && ! strchr(opt_runstates, PIDS_GETSCH(STA))) else if (opt_runstates && ! strchr(opt_runstates, PIDS_GETSCH(STA)))
match = 0; match = 0;
else if (opt_cgroup && ! match_cgroup_list (PIDS_GETSTV(CGROUP), opt_cgroup)) else if (opt_cgroup && ! match_cgroup_list (PIDS_GETSTV(CGROUP), opt_cgroup))

View File

@ -79,12 +79,16 @@ set test "pgrep doesn't match with bogus sid"
spawn $pgrep -s $not_testproc1_sid $testproc_comm spawn $pgrep -s $not_testproc1_sid $testproc_comm
expect_blank "$test" 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 == "" } { if { $tty == "" } {
untested "$test" untested "$test1"
untested "$test2"
} else { } else {
spawn $pgrep -t $tty $testproc_comm 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" set test "pgrep doesn't match with bogus tty"