]> granicus.if.org Git - procps-ng/commitdiff
pgrep: Better warning if pidfd_open not implemented
authorCraig Small <csmall@dropbear.xyz>
Mon, 18 Jul 2022 10:51:41 +0000 (20:51 +1000)
committerCraig Small <csmall@dropbear.xyz>
Mon, 18 Jul 2022 10:51:41 +0000 (20:51 +1000)
If procps is built on a Linux 5.3+ system then pidwait
is built with pidfd_open(). If that program is run on
a system < 5.3 then it gives an odd generic error.

If we get a ENOSYS from one pid, we will get it for all
the others so its better to explain what happens and terminate.

The man page is updated to note this issue.

This came up due to killall in psmisc using pidfd_send_signal

References:
 https://bugs.debian.org/1015228

Signed-off-by: Craig Small <csmall@dropbear.xyz>
NEWS
pgrep.1
pgrep.c

diff --git a/NEWS b/NEWS
index e3e7148ce7914c7d34dc0f72c8f5b857de07b10a..d395bc087bf01bf288fa10224e1c06f939cede91 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ procps-ng-NEXT
   * library
     Re-add elogind support                                 merge #151
     Used memory is Total - Available
+  * pidwait: Better warning if pidfd_open not implemented
   * pmap: Dont reuse stdin filehandle                      issue #231
   * ps: threads again display when -L is used with -q      issue #234
   * ps: proper aix format string behavior was restored
diff --git a/pgrep.1 b/pgrep.1
index e29e6e1a741ca373d398e2589692b52109d11f6d..5e1db7f2a5a5a57e72ed05783e88a5f9bb84e4d2 100644 (file)
--- a/pgrep.1
+++ b/pgrep.1
@@ -7,7 +7,7 @@
 .\" the Free Software Foundation; either version 2 of the License, or
 .\" (at your option) any later version.
 .\"
-.TH PGREP "1" "2021-12-25" "procps-ng" "User Commands"
+.TH PGREP "1" "2022-07-18" "procps-ng" "User Commands"
 .SH NAME
 pgrep, pkill, pidwait \- look up, signal, or wait for processes based on name and other attributes
 .SH SYNOPSIS
@@ -281,7 +281,11 @@ can not be combined.  Let
 me know if you need to do this.
 .PP
 Defunct processes are reported.
-
+.PP
+.B pidwait
+requires the
+.BR pidfd_open (2)
+system call which first appeared in Linux 5.3.
 .SH "SEE ALSO"
 .BR ps (1),
 .BR regex (7),
diff --git a/pgrep.c b/pgrep.c
index 328873b12153618514ccfcc64bb07669c4818e16..3a01c78941777c565758451fac64ca710f671672 100644 (file)
--- a/pgrep.c
+++ b/pgrep.c
@@ -1064,6 +1064,8 @@ int main (int argc, char **argv)
                 printf(_("waiting for %s (pid %lu)\n"), procs[i].str, procs[i].num);
             int pidfd = pidfd_open(procs[i].num, 0);
             if (pidfd == -1) {
+               if (errno == ENOSYS)
+                   xerrx(EXIT_FAILURE, _("pidfd_open() not implemented in Linux < 5.3"));
                 /* ignore ESRCH, same as pkill */
                 if (errno != ESRCH)
                     xwarn(_("opening pid %ld failed"), procs[i].num);