From c2e25564036361b0e60ac1415dbb03528f945fe2 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:05:16 +0200 Subject: DragonFlyBSD: Implement CWD column --- dragonflybsd/DragonFlyBSDProcess.c | 1 + dragonflybsd/DragonFlyBSDProcessList.c | 24 ++++++++++++++++++++++++ dragonflybsd/ProcessField.h | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'dragonflybsd') diff --git a/dragonflybsd/DragonFlyBSDProcess.c b/dragonflybsd/DragonFlyBSDProcess.c index 591aeb77..13cef0af 100644 --- a/dragonflybsd/DragonFlyBSDProcess.c +++ b/dragonflybsd/DragonFlyBSDProcess.c @@ -47,6 +47,7 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = { [TGID] = { .name = "TGID", .title = "TGID", .description = "Thread group ID (i.e. process ID)", .flags = 0, .pidColumn = true, }, [PROC_COMM] = { .name = "COMM", .title = "COMM ", .description = "comm string of the process", .flags = 0, }, [PROC_EXE] = { .name = "EXE", .title = "EXE ", .description = "Basename of exe of the process", .flags = 0, }, + [CWD] = { .name = "CWD", .title = "CWD ", .description = "The current working directory of the process", .flags = PROCESS_FLAG_CWD, }, [JID] = { .name = "JID", .title = "JID", .description = "Jail prison ID", .flags = 0, .pidColumn = true, }, [JAIL] = { .name = "JAIL", .title = "JAIL ", .description = "Jail prison name", .flags = 0, }, }; diff --git a/dragonflybsd/DragonFlyBSDProcessList.c b/dragonflybsd/DragonFlyBSDProcessList.c index d1600d63..200491ec 100644 --- a/dragonflybsd/DragonFlyBSDProcessList.c +++ b/dragonflybsd/DragonFlyBSDProcessList.c @@ -296,6 +296,26 @@ static void DragonFlyBSDProcessList_updateExe(const struct kinfo_proc* kproc, Pr Process_updateExe(proc, target); } +static void DragonFlyBSDProcessList_updateCwd(const struct kinfo_proc* kproc, Process* proc) { + const int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_CWD, kproc->kp_pid }; + char buffer[2048]; + size_t size = sizeof(buffer); + if (sysctl(mib, 4, 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 DragonFlyBSDProcessList_updateProcessName(kvm_t* kd, const struct kinfo_proc* kproc, Process* proc) { Process_updateComm(proc, kproc->kp_comm); @@ -459,6 +479,10 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) { DragonFlyBSDProcessList_updateExe(kproc, proc); DragonFlyBSDProcessList_updateProcessName(dfpl->kd, kproc, proc); + if (settings->flags & PROCESS_FLAG_CWD) { + DragonFlyBSDProcessList_updateCwd(kproc, proc); + } + ProcessList_add(super, proc); dfp->jname = DragonFlyBSDProcessList_readJailName(dfpl, kproc->kp_jailid); diff --git a/dragonflybsd/ProcessField.h b/dragonflybsd/ProcessField.h index 9b1cb60f..03dfc14f 100644 --- a/dragonflybsd/ProcessField.h +++ b/dragonflybsd/ProcessField.h @@ -12,7 +12,7 @@ in the source distribution for its full text. JID = 100, \ JAIL = 101, \ \ - DUMMY_BUMP_FIELD = PROC_EXE, \ + DUMMY_BUMP_FIELD = CWD, \ // End of list -- cgit v1.2.3