From 4da618030c5551f60a115e759709797ad6afe000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Tue, 18 May 2021 22:30:56 +0200 Subject: FreeBSD: add EXE and COMM columns and use merged command line helpers --- freebsd/FreeBSDProcess.c | 2 ++ freebsd/FreeBSDProcessList.c | 55 ++++++++++++++++++++++++++++++-------------- freebsd/ProcessField.h | 2 ++ 3 files changed, 42 insertions(+), 17 deletions(-) (limited to 'freebsd') diff --git a/freebsd/FreeBSDProcess.c b/freebsd/FreeBSDProcess.c index 2370b9f0..4fd02a9b 100644 --- a/freebsd/FreeBSDProcess.c +++ b/freebsd/FreeBSDProcess.c @@ -44,6 +44,8 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = { [TIME] = { .name = "TIME", .title = " TIME+ ", .description = "Total time the process has spent in user and system time", .flags = 0, .defaultSortDesc = true, }, [NLWP] = { .name = "NLWP", .title = "NLWP ", .description = "Number of threads in the process", .flags = 0, .defaultSortDesc = true, }, [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, }, [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/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); } } diff --git a/freebsd/ProcessField.h b/freebsd/ProcessField.h index cc892826..c5f05b82 100644 --- a/freebsd/ProcessField.h +++ b/freebsd/ProcessField.h @@ -11,6 +11,8 @@ in the source distribution for its full text. #define PLATFORM_PROCESS_FIELDS \ JID = 100, \ JAIL = 101, \ + \ + DUMMY_BUMP_FIELD = PROC_EXE, \ // End of list -- cgit v1.2.3