]> granicus.if.org Git - procps-ng/commitdiff
pgrep: Use only --signal option for signal
authorCraig Small <csmall@dropbear.xyz>
Wed, 1 Mar 2023 06:35:14 +0000 (17:35 +1100)
committerCraig Small <csmall@dropbear.xyz>
Wed, 1 Mar 2023 06:35:14 +0000 (17:35 +1100)
When pgrep was used to match on signal, it makes sense to use
the same signal parsing code as pkill. Unfortunately the
"find the signal" part is a little too enthusaistic about what a
signal is, meaning

pgrep -u -42

fails because the signal becomes "42" and then there is no UID.

This is a bit sad for pkill but has been that way for a long
time. For pgrep this is new so now only the long form
pgrep --signal <X>
will work.

In addition, when using --signal if pgrep/pkill couldn't work
out what the signal was it just silently ignored it. It now
complains and aborts.

References:
 https://bugs.debian.org/1031765
 commit 866abacf8805a74fb7c59cae1f64963e0a540b14

NEWS
man/pgrep.1
src/pgrep.c

diff --git a/NEWS b/NEWS
index bc293a3f48a89ad2685e9661b34fd28fc8b034f7..85bf845ea53e9ad91015e5527ba174acbc4b235f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,6 @@
 procps-ng-NEXT
 ---------------
+  * pgrep: Use only --signal option for signal             Debian #1031765
   * tests: dont compare floats with ==                     issue #271
 
 procps-ng-4.0.3
index a68633c57680da21b873efc78132ce6ce1143d74..41d9ac044e0d5376d0e455d045557f06385ff597 100644 (file)
@@ -60,7 +60,7 @@ the symbolic signal name can be used. In
 .B pgrep
 or
 .B pidwait
-mode this has no effect unless used in conjunction with
+mode only the long option can be used and has no effect unless used in conjunction with
 \fB\-\-require\-handler\fR to filter to processes with a userspace signal
 handler present for a particular signal.
 
index 94607a3fd88e4642edf956f0f92f3045dbc34b01..442dbfcc60a5a9dda96055823d5d694f3876a7ad 100644 (file)
@@ -163,6 +163,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
         fputs(_(" -w, --lightweight         list all TID\n"), fp);
         break;
     case PKILL:
+        fputs(_(" -<sig>                    signal to send (either number or name)\n"), fp);
         fputs(_(" -H, --require-handler     match only if signal handler is present\n"), fp);
         fputs(_(" -q, --queue <value>       integer value to be sent with the signal\n"), fp);
         fputs(_(" -e, --echo                display what is killed\n"), fp);
@@ -173,7 +174,6 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
         break;
 #endif
     }
-    fputs(_(" -<sig>, --signal <sig>    signal to send (either number or name)\n"), fp);
     fputs(_(" -c, --count               count of matching processes\n"), fp);
     fputs(_(" -f, --full                use full process name to match\n"), fp);
     fputs(_(" -g, --pgroup <PGID,...>   match listed process group IDs\n"), fp);
@@ -184,6 +184,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
     fputs(_(" -O, --older <seconds>     select where older than seconds\n"), fp);
     fputs(_(" -P, --parent <PPID,...>   match only child processes of the given parent\n"), fp);
     fputs(_(" -s, --session <SID,...>   match session IDs\n"), fp);
+    fputs(_("     --signal <sig>        signal to send (either number or name)\n"), fp);
     fputs(_(" -t, --terminal <tty,...>  match by controlling terminal\n"), fp);
     fputs(_(" -u, --euid <ID,...>       match by effective IDs\n"), fp);
     fputs(_(" -U, --uid <ID,...>        match by real IDs\n"), fp);
@@ -823,7 +824,6 @@ static int pidfd_open (pid_t pid, unsigned int flags)
 static void parse_opts (int argc, char **argv)
 {
     char opts[64] = "";
-    int sig;
     int opt;
     int criteria_count = 0;
 
@@ -869,9 +869,6 @@ static void parse_opts (int argc, char **argv)
         {NULL, 0, NULL, 0}
     };
 
-    sig = signal_option(&argc, argv);
-    if (-1 < sig)
-        opt_signal = sig;
 
 #ifdef ENABLE_PIDWAIT
     if (strcmp (program_invocation_short_name, "pidwait") == 0 ||
@@ -882,7 +879,11 @@ static void parse_opts (int argc, char **argv)
 #endif
     if (strcmp (program_invocation_short_name, "pkill") == 0 ||
         strcmp (program_invocation_short_name, "lt-pkill") == 0) {
+        int sig;
         prog_mode = PKILL;
+        sig = signal_option(&argc, argv);
+        if (-1 < sig)
+            opt_signal = sig;
        strcat (opts, "eq:");
     } else {
         strcat (opts, "lad:vw");
@@ -895,8 +896,14 @@ static void parse_opts (int argc, char **argv)
         switch (opt) {
         case SIGNAL_OPTION:
             opt_signal = signal_name_to_number (optarg);
-            if (opt_signal == -1 && isdigit (optarg[0]))
-                opt_signal = atoi (optarg);
+            if (opt_signal == -1) {
+                if (isdigit (optarg[0]))
+                    opt_signal = atoi (optarg);
+                else {
+                    fprintf(stderr, _("Unknown signal \"%s\"."), optarg);
+                    usage('?');
+                }
+            }
             break;
         case 'e':
             opt_echo = 1;