summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--procps/top.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/procps/top.c b/procps/top.c
index 804d6f2..15222f5 100644
--- a/procps/top.c
+++ b/procps/top.c
@@ -608,6 +608,8 @@ static NOINLINE void display_process_list(int lines_rem, int scr_width)
BITS_PER_INT = sizeof(int) * 8
};
+ char ppubuf[sizeof(int)*3 * 2 + 12];
+ int n;
top_status_t *s;
unsigned long total_memory = display_header(scr_width, &lines_rem); /* or use total_vsz? */
/* xxx_shift and xxx_scale variables allow us to replace
@@ -699,12 +701,36 @@ static NOINLINE void display_process_list(int lines_rem, int scr_width)
smart_ulltoa5(s->vsz, vsz_str_buf, " mgtpezy");
/* PID PPID USER STAT VSZ %VSZ [%CPU] COMMAND */
+ n = sprintf(ppubuf, "%5u %5u %-8.8s", s->pid, s->ppid, get_cached_username(s->uid));
+ if (n != 6+6+8) {
+ /* Format PID PPID USER part into 6+6+8 chars:
+ * shrink PID/PPID if possible, then truncate USER
+ */
+ char *pp, *p = ppubuf;
+ if (*p == ' ') {
+ do
+ p++, n--;
+ while (n != 6+6+8 && *p == ' ');
+ overlapping_strcpy(ppubuf, p); /* shrink PID */
+ if (n == 6+6+8)
+ goto shortened;
+ }
+ pp = p = skip_non_whitespace(ppubuf) + 1;
+ if (*p == ' ') {
+ do
+ p++, n--;
+ while (n != 6+6+8 && *p == ' ');
+ overlapping_strcpy(pp, p); /* shrink PPID */
+ }
+ ppubuf[6+6+8] = '\0'; /* truncate USER */
+ }
+ shortened:
col = snprintf(line_buf, scr_width,
- "\n" "%5u%6u %-8.8s %s %.5s" FMT
+ "\n" "%s %s %.5s" FMT
IF_FEATURE_TOP_SMP_PROCESS(" %3d")
IF_FEATURE_TOP_CPU_USAGE_PERCENTAGE(FMT)
" ",
- s->pid, s->ppid, get_cached_username(s->uid),
+ ppubuf,
s->state, vsz_str_buf,
SHOW_STAT(pmem)
IF_FEATURE_TOP_SMP_PROCESS(, s->last_seen_on_cpu)