summaryrefslogtreecommitdiffstats
path: root/freebsd/FreeBSDProcessList.c
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2021-05-18 22:30:56 +0200
committerBenBE <BenBE@geshi.org>2021-05-23 09:22:21 +0200
commit4da618030c5551f60a115e759709797ad6afe000 (patch)
treeb9e4d152e7df7c342c549eb81402297a305cbfe5 /freebsd/FreeBSDProcessList.c
parent8ff4eb72acab360e1f5d790fa7277584ef0eae97 (diff)
FreeBSD: add EXE and COMM columns and use merged command line helpers
Diffstat (limited to 'freebsd/FreeBSDProcessList.c')
-rw-r--r--freebsd/FreeBSDProcessList.c55
1 files changed, 38 insertions, 17 deletions
diff --git a/freebsd/FreeBSDProcessList.c b/freebsd/FreeBSDProcessList.c
index ec58ceca..72aca65f 100644
--- a/freebsd/FreeBSDProcessList.c
+++ b/freebsd/FreeBSDProcessList.c
@@ -377,29 +377,52 @@ static inline void FreeBSDProcessList_scanMemoryInfo(ProcessList* pl) {
pl->usedSwap *= pageSizeKb;
}
-static char* FreeBSDProcessList_readProcessName(kvm_t* kd, const struct kinfo_proc* kproc, int* basenameEnd) {
+static void FreeBSDProcessList_updateExe(const struct kinfo_proc* kproc, Process* proc) {
+ const int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, kproc->ki_pid };
+ char buffer[2048];
+ size_t size = sizeof(buffer);
+ if (sysctl(mib, 4, buffer, &size, NULL, 0) != 0) {
+ Process_updateExe(proc, NULL);
+ return;
+ }
+
+ /* Kernel threads return an empty buffer */
+ if (buffer[0] == '\0') {
+ Process_updateExe(proc, NULL);
+ return;
+ }
+
+ Process_updateExe(proc, buffer);
+}
+
+static void FreeBSDProcessList_updateProcessName(kvm_t* kd, const struct kinfo_proc* kproc, Process* proc) {
+ Process_updateComm(proc, kproc->ki_comm);
+
char** argv = kvm_getargv(kd, kproc, 0);
- if (!argv) {
- return xStrdup(kproc->ki_comm);
+ if (!argv || !argv[0]) {
+ Process_updateCmdline(proc, kproc->ki_comm, 0, strlen(kproc->ki_comm));
+ return;
}
- int len = 0;
+
+ size_t len = 0;
for (int i = 0; argv[i]; i++) {
len += strlen(argv[i]) + 1;
}
- char* comm = xMalloc(len);
- char* at = comm;
- *basenameEnd = 0;
+
+ char* cmdline = xMalloc(len);
+ char* at = cmdline;
+ int end = 0;
for (int i = 0; argv[i]; i++) {
at = stpcpy(at, argv[i]);
- if (!*basenameEnd) {
- *basenameEnd = at - comm;
+ if (end == 0) {
+ end = at - cmdline;
}
- *at = ' ';
- at++;
+ *at++ = ' ';
}
at--;
*at = '\0';
- return comm;
+
+ Process_updateCmdline(proc, cmdline, 0, end);
}
static char* FreeBSDProcessList_readJailName(const struct kinfo_proc* kproc) {
@@ -469,8 +492,8 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
proc->user = UsersTable_getRef(super->usersTable, proc->st_uid);
ProcessList_add(super, proc);
- proc->cmdline = FreeBSDProcessList_readProcessName(fpl->kd, kproc, &proc->cmdlineBasenameEnd);
- proc->mergedCommand.cmdlineChanged = true;
+ FreeBSDProcessList_updateExe(kproc, proc);
+ FreeBSDProcessList_updateProcessName(fpl->kd, kproc, proc);
fp->jname = FreeBSDProcessList_readJailName(kproc);
@@ -497,9 +520,7 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
proc->user = UsersTable_getRef(super->usersTable, proc->st_uid);
}
if (settings->updateProcessNames) {
- free(proc->cmdline);
- proc->cmdline = FreeBSDProcessList_readProcessName(fpl->kd, kproc, &proc->cmdlineBasenameEnd);
- proc->mergedCommand.cmdlineChanged = true;
+ FreeBSDProcessList_updateProcessName(fpl->kd, kproc, proc);
}
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy