]> granicus.if.org Git - procps-ng/commitdiff
library: add support for the 'LIBPROC_HIDE_KERNEL' var
authorJim Warner <james.warner@comcast.net>
Mon, 3 Jan 2022 23:00:00 +0000 (00:00 +0100)
committerCraig Small <csmall@dropbear.xyz>
Fri, 7 Jan 2022 08:19:15 +0000 (19:19 +1100)
This patch was prompted by Björn Fischer's merge #147
request referenced below. It has been generalized such
that it now embraces both of those 'pids_fetch' types.

[ and thanks to Björn for initiating this extension ]

Reference(s):
https://gitlab.com/procps-ng/procps/-/merge_requests/147

Prototyped-by: Björn Fischer <bf@CeBiTec.Uni-Bielefeld.DE>
Signed-off-by: Jim Warner <james.warner@comcast.net>
proc/readproc.c
proc/readproc.h

index eb3504d8c6cc05bd1c9fdaf725d06094548e1967..442036409d7312f41d205ca19e1c324495781dc7 100644 (file)
@@ -1225,7 +1225,10 @@ static proc_t *simple_readproc(PROCTAB *restrict const PT, proc_t *restrict cons
     if (flags & PROC_FILLAUTOGRP)               // value the 2 autogroup fields
         autogroup_fill(path, p);
 
-    if (rc == 0) return p;
+    // openproc() ensured that a ppid will be present when needed ...
+    if (rc == 0)
+        return (PT->hide_kernel && (p->ppid == 2 || p->tid == 2)) ? NULL : p;
+
     errno = ENOMEM;
 next_proc:
     return NULL;
@@ -1514,10 +1517,13 @@ PROCTAB *openproc(unsigned flags, ...) {
     va_list ap;
     struct stat sbuf;
     static __thread int did_stat;
+    static __thread int hide_kernel = -1;
     PROCTAB *PT = calloc(1, sizeof(PROCTAB));
 
     if (!PT)
         return NULL;
+    if (hide_kernel < 0)
+        hide_kernel = (NULL != getenv("LIBPROC_HIDE_KERNEL"));
     if (!did_stat){
         task_dir_missing = stat("/proc/self/task", &sbuf);
         did_stat = 1;
@@ -1547,6 +1553,13 @@ PROCTAB *openproc(unsigned flags, ...) {
     }
     va_end(ap);
 
+    if (hide_kernel > 0) {
+        PT->hide_kernel = 1;
+        // we'll need the ppid, ensure it's obtained via cheapest means ...
+        if (!(PT->flags & (PROC_FILLSTAT | PROC_FILLSTATUS)))
+            PT->flags |= PROC_FILLSTAT;
+    }
+
     if (!src_buffer
     && !(src_buffer = malloc(MAX_BUFSZ))) {
         closedir(PT->procfs);
index 55453c910c81e6c16dc8ca44ddc10870028d33bc..87bb53c79cb252b72ea8be1459fef6d81a67cadd 100644 (file)
@@ -203,6 +203,7 @@ typedef struct PROCTAB {
     uid_t      *uids;   // uids of procs
     int         nuid;   // cannot really sentinel-terminate unsigned short[]
     int         i;  // generic
+    int         hide_kernel;  // getenv LIBPROC_HIDE_KERNEL was set
     unsigned    flags;
     unsigned    u;  // generic
     void *      vp; // generic