library: add support for the 'LIBPROC_HIDE_KERNEL' var

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>
This commit is contained in:
Jim Warner 2022-01-04 00:00:00 +01:00 committed by Craig Small
parent cbff1dd106
commit 2a7ec67ac8
2 changed files with 15 additions and 1 deletions

View 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 if (flags & PROC_FILLAUTOGRP) // value the 2 autogroup fields
autogroup_fill(path, p); 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; errno = ENOMEM;
next_proc: next_proc:
return NULL; return NULL;
@ -1514,10 +1517,13 @@ PROCTAB *openproc(unsigned flags, ...) {
va_list ap; va_list ap;
struct stat sbuf; struct stat sbuf;
static __thread int did_stat; static __thread int did_stat;
static __thread int hide_kernel = -1;
PROCTAB *PT = calloc(1, sizeof(PROCTAB)); PROCTAB *PT = calloc(1, sizeof(PROCTAB));
if (!PT) if (!PT)
return NULL; return NULL;
if (hide_kernel < 0)
hide_kernel = (NULL != getenv("LIBPROC_HIDE_KERNEL"));
if (!did_stat){ if (!did_stat){
task_dir_missing = stat("/proc/self/task", &sbuf); task_dir_missing = stat("/proc/self/task", &sbuf);
did_stat = 1; did_stat = 1;
@ -1547,6 +1553,13 @@ PROCTAB *openproc(unsigned flags, ...) {
} }
va_end(ap); 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 if (!src_buffer
&& !(src_buffer = malloc(MAX_BUFSZ))) { && !(src_buffer = malloc(MAX_BUFSZ))) {
closedir(PT->procfs); closedir(PT->procfs);

View File

@ -203,6 +203,7 @@ typedef struct PROCTAB {
uid_t *uids; // uids of procs uid_t *uids; // uids of procs
int nuid; // cannot really sentinel-terminate unsigned short[] int nuid; // cannot really sentinel-terminate unsigned short[]
int i; // generic int i; // generic
int hide_kernel; // getenv LIBPROC_HIDE_KERNEL was set
unsigned flags; unsigned flags;
unsigned u; // generic unsigned u; // generic
void * vp; // generic void * vp; // generic