diff options
author | fraggerfox <santhosh.raju@gmail.com> | 2021-05-23 15:00:48 +0530 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2021-06-26 12:18:37 +0200 |
commit | 9de463e756963e4e0e6188602199904580bbdb16 (patch) | |
tree | 04a2c635bfc975c3bb3d07655cfc7f1e4eef64b6 /netbsd/NetBSDProcessList.c | |
parent | fa65c30976386460d1361950ecce63e81dfb1bea (diff) |
Implements the NetBSD specific changes for makeCommandStr refactor.
Refer to #388 PR for more details.
Diffstat (limited to 'netbsd/NetBSDProcessList.c')
-rw-r--r-- | netbsd/NetBSDProcessList.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/netbsd/NetBSDProcessList.c b/netbsd/NetBSDProcessList.c index 91be9549..6058fe80 100644 --- a/netbsd/NetBSDProcessList.c +++ b/netbsd/NetBSDProcessList.c @@ -114,15 +114,17 @@ static void NetBSDProcessList_scanMemoryInfo(ProcessList* pl) { pl->usedSwap = uvmexp.swpginuse * pageSizeKB; } -static char* NetBSDProcessList_readProcessName(kvm_t* kd, const struct kinfo_proc2* kproc, int* basenameEnd) { +static void NetBSDProcessList_updateProcessName(kvm_t* kd, const struct kinfo_proc2* kproc, Process* proc) { + Process_updateComm(proc, kproc->p_comm); + /* * Like NetBSD's top(1), we try to fall back to the command name * (argv[0]) if we fail to construct the full command. */ char** arg = kvm_getargv2(kd, kproc, 500); if (arg == NULL || *arg == NULL) { - *basenameEnd = strlen(kproc->p_comm); - return xStrdup(kproc->p_comm); + Process_updateCmdline(proc, kproc->p_comm, 0, strlen(kproc->p_comm)); + return; } size_t len = 0; @@ -133,22 +135,30 @@ static char* NetBSDProcessList_readProcessName(kvm_t* kd, const struct kinfo_pro /* don't use xMalloc here - we want to handle huge argv's gracefully */ char* s; if ((s = malloc(len)) == NULL) { - *basenameEnd = strlen(kproc->p_comm); - return xStrdup(kproc->p_comm); + Process_updateCmdline(proc, kproc->p_comm, 0, strlen(kproc->p_comm)); + return; } *s = '\0'; + int start = 0; + int end = 0; for (int i = 0; arg[i] != NULL; i++) { size_t n = strlcat(s, arg[i], len); if (i == 0) { - *basenameEnd = MINIMUM(n, len - 1); + end = MINIMUM(n, len - 1); + /* check if cmdline ended earlier, e.g 'kdeinit5: Running...' */ + for (int j = end; j > 0; j--) { + if (arg[0][j] == ' ' && arg[0][j-1] != '\\') { + end = (arg[0][j-1] == ':') ? (j-1) : j; + } + } } /* the trailing space should get truncated anyway */ strlcat(s, " ", len); } - return s; + Process_updateCmdline(proc, s, start, end); } /* @@ -185,16 +195,18 @@ static void NetBSDProcessList_scanProcs(NetBSDProcessList* this) { proc->session = kproc->p_sid; proc->tty_nr = kproc->p_tdev; proc->pgrp = kproc->p__pgid; + proc->isKernelThread = proc->pgrp == 0; + proc->isUserlandThread = proc->pid != proc->tgid; proc->st_uid = kproc->p_uid; proc->starttime_ctime = kproc->p_ustart_sec; Process_fillStarttimeBuffer(proc); proc->user = UsersTable_getRef(this->super.usersTable, proc->st_uid); ProcessList_add(&this->super, proc); - proc->comm = NetBSDProcessList_readProcessName(this->kd, kproc, &proc->basenameOffset); + + NetBSDProcessList_updateProcessName(this->kd, kproc, proc); } else { if (settings->updateProcessNames) { - free(proc->comm); - proc->comm = NetBSDProcessList_readProcessName(this->kd, kproc, &proc->basenameOffset); + NetBSDProcessList_updateProcessName(this->kd, kproc, proc); } } |