From b6ff5c8a2e5981a0e71423953b565a1389c5428d Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:02:12 +0200 Subject: [PATCH 1/7] Move CWD field handling to platform-neutral code --- Process.c | 17 +++++++++++++++++ Process.h | 8 +++++++- linux/LinuxProcess.c | 19 +------------------ linux/LinuxProcess.h | 2 -- linux/LinuxProcessList.c | 10 +++++----- linux/ProcessField.h | 3 ++- 6 files changed, 32 insertions(+), 27 deletions(-) diff --git a/Process.c b/Process.c index a70d391cd..e30c6808f 100644 --- a/Process.c +++ b/Process.c @@ -777,6 +777,20 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field Process_printLeftAlignedField(str, attr, procExe, TASK_COMM_LEN - 1); return; } + case CWD: { + const char* cwd; + if (!this->procCwd) { + attr = CRT_colors[PROCESS_SHADOW]; + cwd = "N/A"; + } else if (String_startsWith(this->procCwd, "/proc/") && strstr(this->procCwd, " (deleted)") != NULL) { + attr = CRT_colors[PROCESS_SHADOW]; + cwd = "main thread terminated"; + } else { + cwd = this->procCwd; + } + Process_printLeftAlignedField(str, attr, cwd, 25); + return; + } case ELAPSED: Process_printTime(str, /* convert to hundreds of a second */ this->processList->realtimeMs / 10 - 100 * this->starttime_ctime, coloring); return; case MAJFLT: Process_printCount(str, this->majflt, coloring); return; case MINFLT: Process_printCount(str, this->minflt, coloring); return; @@ -915,6 +929,7 @@ void Process_done(Process* this) { free(this->cmdline); free(this->procComm); free(this->procExe); + free(this->procCwd); free(this->mergedCommand.str); free(this->tty_name); } @@ -1074,6 +1089,8 @@ int Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField const char *exe2 = p2->procExe ? (p2->procExe + p2->procExeBasenameOffset) : (Process_isKernelThread(p2) ? kthreadID : ""); return SPACESHIP_NULLSTR(exe1, exe2); } + case CWD: + return SPACESHIP_NULLSTR(p1->procCwd, p2->procCwd); case ELAPSED: r = -SPACESHIP_NUMBER(p1->starttime_ctime, p2->starttime_ctime); return r != 0 ? r : SPACESHIP_NUMBER(p1->pid, p2->pid); diff --git a/Process.h b/Process.h index b2d3482eb..2ff1aa098 100644 --- a/Process.h +++ b/Process.h @@ -17,7 +17,9 @@ in the source distribution for its full text. #include "RichString.h" -#define PROCESS_FLAG_IO 0x0001 +#define PROCESS_FLAG_IO 0x00000001 +#define PROCESS_FLAG_CWD 0x00000002 + #define DEFAULT_HIGHLIGHT_SECS 5 typedef enum ProcessField_ { @@ -49,6 +51,7 @@ typedef enum ProcessField_ { ELAPSED = 54, PROC_COMM = 124, PROC_EXE = 125, + CWD = 126, /* Platform specific fields, defined in ${platform}/ProcessField.h */ PLATFORM_PROCESS_FIELDS @@ -151,6 +154,9 @@ typedef struct Process_ { /* The main process executable */ char *procExe; + /* The process/thread working directory */ + char *procCwd; + /* Offset in procExe of the process basename */ int procExeBasenameOffset; diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index d90c8d1e2..bd7a7300e 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -99,7 +99,7 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = { [SECATTR] = { .name = "SECATTR", .title = " Security Attribute ", .description = "Security attribute of the process (e.g. SELinux or AppArmor)", .flags = PROCESS_FLAG_LINUX_SECATTR, }, [PROC_COMM] = { .name = "COMM", .title = "COMM ", .description = "comm string of the process from /proc/[pid]/comm", .flags = 0, }, [PROC_EXE] = { .name = "EXE", .title = "EXE ", .description = "Basename of exe of the process from /proc/[pid]/exe", .flags = 0, }, - [CWD] = { .name ="CWD", .title = "CWD ", .description = "The current working directory of the process", .flags = PROCESS_FLAG_LINUX_CWD, }, + [CWD] = { .name = "CWD", .title = "CWD ", .description = "The current working directory of the process", .flags = PROCESS_FLAG_CWD, }, }; Process* LinuxProcess_new(const Settings* settings) { @@ -116,7 +116,6 @@ void Process_delete(Object* cast) { #ifdef HAVE_OPENVZ free(this->ctid); #endif - free(this->cwd); free(this->secattr); free(this); } @@ -259,20 +258,6 @@ static void LinuxProcess_writeField(const Process* this, RichString* str, Proces xSnprintf(buffer, n, "%5lu ", lp->ctxt_diff); break; case SECATTR: snprintf(buffer, n, "%-30s ", lp->secattr ? lp->secattr : "?"); break; - case CWD: { - const char* cwd; - if (!lp->cwd) { - attr = CRT_colors[PROCESS_SHADOW]; - cwd = "N/A"; - } else if (String_startsWith(lp->cwd, "/proc/") && strstr(lp->cwd, " (deleted)") != NULL) { - attr = CRT_colors[PROCESS_SHADOW]; - cwd = "main thread terminated"; - } else { - cwd = lp->cwd; - } - Process_printLeftAlignedField(str, attr, cwd, 25); - return; - } default: Process_writeField(this, str, field); return; @@ -364,8 +349,6 @@ static int LinuxProcess_compareByKey(const Process* v1, const Process* v2, Proce return SPACESHIP_NUMBER(p1->ctxt_diff, p2->ctxt_diff); case SECATTR: return SPACESHIP_NULLSTR(p1->secattr, p2->secattr); - case CWD: - return SPACESHIP_NULLSTR(p1->cwd, p2->cwd); default: return Process_compareByKey_Base(v1, v2, key); } diff --git a/linux/LinuxProcess.h b/linux/LinuxProcess.h index fe9d88e28..5f77db2eb 100644 --- a/linux/LinuxProcess.h +++ b/linux/LinuxProcess.h @@ -27,7 +27,6 @@ in the source distribution for its full text. #define PROCESS_FLAG_LINUX_CTXT 0x00004000 #define PROCESS_FLAG_LINUX_SECATTR 0x00008000 #define PROCESS_FLAG_LINUX_LRS_FIX 0x00010000 -#define PROCESS_FLAG_LINUX_CWD 0x00020000 #define PROCESS_FLAG_LINUX_DELAYACCT 0x00040000 typedef struct LinuxProcess_ { @@ -100,7 +99,6 @@ typedef struct LinuxProcess_ { unsigned long ctxt_diff; char* secattr; unsigned long long int last_mlrs_calctime; - char* cwd; } LinuxProcess; extern int pageSize; diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index b89b76dde..79706c043 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -911,17 +911,17 @@ static void LinuxProcessList_readCwd(LinuxProcess* process, openat_arg_t procFd) #endif if (r < 0) { - free(process->cwd); - process->cwd = NULL; + free(process->super.procCwd); + process->super.procCwd = NULL; return; } pathBuffer[r] = '\0'; - if (process->cwd && String_eq(process->cwd, pathBuffer)) + if (process->super.procCwd && String_eq(process->super.procCwd, pathBuffer)) return; - free_and_xStrdup(&process->cwd, pathBuffer); + free_and_xStrdup(&process->super.procCwd, pathBuffer); } #ifdef HAVE_DELAYACCT @@ -1434,7 +1434,7 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, openat_arg_ LinuxProcessList_readSecattrData(lp, procFd); } - if (settings->flags & PROCESS_FLAG_LINUX_CWD) { + if (settings->flags & PROCESS_FLAG_CWD) { LinuxProcessList_readCwd(lp, procFd); } diff --git a/linux/ProcessField.h b/linux/ProcessField.h index a4e03009a..c8d24c0be 100644 --- a/linux/ProcessField.h +++ b/linux/ProcessField.h @@ -44,7 +44,8 @@ in the source distribution for its full text. M_PSSWP = 121, \ CTXT = 122, \ SECATTR = 123, \ - CWD = 126, \ + \ + DUMMY_BUMP_FIELD = CWD, \ // End of list From 06073699ba8728bb132763205d079ce44dd4f76d Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:03:54 +0200 Subject: [PATCH 2/7] Darwin: Implement CWD column --- darwin/DarwinProcess.c | 25 +++++++++++++++++++++++++ darwin/ProcessField.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/darwin/DarwinProcess.c b/darwin/DarwinProcess.c index 7aaee1104..96d10b0e6 100644 --- a/darwin/DarwinProcess.c +++ b/darwin/DarwinProcess.c @@ -45,6 +45,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, }, [TGID] = { .name = "TGID", .title = "TGID", .description = "Thread group ID (i.e. process ID)", .flags = 0, .pidColumn = true, }, + [PROC_EXE] = { .name = "EXE", .title = "EXE ", .description = "Basename of exe of the process from /proc/[pid]/exe", .flags = 0, }, + [CWD] = { .name = "CWD", .title = "CWD ", .description = "The current working directory of the process", .flags = PROCESS_FLAG_CWD, }, [TRANSLATED] = { .name = "TRANSLATED", .title = "T ", .description = "Translation info (T translated, N native)", .flags = 0, }, }; @@ -106,6 +108,25 @@ static void DarwinProcess_updateExe(pid_t pid, Process* proc) { Process_updateExe(proc, path); } +static void DarwinProcess_updateCwd(pid_t pid, Process* proc) { + struct proc_vnodepathinfo vpi; + + int r = proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, 0, &vpi, sizeof(vpi)); + if (r <= 0) { + free(proc->procCwd); + proc->procCwd = NULL; + return; + } + + if (!vpi.pvi_cdir.vip_path[0]) { + free(proc->procCwd); + proc->procCwd = NULL; + return; + } + + free_and_xStrdup(&proc->procCwd, vpi.pvi_cdir.vip_path); +} + static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* proc) { Process_updateComm(proc, k->kp_proc.p_comm); @@ -294,6 +315,10 @@ void DarwinProcess_setFromKInfoProc(Process* proc, const struct kinfo_proc* ps, DarwinProcess_updateExe(ep->p_pid, proc); DarwinProcess_updateCmdLine(ps, proc); + + if (proc->settings->flags & PROCESS_FLAG_CWD) { + DarwinProcess_updateCwd(ep->p_pid, proc); + } } /* Mutable information */ diff --git a/darwin/ProcessField.h b/darwin/ProcessField.h index 5a8090fe6..25dbb450e 100644 --- a/darwin/ProcessField.h +++ b/darwin/ProcessField.h @@ -10,6 +10,8 @@ in the source distribution for its full text. #define PLATFORM_PROCESS_FIELDS \ TRANSLATED = 100, \ + \ + DUMMY_BUMP_FIELD = CWD, \ // End of list From c2e25564036361b0e60ac1415dbb03528f945fe2 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:05:16 +0200 Subject: [PATCH 3/7] DragonFlyBSD: Implement CWD column --- dragonflybsd/DragonFlyBSDProcess.c | 1 + dragonflybsd/DragonFlyBSDProcessList.c | 24 ++++++++++++++++++++++++ dragonflybsd/ProcessField.h | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/dragonflybsd/DragonFlyBSDProcess.c b/dragonflybsd/DragonFlyBSDProcess.c index 591aeb775..13cef0af1 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 d1600d632..200491ec6 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 9b1cb60fe..03dfc14f4 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 From 90f42695d22fdb22736936a085eaae2f438da5fd Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:07:00 +0200 Subject: [PATCH 4/7] FreeBSD: Implement CWD column --- freebsd/FreeBSDProcess.c | 1 + freebsd/FreeBSDProcessList.c | 24 ++++++++++++++++++++++++ freebsd/ProcessField.h | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/freebsd/FreeBSDProcess.c b/freebsd/FreeBSDProcess.c index 3e282a3ec..9f0386b5e 100644 --- a/freebsd/FreeBSDProcess.c +++ b/freebsd/FreeBSDProcess.c @@ -46,6 +46,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/freebsd/FreeBSDProcessList.c b/freebsd/FreeBSDProcessList.c index 72aca65fb..999e85ef6 100644 --- a/freebsd/FreeBSDProcessList.c +++ b/freebsd/FreeBSDProcessList.c @@ -395,6 +395,26 @@ static void FreeBSDProcessList_updateExe(const struct kinfo_proc* kproc, Process Process_updateExe(proc, buffer); } +static void FreeBSDProcessList_updateCwd(const struct kinfo_proc* kproc, Process* proc) { + const int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_CWD, kproc->ki_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 FreeBSDProcessList_updateProcessName(kvm_t* kd, const struct kinfo_proc* kproc, Process* proc) { Process_updateComm(proc, kproc->ki_comm); @@ -495,6 +515,10 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) { FreeBSDProcessList_updateExe(kproc, proc); FreeBSDProcessList_updateProcessName(fpl->kd, kproc, proc); + if (settings->flags & PROCESS_FLAG_CWD) { + FreeBSDProcessList_updateCwd(kproc, proc); + } + fp->jname = FreeBSDProcessList_readJailName(kproc); proc->tty_nr = kproc->ki_tdev; diff --git a/freebsd/ProcessField.h b/freebsd/ProcessField.h index c5f05b820..6fba6bcfe 100644 --- a/freebsd/ProcessField.h +++ b/freebsd/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 From 5e92956abc23ffe1992a28eb02e8c157509542d1 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:08:14 +0200 Subject: [PATCH 5/7] OpenBSD: Implement CWD column --- openbsd/OpenBSDProcess.c | 6 ++++++ openbsd/OpenBSDProcessList.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/openbsd/OpenBSDProcess.c b/openbsd/OpenBSDProcess.c index 58e2d52b4..90994a703 100644 --- a/openbsd/OpenBSDProcess.c +++ b/openbsd/OpenBSDProcess.c @@ -193,6 +193,12 @@ const ProcessFieldData Process_fields[LAST_PROCESSFIELD] = { .description = "comm string of the process", .flags = 0, }, + [CWD] = { + .name = "CWD", + .title = "CWD ", + .description = "The current working directory of the process", + .flags = PROCESS_FLAG_CWD, + }, }; diff --git a/openbsd/OpenBSDProcessList.c b/openbsd/OpenBSDProcessList.c index 03c227930..4e885b3cf 100644 --- a/openbsd/OpenBSDProcessList.c +++ b/openbsd/OpenBSDProcessList.c @@ -171,6 +171,26 @@ static void OpenBSDProcessList_scanMemoryInfo(ProcessList* pl) { } } +static void OpenBSDProcessList_updateCwd(const struct kinfo_proc* kproc, Process* proc) { + const int mib[] = { CTL_KERN, KERN_PROC_CWD, kproc->ki_pid }; + char buffer[2048]; + size_t size = sizeof(buffer); + if (sysctl(mib, 3, 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 OpenBSDProcessList_updateProcessName(kvm_t* kd, const struct kinfo_proc* kproc, Process* proc) { Process_updateComm(proc, kproc->p_comm); @@ -272,6 +292,10 @@ static void OpenBSDProcessList_scanProcs(OpenBSDProcessList* this) { OpenBSDProcessList_updateProcessName(this->kd, kproc, proc); + if (settings->flags & PROCESS_FLAG_CWD) { + OpenBSDProcessList_updateCwd(kproc, proc); + } + proc->tty_nr = kproc->p_tdev; const char* name = ((dev_t)kproc->p_tdev != NODEV) ? devname(kproc->p_tdev, S_IFCHR) : NULL; if (!name || String_eq(name, "??")) { From 8420df62eb99654230f3f95fa23dccc11ea45dee Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:11:56 +0200 Subject: [PATCH 6/7] Solaris: Implement CWD column --- solaris/ProcessField.h | 2 +- solaris/SolarisProcess.c | 1 + solaris/SolarisProcessList.c | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/solaris/ProcessField.h b/solaris/ProcessField.h index 6af487720..727c641f8 100644 --- a/solaris/ProcessField.h +++ b/solaris/ProcessField.h @@ -17,7 +17,7 @@ in the source distribution for its full text. CONTID = 105, \ LWPID = 106, \ \ - DUMMY_BUMP_FIELD = PROC_EXE, \ + DUMMY_BUMP_FIELD = CWD, \ // End of list diff --git a/solaris/SolarisProcess.c b/solaris/SolarisProcess.c index 713bc137f..57071ab05 100644 --- a/solaris/SolarisProcess.c +++ b/solaris/SolarisProcess.c @@ -49,6 +49,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, }, [ZONEID] = { .name = "ZONEID", .title = "ZONEID", .description = "Zone ID", .flags = 0, .pidColumn = true, }, [ZONE] = { .name = "ZONE", .title = "ZONE ", .description = "Zone name", .flags = 0, }, [PROJID] = { .name = "PROJID", .title = "PRJID", .description = "Project ID", .flags = 0, .pidColumn = true, }, diff --git a/solaris/SolarisProcessList.c b/solaris/SolarisProcessList.c index 15f2f41fd..a496f9f59 100644 --- a/solaris/SolarisProcessList.c +++ b/solaris/SolarisProcessList.c @@ -309,6 +309,19 @@ static void SolarisProcessList_updateExe(pid_t pid, Process* proc) { Process_updateExe(proc, target); } +static void SolarisProcessList_updateCwd(pid_t pid, Process* proc) { + char path[32]; + xSnprintf(path, sizeof(path), "/proc/%d/cwd", pid); + + char target[PATH_MAX]; + ssize_t ret = readlink(path, target, sizeof(target) - 1); + if (ret <= 0) + return; + + target[ret] = '\0'; + free_and_xStrdup(&proc->procCwd, target); +} + /* NOTE: the following is a callback function of type proc_walk_f * and MUST conform to the appropriate definition in order * to work. See libproc(3LIB) on a Solaris or Illumos @@ -377,8 +390,13 @@ static int SolarisProcessList_walkproc(psinfo_t* _psinfo, lwpsinfo_t* _lwpsinfo, sproc->zname = SolarisProcessList_readZoneName(spl->kd, sproc); proc->user = UsersTable_getRef(pl->usersTable, proc->st_uid); SolarisProcessList_updateExe(_psinfo->pr_pid, proc); + Process_updateComm(proc, _psinfo->pr_fname); Process_updateCmdline(proc, _psinfo->pr_psargs, 0, 0); + + if (proc->settings->flags & PROCESS_FLAG_CWD) { + SolarisProcessList_updateCwd(_psinfo->pr_pid, proc); + } } // End common code pass 1 From c752c542fed7f6a66c4e2828e0e98f399d3c880e Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 25 May 2021 19:14:45 +0200 Subject: [PATCH 7/7] Unsupported: Implement CWD column --- unsupported/UnsupportedProcessList.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unsupported/UnsupportedProcessList.c b/unsupported/UnsupportedProcessList.c index 119c9c3eb..753f83b30 100644 --- a/unsupported/UnsupportedProcessList.c +++ b/unsupported/UnsupportedProcessList.c @@ -50,6 +50,10 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) { Process_updateCmdline(proc, "", 0, 0); Process_updateExe(proc, "/path/to/executable"); + if (proc->settings->flags & PROCESS_FLAG_CWD) { + proc->procCwd = "/current/working/directory"; + } + proc->updated = true; proc->state = 'R';