/*
htop - Process.c
(C) 2004-2015 Hisham H. Muhammad
(C) 2020 Red Hat, Inc.  All Rights Reserved.
Released under the GNU GPLv2+, see the COPYING file
in the source distribution for its full text.
*/

#include "config.h" // IWYU pragma: keep

#include "Process.h"

#include <assert.h>
#include <math.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/resource.h>

#include "CRT.h"
#include "Hashtable.h"
#include "Machine.h"
#include "Macros.h"
#include "ProcessTable.h"
#include "DynamicColumn.h"
#include "RichString.h"
#include "Scheduling.h"
#include "Settings.h"
#include "Table.h"
#include "XUtils.h"

#if defined(MAJOR_IN_MKDEV)
#include <sys/mkdev.h>
#endif


/* Used to identify kernel threads in Comm and Exe columns */
static const char* const kthreadID = "KTHREAD";

void Process_fillStarttimeBuffer(Process* this) {
   struct tm date;
   time_t now = this->super.host->realtime.tv_sec;
   (void) localtime_r(&this->starttime_ctime, &date);

   strftime(this->starttime_show,
            sizeof(this->starttime_show) - 1,
            (this->starttime_ctime > now - 86400) ? "%R " : (this->starttime_ctime > now - 364 * 86400) ? "%b%d " : " %Y ",
            &date);
}

/*
 * TASK_COMM_LEN is defined to be 16 for /proc/[pid]/comm in man proc(5), but it is
 * not available in an userspace header - so define it.
 *
 * Note: This is taken from LINUX headers, but implicitly taken for other platforms
 * for sake of brevity.
 *
 * Note: when colorizing a basename with the comm prefix, the entire basename
 * (not just the comm prefix) is colorized for better readability, and it is
 * implicit that only up to (TASK_COMM_LEN - 1) could be comm.
 */
#define TASK_COMM_LEN 16

static bool findCommInCmdline(const char* comm, const char* cmdline, int cmdlineBasenameStart, int* pCommStart, int* pCommEnd) {
   /* Try to find procComm in tokenized cmdline - this might in rare cases
    * mis-identify a string or fail, if comm or cmdline had been unsuitably
    * modified by the process */
   const char* tokenBase;
   size_t tokenLen;
   const size_t commLen = strlen(comm);

   if (cmdlineBasenameStart < 0)
      return false;

   for (const char* token = cmdline + cmdlineBasenameStart; *token;) {
      for (tokenBase = token; *token && *token != '\n'; ++token) {
         if (*token == '/') {
            tokenBase = token + 1;
         }
      }
      tokenLen = token - tokenBase;

      if ((tokenLen == commLen || (tokenLen > commLen && commLen == (TASK_COMM_LEN - 1))) &&
          strncmp(tokenBase, comm, commLen) == 0) {
         *pCommStart = tokenBase - cmdline;
         *pCommEnd = token - cmdline;
         return true;
      }

      if (*token) {
         do {
            ++token;
         } while (*token && '\n' == *token);
      }
   }
   return false;
}

static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int cmdlineBaseOffset, const char* exe, int exeBaseOffset, int exeBaseLen) {
   int matchLen; /* matching length to be returned */
   char delim;   /* delimiter following basename */

   /* cmdline prefix is an absolute path: it must match whole exe. */
   if (cmdline[0] == '/') {
      matchLen = exeBaseLen + exeBaseOffset;
      if (strncmp(cmdline, exe, matchLen) == 0) {
         delim = cmdline[matchLen];
         if (delim == 0 || delim == '\n' || delim == ' ') {
            return matchLen;
         }
      }
      return 0;
   }

   /* cmdline prefix is a relative path: We need to first match the basename at
    * cmdlineBaseOffset and then reverse match the cmdline prefix with the exe
    * suffix. But there is a catch: Some processes modify their cmdline in ways
    * that make htop's identification of the basename in cmdline unreliable.
    * For e.g. /usr/libexec/gdm-session-worker modifies its cmdline to
    * "gdm-session-worker [pam/gdm-autologin]" and htop ends up with
    * proccmdlineBasenameEnd at "gdm-autologin]". This issue could arise with
    * chrome as well as it stores in cmdline its concatenated argument vector,
    * without NUL delimiter between the arguments (which may contain a '/')
    *
    * So if needed, we adjust cmdlineBaseOffset to the previous (if any)
    * component of the cmdline relative path, and retry the procedure. */
   bool delimFound; /* if valid basename delimiter found */
   do {
      /* match basename */
      matchLen = exeBaseLen + cmdlineBaseOffset;
      if (cmdlineBaseOffset < exeBaseOffset &&
          strncmp(cmdline + cmdlineBaseOffset, exe + exeBaseOffset, exeBaseLen) == 0) {
         delim = cmdline[matchLen];
         if (delim == 0 || delim == '\n' || delim == ' ') {
            int i, j;
            /* reverse match the cmdline prefix and exe suffix */
            for (i = cmdlineBaseOffset - 1, j = exeBaseOffset - 1;
                 i >= 0 && j >= 0 && cmdline[i] == exe[j]; --i, --j)
               ;

            /* full match, with exe suffix being a valid relative path */
            if (i < 0 && j >= 0 && exe[j] == '/')
               return matchLen;
         }
      }

      /* Try to find the previous potential cmdlineBaseOffset - it would be
       * preceded by '/' or nothing, and delimited by ' ' or '\n' */
      for (delimFound = false, cmdlineBaseOffset -= 2; cmdlineBaseOffset > 0; --cmdlineBaseOffset) {
         if (delimFound) {
            if (cmdline[cmdlineBaseOffset - 1] == '/') {
               break;
            }
         } else if (cmdline[cmdlineBaseOffset] == ' ' || cmdline[cmdlineBaseOffset] == '\n') {
            delimFound = true;
         }
      }
   } while (delimFound);

   return 0;
}

