diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2020-11-26 17:51:54 +0100 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2020-12-03 09:21:28 +0100 |
commit | fe848403149dd8e452281ec8eb16a8401112b0f6 (patch) | |
tree | a037e316d1da9f475969dc7f1df3668e8e65c480 /linux/LinuxProcessList.c | |
parent | c6b66a75ea140f5b3ed50b273be4c9b3c60ebfad (diff) |
Add Linux cwd process column
Diffstat (limited to 'linux/LinuxProcessList.c')
-rw-r--r-- | linux/LinuxProcessList.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 5d9ec87b..46850e1a 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -882,6 +882,31 @@ static void LinuxProcessList_readSecattrData(LinuxProcess* process, openat_arg_t process->secattr = xStrdup(buffer); } +static void LinuxProcessList_readCwd(LinuxProcess* process, openat_arg_t procFd) { + char pathBuffer[PATH_MAX + 1]; + +#if defined(HAVE_READLINKAT) && defined(HAVE_OPENAT) + ssize_t r = readlinkat(procFd, "cwd", pathBuffer, sizeof(pathBuffer) - 1); +#else + char filename[MAX_NAME + 1]; + xSnprintf(filename, sizeof(filename), "%s/cwd", procFd); + ssize_t r = readlink(filename, pathBuffer, sizeof(pathBuffer) - 1); +#endif + if (r < 0) { + free(process->cwd); + process->cwd = NULL; + return; + } + + pathBuffer[r] = '\0'; + + if (process->cwd && String_eq(process->cwd, pathBuffer)) + return; + + free(process->cwd); + process->cwd = xStrdup(pathBuffer); +} + #ifdef HAVE_DELAYACCT static int handleNetlinkMsg(struct nl_msg* nlmsg, void* linuxProcess) { @@ -1404,6 +1429,10 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, openat_arg_ LinuxProcessList_readSecattrData(lp, procFd); } + if (settings->flags & PROCESS_FLAG_LINUX_CWD) { + LinuxProcessList_readCwd(lp, procFd); + } + if (proc->state == 'Z' && (proc->basenameOffset == 0)) { proc->basenameOffset = -1; setCommand(proc, command, commLen); |