From 42ad5edf5ab162ddc0b9f0e3ad5eeb192dd95cf4 Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Tue, 11 Jan 2022 09:44:13 +0100 Subject: [PATCH 1/3] BUILD(client): Plugin framework: Use KVM_PROC_ALL on NetBSD/OpenBSD kvm_getprocs(3) on Linux and FreeBSD (https://www.freebsd.org/cgi/man.cgi?kvm_getprocs) has ``` KERN_PROC_PROC all processes, without threads ... ``` OpenBSD (https://man.openbsd.org/kvm_getprocs.3) and NetBSD (https://man.openbsd.org/kvm_getprocs.3) however only know ``` KERN_PROC_KTHREAD all processes (user-level plus kernel threads) KERN_PROC_ALL all user-level processes ... ``` and ``` KERN_PROC_ALL all processes KERN_PROC_PID processes with process id arg ... ``` respectively, thus fall back to KERN_PROC_ALL where needed. Build-tested on OpenBSD 7.0-CURRENT. NB: The first hunk around kvm_openfiles(3) is from `clang-format`. (should've have happened in the commit introducing this line, I guess.) --- src/ProcessResolver.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ProcessResolver.cpp b/src/ProcessResolver.cpp index ebd26815d..cacf1ba3e 100644 --- a/src/ProcessResolver.cpp +++ b/src/ProcessResolver.cpp @@ -239,7 +239,7 @@ void ProcessResolver::doResolve() { # ifdef KVM_NO_FILES kvm_t *kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, error); # else - kvm_t *kd = kvm_openfiles(NULL, _PATH_DEVNULL, NULL, O_RDONLY, error); + kvm_t *kd = kvm_openfiles(NULL, _PATH_DEVNULL, NULL, O_RDONLY, error); # endif if (!kd) { @@ -250,7 +250,11 @@ void ProcessResolver::doResolve() { } int n_procs; +# if defined(__NetBSD__) || defined(__OpenBSD__) + struct kinfo_proc *procs_info = kvm_getprocs(kd, KERN_PROC_ALL, 0, &n_procs); +# else struct kinfo_proc *procs_info = kvm_getprocs(kd, KERN_PROC_PROC, 0, &n_procs); +# endif if (!procs_info) { # ifndef QT_NO_DEBUG qCritical("ProcessResolver: kvm_getprocs() failed\n"); From ccbacbf0ab68441fe9ab9728d785b9417affb845 Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Tue, 11 Jan 2022 10:27:05 +0100 Subject: [PATCH 2/3] BUILD(client): Plugin framework: Pass element size to kvm_getprocs(3) on OpenBSD There is an additional `elemsize` argument (https://man.openbsd.org/kvm_getprocs.3): Only the first elemsize bytes of each array entry are returned. Complete OpenBSD signature: ``` struct kinfo_proc * kvm_getprocs(kvm_t *kd, int op, int arg, size_t elemsize, int *cnt); ``` Linux, FreeBSD and NetBSD have the same four-argument signature: ``` struct kinfo_proc * kvm_getprocs(kvm_t *kd, int op, int arg, int *cnt); ``` Build-tested on OpenBSD 7.0-CURRENT. --- src/ProcessResolver.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ProcessResolver.cpp b/src/ProcessResolver.cpp index cacf1ba3e..631cba2fa 100644 --- a/src/ProcessResolver.cpp +++ b/src/ProcessResolver.cpp @@ -250,8 +250,10 @@ void ProcessResolver::doResolve() { } int n_procs; -# if defined(__NetBSD__) || defined(__OpenBSD__) +# if defined(__NetBSD__) struct kinfo_proc *procs_info = kvm_getprocs(kd, KERN_PROC_ALL, 0, &n_procs); +# elif defined(__OpenBSD__) + struct kinfo_proc *procs_info = kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof(*procs_info), &n_procs); # else struct kinfo_proc *procs_info = kvm_getprocs(kd, KERN_PROC_PROC, 0, &n_procs); # endif From a707213aa1f6c635af1fb69bd7f5c06eca29a25d Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Tue, 11 Jan 2022 10:58:59 +0100 Subject: [PATCH 3/3] BUILD(client): Plugin framework: Use correct struct kinfo_proc members on NetBSD/OpenBSD `struct kinfo_proc` members are prefixed with `p_` in OpenBSD (http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/sys/sysctl.h?annotate=1.220) and NetBSD (cvsweb.netbsd.org/bsdweb.cgi/src/sys/sys/sysctl.h?annotate=1.236) FreeBSD (https://cgit.freebsd.org/src/tree/sys/sys/user.h?id=01cad731921bb60b4f6e04c1cac987eea7af9d08#n121)and presumably Linux (I did not check) use the `ki_` prefix. Build-tested on OpenBSD 7.0-CURRENT. --- src/ProcessResolver.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ProcessResolver.cpp b/src/ProcessResolver.cpp index 631cba2fa..935598034 100644 --- a/src/ProcessResolver.cpp +++ b/src/ProcessResolver.cpp @@ -267,7 +267,11 @@ void ProcessResolver::doResolve() { } for (int i = 0; i < n_procs; ++i) { +# if defined(__NetBSD__) || defined(__OpenBSD__) + addEntry(procs_info[i].p_pid, procs_info[i].p_comm, m_processMap); +# else addEntry(procs_info[i].ki_pid, procs_info[i].ki_comm, m_processMap); +# endif } kvm_cleanup(kd);