/* stpcpy, but also converts newlines to spaces */
static inline char* stpcpyWithNewlineConversion(char* dstStr, const char* srcStr) {
   for (; *srcStr; ++srcStr) {
      *dstStr++ = (*srcStr == '\n') ? ' ' : *srcStr;
   }
   *dstStr = 0;
   return dstStr;
}

/*
 * This function makes the merged Command string. It also stores the offsets of the
 * basename, comm w.r.t the merged Command string - these offsets will be used by
 * Process_writeCommand() for coloring. The merged Command string is also
 * returned by Process_getCommand() for searching, sorting and filtering.
 */
void Process_makeCommandStr(Process* this, const Settings* settings) {
   ProcessMergedCommand* mc = &this->mergedCommand;

   bool showMergedCommand = settings->showMergedCommand;
   bool showProgramPath = settings->showProgramPath;
   bool searchCommInCmdline = settings->findCommInCmdline;
   bool stripExeFromCmdline = settings->stripExeFromCmdline;
   bool showThreadNames = settings->showThreadNames;
   bool shadowDistPathPrefix = settings->shadowDistPathPrefix;

   uint64_t settingsStamp = settings->lastUpdate;

   /* Nothing to do to (Re)Generate the Command string, if the process is:
    * - a kernel thread, or
    * - a zombie from before being under htop's watch, or
    * - a user thread and showThreadNames is not set */
   if (Process_isKernelThread(this))
      return;
   if (this->state == ZOMBIE && !this->mergedCommand.str)
      return;

   /* this->mergedCommand.str needs updating only if its state or contents changed.
    * Its content is based on the fields cmdline, comm, and exe. */
   if (mc->lastUpdate >= settingsStamp)
      return;

   mc->lastUpdate = settingsStamp;

   /* The field separator "│" has been chosen such that it will not match any
    * valid string used for searching or filtering */
   const char* SEPARATOR = CRT_treeStr[TREE_STR_VERT];
   const int SEPARATOR_LEN = strlen(SEPARATOR);

   /* Accommodate the column text, two field separators and terminating NUL */
   size_t maxLen = 2 * SEPARATOR_LEN + 1;
   maxLen += this->cmdline ? strlen(this->cmdline) : strlen("(zombie)");
   maxLen += this->procComm ? strlen(this->procComm) : 0;
   maxLen += this->procExe ? strlen(this->procExe) : 0;

   free(mc->str);
   mc->str = xCalloc(1, maxLen);

   /* Reset all locations that need extra handling when actually displaying */
   mc->highlightCount = 0;
   memset(mc->highlights, 0, sizeof(mc->highlights));

   size_t mbMismatch = 0;
   #define WRITE_HIGHLIGHT(_offset, _length, _attr, _flags)                                   \
      do {                                                                                    \
         /* Check if we still have capacity */                                                \
         assert(mc->highlightCount < ARRAYSIZE(mc->highlights));                              \
         if (mc->highlightCount >= ARRAYSIZE(mc->highlights))                                 \
            break;                                                                            \
                                                                                              \
         mc->highlights[mc->highlightCount].offset = str - strStart + (_offset) - mbMismatch; \
         mc->highlights[mc->highlightCount].length = _length;                                 \
         mc->highlights[mc->highlightCount].attr = _attr;                                     \
         mc->highlights[mc->highlightCount].flags = _flags;                                   \
         mc->highlightCount++;                                                                \
      } while (0)

   #define WRITE_SEPARATOR                                                                    \
      do {                                                                                    \
         WRITE_HIGHLIGHT(0, 1, CRT_colors[FAILED_READ], CMDLINE_HIGHLIGHT_FLAG_SEPARATOR);    \
         mbMismatch += SEPARATOR_LEN - 1;                                                     \
         str = stpcpy(str, SEPARATOR);                                                        \
      } while (0)

   #define CHECK_AND_MARK(str_, prefix_)                                                      \
      if (String_startsWith(str_, prefix_)) {                                                 \
         WRITE_HIGHLIGHT(0, strlen(prefix_), CRT_colors[PROCESS_SHADOW], CMDLINE_HIGHLIGHT_FLAG_PREFIXDIR); \
         break;                                                                               \
      } else (void)0

   #define CHECK_AND_MARK_DIST_PATH_PREFIXES(str_)                                            \
      do {                                                                                    \
         if ((str_)[0] != '/') {                                                              \
            break;                                                                            \
         }                                                                                    \
         switch ((str_)[1]) {                                                                 \
            case 'b':                                                                         \
               CHECK_AND_MARK(str_, "/bin/");                                                 \
               break;                                                                         \
            case 'l':                                                                         \
               CHECK_AND_MARK(str_, "/lib/");                                                 \
               CHECK_AND_MARK(str_, "/lib32/");                                               \
               CHECK_AND_MARK(str_, "/lib64/");                                               \
               CHECK_AND_MARK(str_, "/libx32/");                                              \
               break;                                                                         \
            case 's':                                                                         \
               CHECK_AND_MARK(str_, "/sbin/");                                                \
               break;                                                                         \
            case 'u':                                                                         \
               if (String_startsWith(str_, "/usr/")) {                                        \
                  switch ((str_)[5]) {                                                        \
                     case 'b':                                                                \
                        CHECK_AND_MARK(str_, "/usr/bin/");                                    \
                        break;                                                                \
                     case 'l':                                                                \
                        CHECK_AND_MARK(str_, "/usr/libexec/");                                \
                        CHECK_AND_MARK(str_, "/usr/lib/");                                    \
                        CHECK_AND_MARK(str_, "/usr/lib32/");                                  \
                        CHECK_AND_MARK(str_, "/usr/lib64/");                                  \
                        CHECK_AND_MARK(str_, "/usr/libx32/");                                 \
                                                                                              \
                        CHECK_AND_MARK(str_, "/usr/local/bin/");                              \
                        CHECK_AND_MARK(str_, "/usr/local/lib/");                              \
                        CHECK_AND_MARK(str_, "/usr/local/sbin/");                             \
                        break;                                                                \
                     case 's':                                                                \
                        CHECK_AND_MARK(str_, "/usr/sbin/");                                   \
                        break;                                                                \
                  }                                                                           \
               }                                                                              \
               break;                                                                         \
         }                                                                                    \
      } while (0)

   const int baseAttr = Process_isThread(this) ? CRT_colors[PROCESS_THREAD_BASENAME] : CRT_colors[PROCESS_BASENAME];
   const int commAttr = Process_isThread(this) ? CRT_colors[PROCESS_THREAD_COMM] : CRT_colors[PROCESS_COMM];
   const int delExeAttr = CRT_colors[FAILED_READ];
   const int delLibAttr = CRT_colors[PROCESS_TAG];

   /* Establish some shortcuts to data we need */
   const char* cmdline = this->cmdline;
   const char* procComm = this->procComm;
   const char* procExe = this->procExe;

   char* strStart = mc->str;
   char* str = strStart;

   int cmdlineBasenameStart = this->cmdlineBasenameStart;
   int cmdlineBasenameEnd = this->cmdlineBasenameEnd;

   if (!cmdline) {
      cmdlineBasenameStart = 0;
      cmdlineBasenameEnd = 0;
      cmdline = "(zombie)";
   }

   assert(cmdlineBasenameStart >= 0);
   assert(cmdlineBasenameStart <= (int)strlen(cmdline));

   if (!showMergedCommand || !procExe || !procComm) { /* fall back to cmdline */
      if ((showMergedCommand || (Process_isUserlandThread(this) && showThreadNames)) && procComm && strlen(procComm)) { /* set column to or prefix it with comm */
         if (strncmp(cmdline + cmdlineBasenameStart, procComm, MINIMUM(TASK_COMM_LEN - 1, strlen(procComm))) != 0) {
            WRITE_HIGHLIGHT(0, strlen(procComm), commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM);
            str = stpcpy(str, procComm);

            if (!showMergedCommand)
               return;

            WRITE_SEPARATOR;
         }
      }

      if (shadowDistPathPrefix && showProgramPath)
         CHECK_AND_MARK_DIST_PATH_PREFIXES(cmdline);

      if (cmdlineBasenameEnd > cmdlineBasenameStart)
         WRITE_HIGHLIGHT(showProgramPath ? cmdlineBasenameStart : 0, cmdlineBasenameEnd - cmdlineBasenameStart, baseAttr, CMDLINE_HIGHLIGHT_FLAG_BASENAME);

      if (this->procExeDeleted)
         WRITE_HIGHLIGHT(showProgramPath ? cmdlineBasenameStart : 0, cmdlineBasenameEnd - cmdlineBasenameStart, delExeAttr, CMDLINE_HIGHLIGHT_FLAG_DELETED);
      else if (this->usesDeletedLib)
         WRITE_HIGHLIGHT(showProgramPath ? cmdlineBasenameStart : 0, cmdlineBasenameEnd - cmdlineBasenameStart, delLibAttr, CMDLINE_HIGHLIGHT_FLAG_DELETED);

      (void)stpcpyWithNewlineConversion(str, cmdline + (showProgramPath ? 0 : cmdlineBasenameStart));

      return;
   }

   int exeLen = strlen(this->procExe);
   int exeBasenameOffset = this->procExeBasenameOffset;
   int exeBasenameLen = exeLen - exeBasenameOffset;

   assert(exeBasenameOffset >= 0);
   assert(exeBasenameOffset <= (int)strlen(procExe));

   bool haveCommInExe = false;
   if (procExe && procComm && (!Process_isUserlandThread(this) || showThreadNames)) {
      haveCommInExe = strncmp(procExe + exeBasenameOffset, procComm, TASK_COMM_LEN - 1) == 0;
   }

   /* Start with copying exe */
   if (showProgramPath) {
      if (shadowDistPathPrefix)
         CHECK_AND_MARK_DIST_PATH_PREFIXES(procExe);
      if (haveCommInExe)
         WRITE_HIGHLIGHT(exeBasenameOffset, exeBasenameLen, commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM);
      WRITE_HIGHLIGHT(exeBasenameOffset, exeBasenameLen, baseAttr, CMDLINE_HIGHLIGHT_FLAG_BASENAME);
      if (this->procExeDeleted)
         WRITE_HIGHLIGHT(exeBasenameOffset, exeBasenameLen, delExeAttr, CMDLINE_HIGHLIGHT_FLAG_DELETED);
      else if (this->usesDeletedLib)
         WRITE_HIGHLIGHT(exeBasenameOffset, exeBasenameLen, delLibAttr, CMDLINE_HIGHLIGHT_FLAG_DELETED);
      str = stpcpy(str, procExe);
   } else {
      if (haveCommInExe)
         WRITE_HIGHLIGHT(0, exeBasenameLen, commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM);
      WRITE_HIGHLIGHT(0, exeBasenameLen, baseAttr, CMDLINE_HIGHLIGHT_FLAG_BASENAME);
      if (this->procExeDeleted)
         WRITE_HIGHLIGHT(0, exeBasenameLen, delExeAttr, CMDLINE_HIGHLIGHT_FLAG_DELETED);
      else if (this->usesDeletedLib)
         WRITE_HIGHLIGHT(0, exeBasenameLen, delLibAttr, CMDLINE_HIGHLIGHT_FLAG_DELETED);
      str = stpcpy(str, procExe + exeBasenameOffset);
   }

   bool haveCommInCmdline = false;
   int commStart = 0;
   int commEnd = 0;

   /* Try to match procComm with procExe's basename: This is reliable (predictable) */
   if (searchCommInCmdline) {
      /* commStart/commEnd will be adjusted later along with cmdline */
      haveCommInCmdline = (!Process_isUserlandThread(this) || showThreadNames) && findCommInCmdline(procComm, cmdline, cmdlineBasenameStart, &commStart, &commEnd);
   }

   int matchLen = matchCmdlinePrefixWithExeSuffix(cmdline, cmdlineBasenameStart, procExe, exeBasenameOffset, exeBasenameLen);

   bool haveCommField = false;

   if (!haveCommInExe && !haveCommInCmdline && procComm && (!Process_isUserlandThread(this) || showThreadNames)) {
      WRITE_SEPARATOR;
      WRITE_HIGHLIGHT(0, strlen(procComm), commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM);
      str = stpcpy(str, procComm);
      haveCommField = true;
   }

   if (matchLen) {
      if (stripExeFromCmdline) {
         /* strip the matched exe prefix */
         cmdline += matchLen;

         commStart -= matchLen;
         commEnd -= matchLen;
      } else {
         matchLen = 0;
      }
   }

   if (!matchLen || (haveCommField && *cmdline)) {
      /* cmdline will be a separate field */
      WRITE_SEPARATOR;
   }

   if (shadowDistPathPrefix)
      CHECK_AND_MARK_DIST_PATH_PREFIXES(cmdline);

   if (!haveCommInExe && haveCommInCmdline && !haveCommField && (!Process_isUserlandThread(this) || showThreadNames))
      WRITE_HIGHLIGHT(commStart, commEnd - commStart, commAttr, CMDLINE_HIGHLIGHT_FLAG_COMM);

   /* Display cmdline if it hasn't been consumed by procExe */
   if (*cmdline)
      (void)stpcpyWithNewlineConversion(str, cmdline);

   #undef CHECK_AND_MARK_DIST_PATH_PREFIXES
   #undef CHECK_AND_MARK
   #undef WRITE_SEPARATOR
   #undef WRITE_HIGHLIGHT
}

