]> granicus.if.org Git - procps-ng/commitdiff
ps: favor truncation of long names over POSIX/UNIX standard
authorJim Warner <james.warner@comcast.net>
Mon, 17 Sep 2012 20:30:45 +0000 (15:30 -0500)
committerCraig Small <csmall@enc.com.au>
Thu, 27 Sep 2012 12:16:53 +0000 (22:16 +1000)
The UNIX and POSIX standards require that user and
group names be printed as decimal integers when there
is insufficient room.  This has led to a constant
stream of bug reports.

With this commit, long names will be truncated and
displayed with a trailing visual clue.

To avoid truncation. the UNIX and POSIX way to change
column width is to rename the column:
   ps -o pid,user=CumbersomeUserNames -o comm

The easy way is to directly specify the desired width:
   ps -o pid,user:19,comm

Reference:
http://www.freelists.org/post/procps/rhbz737215-ps-does-not-resolve-some-user-names

Signed-off-by: Jim Warner <james.warner@comcast.net>
ps/output.c

index cf02e0a1ef8f7cb2ffeec37e34db8f0423afaf8f..9644ed3b34dbb3614366397e55cf0f15bb4e8ef0 100644 (file)
@@ -1075,7 +1075,9 @@ static int pr_fuid(char *restrict const outbuf, const proc_t *restrict const pp)
 
 // The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition)
 // requires that user and group names print as decimal numbers if there is
-// not enough room in the column, so tough luck if you don't like it.
+// not enough room in the column.  However, we will now truncate such names
+// and provide a visual hint of such truncation.  Hopefully, this will reduce
+// the volume of bug reports regarding that former 'feature'.
 //
 // The UNIX and POSIX way to change column width is to rename it:
 //      ps -o pid,user=CumbersomeUserNames -o comm
@@ -1092,6 +1094,11 @@ static int do_pr_name(char *restrict const outbuf, const char *restrict const na
 
     if(len <= (int)max_rightward)
       return len;  /* returns number of cells */
+
+    len = max_rightward-1;
+    outbuf[len++] = '+';
+    outbuf[len] = 0;
+    return len;
   }
   return snprintf(outbuf, COLWID, "%u", u);
 }
@@ -1108,7 +1115,6 @@ static int pr_fuser(char *restrict const outbuf, const proc_t *restrict const pp
 static int pr_suser(char *restrict const outbuf, const proc_t *restrict const pp){
   return do_pr_name(outbuf, pp->suser, pp->suid);
 }
-
 static int pr_egroup(char *restrict const outbuf, const proc_t *restrict const pp){
   return do_pr_name(outbuf, pp->egroup, pp->egid);
 }