From 5e92956abc23ffe1992a28eb02e8c157509542d1 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:08:14 +0200 Subject: [PATCH] OpenBSD: Implement CWD column --- openbsd/OpenBSDProcess.c | 6 ++++++ openbsd/OpenBSDProcessList.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/openbsd/OpenBSDProcess.c b/openbsd/OpenBSDProcess.c index 58e2d52b..90994a70 100644 --- a/openbsd/OpenBSDProcess.c +++ b/openbsd/OpenBSDProcess.c @@ -193,6 +193,12 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = { .description = "comm string of the process", .flags = 0, }, + [CWD] = { + .name = "CWD", + .title = "CWD ", + .description = "The current working directory of the process", + .flags = PROCESS_FLAG_CWD, + }, }; diff --git a/openbsd/OpenBSDProcessList.c b/openbsd/OpenBSDProcessList.c index 03c22793..4e885b3c 100644 --- a/openbsd/OpenBSDProcessList.c +++ b/openbsd/OpenBSDProcessList.c @@ -171,6 +171,26 @@ static void OpenBSDProcessList_scanMemoryInfo(ProcessList* pl) { } } +static void OpenBSDProcessList_updateCwd(const struct kinfo_proc* kproc, Process* proc) { + const int mib[] = { CTL_KERN, KERN_PROC_CWD, kproc->ki_pid }; + char buffer[2048]; + size_t size = sizeof(buffer); + if (sysctl(mib, 3, buffer, &size, NULL, 0) != 0) { + free(proc->procCwd); + proc->procCwd = NULL; + return; + } + + /* Kernel threads return an empty buffer */ + if (buffer[0] == '\0') { + free(proc->procCwd); + proc->procCwd = NULL; + return; + } + + free_and_xStrdup(&proc->procCwd, buffer); +} + static void OpenBSDProcessList_updateProcessName(kvm_t* kd, const struct kinfo_proc* kproc, Process* proc) { Process_updateComm(proc, kproc->p_comm); @@ -272,6 +292,10 @@ static void OpenBSDProcessList_scanProcs(OpenBSDProcessList* this) { OpenBSDProcessList_updateProcessName(this->kd, kproc, proc); + if (settings->flags & PROCESS_FLAG_CWD) { + OpenBSDProcessList_updateCwd(kproc, proc); + } + proc->tty_nr = kproc->p_tdev; const char* name = ((dev_t)kproc->p_tdev != NODEV) ? devname(kproc->p_tdev, S_IFCHR) : NULL; if (!name || String_eq(name, "??")) {