void Process_writeCommand(const Process* this, int attr, int baseAttr, RichString* str) {
   (void)baseAttr;

   const ProcessMergedCommand* mc = &this->mergedCommand;
   const char* mergedCommand = mc->str;

   int strStart = RichString_size(str);

   const Settings* settings = this->super.host->settings;
   const bool highlightBaseName = settings->highlightBaseName;
   const bool highlightSeparator = true;
   const bool highlightDeleted = settings->highlightDeletedExe;

   if (!mergedCommand) {
      int len = 0;
      const char* cmdline = this->cmdline;

      if (highlightBaseName || !settings->showProgramPath) {
         int basename = 0;
         for (int i = 0; i < this->cmdlineBasenameEnd; i++) {
            if (cmdline[i] == '/') {
               basename = i + 1;
            } else if (cmdline[i] == ':') {
               len = i + 1;
               break;
            }
         }
         if (len == 0) {
            if (settings->showProgramPath) {
               strStart += basename;
            } else {
               cmdline += basename;
            }
            len = this->cmdlineBasenameEnd - basename;
         }
      }

      RichString_appendWide(str, attr, cmdline);

      if (settings->highlightBaseName) {
         RichString_setAttrn(str, baseAttr, strStart, len);
      }

      return;
   }

   RichString_appendWide(str, attr, mergedCommand);

   for (size_t i = 0, hlCount = CLAMP(mc->highlightCount, 0, ARRAYSIZE(mc->highlights)); i < hlCount; i++) {
      const ProcessCmdlineHighlight* hl = &mc->highlights[i];

      if (!hl->length)
         continue;

      if (hl->flags & CMDLINE_HIGHLIGHT_FLAG_SEPARATOR)
         if (!highlightSeparator)
            continue;

      if (hl->flags & CMDLINE_HIGHLIGHT_FLAG_BASENAME)
         if (!highlightBaseName)
            continue;

      if (hl->flags & CMDLINE_HIGHLIGHT_FLAG_DELETED)
         if (!highlightDeleted)
            continue;

      if (hl->flags & CMDLINE_HIGHLIGHT_FLAG_PREFIXDIR)
         if (!highlightDeleted)
            continue;

      RichString_setAttrn(str, hl->attr, strStart + hl->offset, hl->length);
   }
}

