diff --git a/linux/LinuxProcess.c b/linux/LinuxProcess.c index a65688c5..3eaa6cbe 100644 --- a/linux/LinuxProcess.c +++ b/linux/LinuxProcess.c @@ -399,16 +399,33 @@ void LinuxProcess_makeCommandStr(Process* this) { int cmdlineBasenameOffset = lp->procCmdlineBasenameOffset; if (!showMergedCommand || !procExe || !procComm) { /* fall back to cmdline */ + if (showMergedCommand && !procExe && procComm && strlen(procComm)) { /* Prefix column with comm */ + if (strncmp(cmdline + cmdlineBasenameOffset, procComm, MINIMUM(TASK_COMM_LEN - 1, strlen(procComm))) != 0) { + mc->commStart = 0; + mc->commEnd = strlen(procComm); + + str = stpcpy(str, procComm); + + mc->sep1 = str - strStart; + str = stpcpy(str, SEPARATOR); + } + } + if (showProgramPath) { - (void) stpcpyWithNewlineConversion(strStart, cmdline); + (void) stpcpyWithNewlineConversion(str, cmdline); mc->baseStart = cmdlineBasenameOffset; mc->baseEnd = lp->procCmdlineBasenameEnd; } else { - (void) stpcpyWithNewlineConversion(strStart, cmdline + cmdlineBasenameOffset); + (void) stpcpyWithNewlineConversion(str, cmdline + cmdlineBasenameOffset); mc->baseStart = 0; mc->baseEnd = lp->procCmdlineBasenameEnd - cmdlineBasenameOffset; } + if (mc->sep1) { + mc->baseStart += str - strStart - SEPARATOR_LEN + 1; + mc->baseEnd += str - strStart - SEPARATOR_LEN + 1; + } + return; } @@ -520,6 +537,9 @@ static void LinuxProcess_writeCommand(const Process* this, int attr, int baseAtt bool highlightBaseName = this->settings->highlightBaseName; + if(lp->procExeDeleted) + baseAttr = CRT_colors[FAILED_READ]; + RichString_append(str, attr, lp->mergedCommand.str); if (lp->mergedCommand.commEnd) { @@ -716,6 +736,8 @@ static void LinuxProcess_writeField(const Process* this, RichString* str, Proces case PROC_EXE: { if (lp->procExe) { attr = CRT_colors[Process_isUserlandThread(this) ? PROCESS_THREAD_BASENAME : PROCESS_BASENAME]; + if (lp->procExeDeleted) + attr = CRT_colors[FAILED_READ]; xSnprintf(buffer, n, "%-15.15s ", lp->procExe + lp->procExeBasenameOffset); } else { attr = CRT_colors[PROCESS_SHADOW]; diff --git a/linux/LinuxProcess.h b/linux/LinuxProcess.h index 63c88974..f5f33a77 100644 --- a/linux/LinuxProcess.h +++ b/linux/LinuxProcess.h @@ -130,6 +130,7 @@ typedef struct LinuxProcess_ { char *procExe; int procExeLen; int procExeBasenameOffset; + bool procExeDeleted; int procCmdlineBasenameOffset; int procCmdlineBasenameEnd; LinuxProcessMergedCommand mergedCommand; diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 43c419a9..4c6a8f23 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -1051,12 +1051,22 @@ static bool LinuxProcessList_readCmdlineFile(Process* process, const char* dirna ; lp->procExeBasenameOffset = amtRead + 1; lp->mergedCommand.exeChanged = true; + + const char* deletedMarker = " (deleted)"; + if (strlen(lp->procExe) > strlen(deletedMarker)) { + lp->procExeDeleted = String_eq(lp->procExe + strlen(lp->procExe) - strlen(deletedMarker), deletedMarker); + + if (lp->procExeDeleted && strlen(lp->procExe) - strlen(deletedMarker) == 1 && lp->procExe[0] == '/') { + lp->procExeBasenameOffset = 0; + } + } } } else if (lp->procExe) { free(lp->procExe); lp->procExe = NULL; lp->procExeLen = 0; lp->procExeBasenameOffset = 0; + lp->procExeDeleted = false; lp->mergedCommand.exeChanged = true; }