static inline char processStateChar(ProcessState state) {
   switch (state) {
      case UNKNOWN: return '?';
      case RUNNABLE: return 'U';
      case RUNNING: return 'R';
      case QUEUED: return 'Q';
      case WAITING: return 'W';
      case UNINTERRUPTIBLE_WAIT: return 'D';
      case BLOCKED: return 'B';
      case PAGING: return 'P';
      case STOPPED: return 'T';
      case TRACED: return 't';
      case ZOMBIE: return 'Z';
      case DEFUNCT: return 'X';
      case IDLE: return 'I';
      case SLEEPING: return 'S';
      default:
         assert(0);
         return '!';
   }
}

static void Process_rowWriteField(const Row* super, RichString* str, RowField field) {
   const Process* this = (const Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   Process_writeField(this, str, field);
}

void Process_writeField(const Process* this, RichString* str, RowField field) {
   const Row* super = (const Row*) &this->super;
   const Machine* host = super->host;
   const Settings* settings = host->settings;

   bool coloring = settings->highlightMegabytes;
   char buffer[256]; buffer[255] = '\0';
   int attr = CRT_colors[DEFAULT_COLOR];
   size_t n = sizeof(buffer) - 1;

   switch (field) {
   case COMM: {
      int baseattr = CRT_colors[PROCESS_BASENAME];
      if (settings->highlightThreads && Process_isThread(this)) {
         attr = CRT_colors[PROCESS_THREAD];
         baseattr = CRT_colors[PROCESS_THREAD_BASENAME];
      }
      const ScreenSettings* ss = settings->ss;
      if (!ss->treeView || super->indent == 0) {
         Process_writeCommand(this, attr, baseattr, str);
         return;
      }

      char* buf = buffer;
      const bool lastItem = (super->indent < 0);

      for (uint32_t indent = (super->indent < 0 ? -super->indent : super->indent); indent > 1; indent >>= 1) {
         int written, ret;
         if (indent & 1U) {
            ret = xSnprintf(buf, n, "%s  ", CRT_treeStr[TREE_STR_VERT]);
         } else {
            ret = xSnprintf(buf, n, "   ");
         }
         if (ret < 0 || (size_t)ret >= n) {
            written = n;
         } else {
            written = ret;
         }
         buf += written;
         n -= written;
      }

      const char* draw = CRT_treeStr[lastItem ? TREE_STR_BEND : TREE_STR_RTEE];
      xSnprintf(buf, n, "%s%s ", draw, super->showChildren ? CRT_treeStr[TREE_STR_SHUT] : CRT_treeStr[TREE_STR_OPEN] );
      RichString_appendWide(str, CRT_colors[PROCESS_TREE], buffer);
      Process_writeCommand(this, attr, baseattr, str);
      return;
   }
   case PROC_COMM: {
      const char* procComm;
      if (this->procComm) {
         attr = CRT_colors[Process_isUserlandThread(this) ? PROCESS_THREAD_COMM : PROCESS_COMM];
         procComm = this->procComm;
      } else {
         attr = CRT_colors[PROCESS_SHADOW];
         procComm = Process_isKernelThread(this) ? kthreadID : "N/A";
      }

      Row_printLeftAlignedField(str, attr, procComm, TASK_COMM_LEN - 1);
      return;
   }
   case PROC_EXE: {
      const char* procExe;
      if (this->procExe) {
         attr = CRT_colors[Process_isUserlandThread(this) ? PROCESS_THREAD_BASENAME : PROCESS_BASENAME];
         if (settings->highlightDeletedExe) {
            if (this->procExeDeleted)
               attr = CRT_colors[FAILED_READ];
            else if (this->usesDeletedLib)
               attr = CRT_colors[PROCESS_TAG];
         }
         procExe = this->procExe + this->procExeBasenameOffset;
      } else {
         attr = CRT_colors[PROCESS_SHADOW];
         procExe = Process_isKernelThread(this) ? kthreadID : "N/A";
      }

      Row_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;
      }
      Row_printLeftAlignedField(str, attr, cwd, 25);
      return;
   }
   case ELAPSED: {
      const uint64_t rt = host->realtimeMs;
      const uint64_t st = this->starttime_ctime * 1000;
      const uint64_t dt =
         rt < st ? 0 :
         rt - st;
      Row_printTime(str, /* convert to hundreds of a second */ dt / 10, coloring);
      return;
   }
   case MAJFLT: Row_printCount(str, this->majflt, coloring); return;
   case MINFLT: Row_printCount(str, this->minflt, coloring); return;
   case M_RESIDENT: Row_printKBytes(str, this->m_resident, coloring); return;
   case M_VIRT: Row_printKBytes(str, this->m_virt, coloring); return;
   case NICE:
      xSnprintf(buffer, n, "%3ld ", this->nice);
      attr = this->nice < 0 ? CRT_colors[PROCESS_HIGH_PRIORITY]
         : this->nice > 0 ? CRT_colors[PROCESS_LOW_PRIORITY]
         : CRT_colors[PROCESS_SHADOW];
      break;
   case NLWP:
      if (this->nlwp == 1)
         attr = CRT_colors[PROCESS_SHADOW];

      xSnprintf(buffer, n, "%4ld ", this->nlwp);
      break;
   case PERCENT_CPU: Row_printPercentage(this->percent_cpu, buffer, n, Row_fieldWidths[PERCENT_CPU], &attr); break;
   case PERCENT_NORM_CPU: {
      float cpuPercentage = this->percent_cpu / host->activeCPUs;
      Row_printPercentage(cpuPercentage, buffer, n, Row_fieldWidths[PERCENT_CPU], &attr);
      break;
   }
   case PERCENT_MEM: Row_printPercentage(this->percent_mem, buffer, n, 4, &attr); break;
   case PGRP: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->pgrp); break;
   case PID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, Process_getPid(this)); break;
   case PPID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, Process_getParent(this)); break;
   case PRIORITY:
      if (this->priority <= -100)
         xSnprintf(buffer, n, " RT ");
      else
         xSnprintf(buffer, n, "%3ld ", this->priority);
      break;
   case PROCESSOR: xSnprintf(buffer, n, "%3d ", Settings_cpuId(settings, this->processor)); break;
   case SCHEDULERPOLICY: {
      const char* schedPolStr = "N/A";
#ifdef SCHEDULER_SUPPORT
      if (this->scheduling_policy >= 0)
         schedPolStr = Scheduling_formatPolicy(this->scheduling_policy);
#endif
      xSnprintf(buffer, n, "%-5s ", schedPolStr);
      break;
   }
   case SESSION: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->session); break;
   case STARTTIME: xSnprintf(buffer, n, "%s", this->starttime_show); break;
   case STATE:
      xSnprintf(buffer, n, "%c ", processStateChar(this->state));
      switch (this->state) {
      case RUNNABLE:
      case RUNNING:
      case TRACED:
         attr = CRT_colors[PROCESS_RUN_STATE];
         break;

      case BLOCKED:
      case DEFUNCT:
      case STOPPED:
      case UNINTERRUPTIBLE_WAIT:
      case ZOMBIE:
         attr = CRT_colors[PROCESS_D_STATE];
         break;

      case QUEUED:
      case WAITING:
      case IDLE:
      case SLEEPING:
         attr = CRT_colors[PROCESS_SHADOW];
         break;

      case UNKNOWN:
      case PAGING:
         break;
      }
      break;
   case ST_UID: xSnprintf(buffer, n, "%*d ", Process_uidDigits, this->st_uid); break;
   case TIME: Row_printTime(str, this->time, coloring); return;
   case TGID:
      if (Process_getThreadGroup(this) == Process_getPid(this))
         attr = CRT_colors[PROCESS_SHADOW];

      xSnprintf(buffer, n, "%*d ", Process_pidDigits, Process_getThreadGroup(this));
      break;
   case TPGID: xSnprintf(buffer, n, "%*d ", Process_pidDigits, this->tpgid); break;
   case TTY:
      if (!this->tty_name) {
         attr = CRT_colors[PROCESS_SHADOW];
         xSnprintf(buffer, n, "(no tty) ");
      } else {
         const char* name = String_startsWith(this->tty_name, "/dev/") ? (this->tty_name + strlen("/dev/")) : this->tty_name;
         xSnprintf(buffer, n, "%-8s ", name);
      }
      break;
   case USER:
      if (this->elevated_priv)
         attr = CRT_colors[PROCESS_PRIV];
      else if (host->htopUserId != this->st_uid)
         attr = CRT_colors[PROCESS_SHADOW];

      if (this->user) {
         Row_printLeftAlignedField(str, attr, this->user, 10);
         return;
      }

      xSnprintf(buffer, n, "%-10d ", this->st_uid);
      break;
   default:
      if (DynamicColumn_writeField(this, str, field))
         return;
      assert(0 && "Process_writeField: default key reached"); /* should never be reached */
      xSnprintf(buffer, n, "- ");
      break;
   }

   RichString_appendAscii(str, attr, buffer);
}

void Process_done(Process* this) {
   assert(this != NULL);
   free(this->cmdline);
   free(this->procComm);
   free(this->procExe);
   free(this->procCwd);
   free(this->mergedCommand.str);
   free(this->tty_name);
}

/* This function returns the string displayed in Command column, so that sorting
 * happens on what is displayed - whether comm, full path, basename, etc.. So
 * this follows Process_writeField(COMM) and Process_writeCommand */
const char* Process_getCommand(const Process* this) {
   const Settings* settings = this->super.host->settings;

   if ((Process_isUserlandThread(this) && settings->showThreadNames) || !this->mergedCommand.str) {
      return this->cmdline;
   }

   return this->mergedCommand.str;
}

static const char* Process_getSortKey(const Process* this) {
   return Process_getCommand(this);
}

const char* Process_rowGetSortKey(Row* super) {
   const Process* this = (const Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_getSortKey(this);
}

/* Test whether display must highlight this row (if the htop UID matches) */
static bool Process_isHighlighted(const Process* this) {
   const Machine* host = this->super.host;
   const Settings* settings = host->settings;
   return settings->shadowOtherUsers && this->st_uid != host->htopUserId;
}

bool Process_rowIsHighlighted(const Row* super) {
   const Process* this = (const Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_isHighlighted(this);
}

/* Test whether display must follow parent process (if this thread is hidden) */
static bool Process_isVisible(const Process* p, const Settings* settings) {
   if (settings->hideUserlandThreads)
      return !Process_isThread(p);
   return true;
}

bool Process_rowIsVisible(const Row* super, const Table* table) {
   const Process* this = (const Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_isVisible(this, table->host->settings);
}

/* Test whether display must filter out this process (various mechanisms) */
static bool Process_matchesFilter(const Process* this, const Table* table) {
   const Machine* host = table->host;
   if (host->userId != (uid_t) -1 && this->st_uid != host->userId)
      return true;

   const char* incFilter = table->incFilter;
   if (incFilter && !String_contains_i(Process_getCommand(this), incFilter, true))
      return true;

   const ProcessTable* pt = (const ProcessTable*) host->activeTable;
   assert(Object_isA((const Object*) pt, (const ObjectClass*) &ProcessTable_class));
   if (pt->pidMatchList && !Hashtable_get(pt->pidMatchList, Process_getThreadGroup(this)))
      return true;

   return false;
}

bool Process_rowMatchesFilter(const Row* super, const Table* table) {
   const Process* this = (const Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_matchesFilter(this, table);
}

void Process_init(Process* this, const Machine* host) {
   Row_init(&this->super, host);

   this->cmdlineBasenameEnd = -1;
   this->st_uid = (uid_t)-1;
}

static bool Process_setPriority(Process* this, int priority) {
   if (Settings_isReadonly())
      return false;

   int old_prio = getpriority(PRIO_PROCESS, Process_getPid(this));
   int err = setpriority(PRIO_PROCESS, Process_getPid(this), priority);

   if (err == 0 && old_prio != getpriority(PRIO_PROCESS, Process_getPid(this))) {
      this->nice = priority;
   }
   return (err == 0);
}

bool Process_rowSetPriority(Row* super, int priority) {
   Process* this = (Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_setPriority(this, priority);
}

bool Process_rowChangePriorityBy(Row* super, Arg delta) {
   Process* this = (Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_setPriority(this, this->nice + delta.i);
}

static bool Process_sendSignal(Process* this, Arg sgn) {
   return kill(Process_getPid(this), sgn.i) == 0;
}

bool Process_rowSendSignal(Row* super, Arg sgn) {
   Process* this = (Process*) super;
   assert(Object_isA((const Object*) this, (const ObjectClass*) &Process_class));
   return Process_sendSignal(this, sgn);
}

int Process_compare(const void* v1, const void* v2) {
   const Process* p1 = (const Process*)v1;
   const Process* p2 = (const Process*)v2;

   const ScreenSettings* ss = p1->super.host->settings->ss;

   ProcessField key = ScreenSettings_getActiveSortKey(ss);

   int result = Process_compareByKey(p1, p2, key);

   // Implement tie-breaker (needed to make tree mode more stable)
   if (!result)
      return SPACESHIP_NUMBER(Process_getPid(p1), Process_getPid(p2));

   return (ScreenSettings_getActiveDirection(ss) == 1) ? result : -result;
}

int Process_compareByParent(const Row* r1, const Row* r2) {
   int result = SPACESHIP_NUMBER(
      r1->isRoot ? 0 : Row_getGroupOrParent(r1),
      r2->isRoot ? 0 : Row_getGroupOrParent(r2)
   );

   if (result != 0)
      return result;

   return Process_compare(r1, r2);
}

int Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField key) {
   int r;

   switch (key) {
   case PERCENT_CPU:
   case PERCENT_NORM_CPU:
      return compareRealNumbers(p1->percent_cpu, p2->percent_cpu);
   case PERCENT_MEM:
      return SPACESHIP_NUMBER(p1->m_resident, p2->m_resident);
   case COMM:
      return SPACESHIP_NULLSTR(Process_getCommand(p1), Process_getCommand(p2));
   case PROC_COMM: {
      const char* comm1 = p1->procComm ? p1->procComm : (Process_isKernelThread(p1) ? kthreadID : "");
      const char* comm2 = p2->procComm ? p2->procComm : (Process_isKernelThread(p2) ? kthreadID : "");
      return SPACESHIP_NULLSTR(comm1, comm2);
   }
   case PROC_EXE: {
      const char* exe1 = p1->procExe ? (p1->procExe + p1->procExeBasenameOffset) : (Process_isKernelThread(p1) ? kthreadID : "");
      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(Process_getPid(p1), Process_getPid(p2));
   case MAJFLT:
      return SPACESHIP_NUMBER(p1->majflt, p2->majflt);
   case MINFLT:
      return SPACESHIP_NUMBER(p1->minflt, p2->minflt);
   case M_RESIDENT:
      return SPACESHIP_NUMBER(p1->m_resident, p2->m_resident);
   case M_VIRT:
      return SPACESHIP_NUMBER(p1->m_virt, p2->m_virt);
   case NICE:
      return SPACESHIP_NUMBER(p1->nice, p2->nice);
   case NLWP:
      return SPACESHIP_NUMBER(p1->nlwp, p2->nlwp);
   case PGRP:
      return SPACESHIP_NUMBER(p1->pgrp, p2->pgrp);
   case PID:
      return SPACESHIP_NUMBER(Process_getPid(p1), Process_getPid(p2));
   case PPID:
      return SPACESHIP_NUMBER(Process_getParent(p1), Process_getParent(p2));
   case PRIORITY:
      return SPACESHIP_NUMBER(p1->priority, p2->priority);
   case PROCESSOR:
      return SPACESHIP_NUMBER(p1->processor, p2->processor);
   case SCHEDULERPOLICY:
      return SPACESHIP_NUMBER(p1->scheduling_policy, p2->scheduling_policy);
   case SESSION:
      return SPACESHIP_NUMBER(p1->session, p2->session);
   case STARTTIME:
      r = SPACESHIP_NUMBER(p1->starttime_ctime, p2->starttime_ctime);
      return r != 0 ? r : SPACESHIP_NUMBER(Process_getPid(p1), Process_getPid(p2));
   case STATE:
      return SPACESHIP_NUMBER(p1->state, p2->state);
   case ST_UID:
      return SPACESHIP_NUMBER(p1->st_uid, p2->st_uid);
   case TIME:
      return SPACESHIP_NUMBER(p1->time, p2->time);
   case TGID:
      return SPACESHIP_NUMBER(Process_getThreadGroup(p1), Process_getThreadGroup(p2));
   case TPGID:
      return SPACESHIP_NUMBER(p1->tpgid, p2->tpgid);
   case TTY:
      /* Order no tty last */
      return SPACESHIP_DEFAULTSTR(p1->tty_name, p2->tty_name, "\x7F");
   case USER:
      return SPACESHIP_NULLSTR(p1->user, p2->user);
   default:
      CRT_debug("Process_compareByKey_Base() called with key %d", key);
      assert(0 && "Process_compareByKey_Base: default key reached"); /* should never be reached */
      return SPACESHIP_NUMBER(Process_getPid(p1), Process_getPid(p2));
   }
}

void Process_updateComm(Process* this, const char* comm) {
   if (!this->procComm && !comm)
      return;

   if (this->procComm && comm && String_eq(this->procComm, comm))
      return;

   free(this->procComm);
   this->procComm = comm ? xStrdup(comm) : NULL;

   this->mergedCommand.lastUpdate = 0;
}

static int skipPotentialPath(const char* cmdline, int end) {
   if (cmdline[0] != '/')
      return 0;

   int slash = 0;
   for (int i = 1; i < end; i++) {
      if (cmdline[i] == '/' && cmdline[i + 1] != '\0') {
         slash = i + 1;
         continue;
      }

      if (cmdline[i] == ' ' && cmdline[i - 1] != '\\')
         return slash;

      if (cmdline[i] == ':' && cmdline[i + 1] == ' ')
         return slash;
   }

   return slash;
}

void Process_updateCmdline(Process* this, const char* cmdline, int basenameStart, int basenameEnd) {
   assert(basenameStart >= 0);
   assert((cmdline && basenameStart < (int)strlen(cmdline)) || (!cmdline && basenameStart == 0));
   assert((basenameEnd > basenameStart) || (basenameEnd == 0 && basenameStart == 0));
   assert((cmdline && basenameEnd <= (int)strlen(cmdline)) || (!cmdline && basenameEnd == 0));

   if (!this->cmdline && !cmdline)
      return;

   if (this->cmdline && cmdline && String_eq(this->cmdline, cmdline))
      return;

   free(this->cmdline);
   this->cmdline = cmdline ? xStrdup(cmdline) : NULL;
   if (Process_isKernelThread(this)) {
      /* kernel threads have no basename */
      this->cmdlineBasenameStart = 0;
      this->cmdlineBasenameEnd = 0;
   } else {
      this->cmdlineBasenameStart = (basenameStart || !cmdline) ? basenameStart : skipPotentialPath(cmdline, basenameEnd);
      this->cmdlineBasenameEnd = basenameEnd;
   }

   this->mergedCommand.lastUpdate = 0;
}

void Process_updateExe(Process* this, const char* exe) {
   if (!this->procExe && !exe)
      return;

   if (this->procExe && exe && String_eq(this->procExe, exe))
      return;

   free(this->procExe);
   if (exe) {
      this->procExe = xStrdup(exe);
      const char* lastSlash = strrchr(exe, '/');
      this->procExeBasenameOffset = (lastSlash && *(lastSlash + 1) != '\0' && lastSlash != exe) ? (lastSlash - exe + 1) : 0;
   } else {
      this->procExe = NULL;
      this->procExeBasenameOffset = 0;
   }

   this->mergedCommand.lastUpdate = 0;
}

void Process_updateCPUFieldWidths(float percentage) {
   if (percentage < 99.9F || isNaN(percentage)) {
      Row_updateFieldWidth(PERCENT_CPU, 4);
      Row_updateFieldWidth(PERCENT_NORM_CPU, 4);
      return;
   }

   // Add additional two characters, one for "." and another for precision.
   uint8_t width = ceil(log10(percentage + 0.1)) + 2;

   Row_updateFieldWidth(PERCENT_CPU, width);
   Row_updateFieldWidth(PERCENT_NORM_CPU, width);
}

const ProcessClass Process_class = {
   .super = {
      .super = {
         .extends = Class(Row),
         .display = Row_display,
         .delete = Process_delete,
         .compare = Process_compare
      },
      .isHighlighted = Process_rowIsHighlighted,
      .isVisible = Process_rowIsVisible,
      .matchesFilter = Process_rowMatchesFilter,
      .sortKeyString = Process_rowGetSortKey,
      .compareByParent = Process_compareByParent,
      .writeField = Process_rowWriteField
   },
};
