svn commit: r189078 - head/bin/ps
Attilio Rao
attilio at FreeBSD.org
Thu Feb 26 10:01:09 PST 2009
Author: attilio
Date: Thu Feb 26 18:01:07 2009
New Revision: 189078
URL: http://svn.freebsd.org/changeset/base/189078
Log:
[1] When showing threads, the thread name just appears if the comm
label is choosen as last printout (ucomm suffers of this such bug
too). That bug is caused by the fact that the fixed size of
printout doesn't leave enough space for them to be printed out.
Implement ucomm and comm commands with a dynamic size lenght for
buffers.
[2] On AMD64 architecture pointers don't have enough chars space to
be shown (8 chars while they need 16). Fix them by providing
a variadic space so that it fits well on both 64 and 32 bits
architectures.
[3] Check a return value of malloc() that wasn't checked before.
PR: bin/128841, bin/128842
Reviewed by: jhb, emaste
Sponsored by: Sandvine Incorporated
Modified:
head/bin/ps/extern.h
head/bin/ps/keyword.c
head/bin/ps/print.c
Modified: head/bin/ps/extern.h
==============================================================================
--- head/bin/ps/extern.h Thu Feb 26 17:46:54 2009 (r189077)
+++ head/bin/ps/extern.h Thu Feb 26 18:01:07 2009 (r189078)
@@ -71,6 +71,7 @@ void priorityr(KINFO *, VARENT *);
void rgroupname(KINFO *, VARENT *);
void runame(KINFO *, VARENT *);
void rvar(KINFO *, VARENT *);
+int s_comm(KINFO *);
int s_label(KINFO *);
int s_rgroupname(KINFO *);
int s_runame(KINFO *);
Modified: head/bin/ps/keyword.c
==============================================================================
--- head/bin/ps/keyword.c Thu Feb 26 17:46:54 2009 (r189077)
+++ head/bin/ps/keyword.c Thu Feb 26 18:01:07 2009 (r189078)
@@ -79,8 +79,8 @@ static VAR var[] = {
CHAR, NULL, 0},
{"blocked", "", "sigmask", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
{"caught", "", "sigcatch", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
- {"comm", "COMMAND", NULL, LJUST, ucomm, NULL, MAXCOMLEN, 0, CHAR,
- NULL, 0},
+ {"comm", "COMMAND", NULL, LJUST|DSIZ, ucomm, s_comm,
+ COMMLEN + OCOMMLEN + 1, 0, CHAR, NULL, 0},
{"command", "COMMAND", NULL, COMM|LJUST|USER, command, NULL, 16, 0,
CHAR, NULL, 0},
{"cpu", "CPU", NULL, 0, kvar, NULL, 3, KOFF(ki_estcpu), UINT, "d",
@@ -135,12 +135,13 @@ static VAR var[] = {
LONG, "ld", 0},
{"nvcsw", "NVCSW", NULL, USER, rvar, NULL, 5, ROFF(ru_nvcsw),
LONG, "ld", 0},
- {"nwchan", "NWCHAN", NULL, LJUST, nwchan, NULL, 8, 0, CHAR, NULL, 0},
+ {"nwchan", "NWCHAN", NULL, LJUST, nwchan, NULL, sizeof(void *) * 2, 0,
+ CHAR, NULL, 0},
{"oublk", "OUBLK", NULL, USER, rvar, NULL, 4, ROFF(ru_oublock),
LONG, "ld", 0},
{"oublock", "", "oublk", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
- {"paddr", "PADDR", NULL, 0, kvar, NULL, 8, KOFF(ki_paddr), KPTR,
- "lx", 0},
+ {"paddr", "PADDR", NULL, 0, kvar, NULL, sizeof(void *) * 2,
+ KOFF(ki_paddr), KPTR, "lx", 0},
{"pagein", "PAGEIN", NULL, USER, pagein, NULL, 6, 0, CHAR, NULL, 0},
{"pcpu", "", "%cpu", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
{"pending", "", "sig", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
@@ -195,13 +196,13 @@ static VAR var[] = {
{"tsiz", "TSIZ", NULL, 0, kvar, NULL, 4, KOFF(ki_tsize), PGTOK, "ld", 0},
{"tt", "TT ", NULL, 0, tname, NULL, 4, 0, CHAR, NULL, 0},
{"tty", "TTY", NULL, LJUST, longtname, NULL, 8, 0, CHAR, NULL, 0},
- {"ucomm", "UCOMM", NULL, LJUST, ucomm, NULL, MAXCOMLEN, 0, CHAR, NULL,
- 0},
+ {"ucomm", "UCOMM", NULL, LJUST|DSIZ, ucomm, s_comm,
+ COMMLEN + OCOMMLEN + 1, 0, CHAR, NULL, 0},
{"uid", "UID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_uid), UINT,
UIDFMT, 0},
{"upr", "UPR", NULL, 0, upr, NULL, 3, 0, CHAR, NULL, 0},
- {"uprocp", "UPROCP", NULL, 0, kvar, NULL, 8, KOFF(ki_paddr), KPTR,
- "lx", 0},
+ {"uprocp", "UPROCP", NULL, 0, kvar, NULL, sizeof(void *) * 2,
+ KOFF(ki_paddr), KPTR, "lx", 0},
{"user", "USER", NULL, LJUST|DSIZ, uname, s_uname, USERLEN, 0, CHAR,
NULL, 0},
{"usrpri", "", "upr", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
@@ -325,6 +326,8 @@ findvar(char *p, int user, char **header
*/
rflen = strlen(v->alias) + strlen(hp) + 2;
realfmt = malloc(rflen);
+ if (realfmt == NULL)
+ errx(1, "malloc failed");
snprintf(realfmt, rflen, "%s=%s", v->alias, hp);
parsefmt(realfmt, user);
}
Modified: head/bin/ps/print.c
==============================================================================
--- head/bin/ps/print.c Thu Feb 26 17:46:54 2009 (r189077)
+++ head/bin/ps/print.c Thu Feb 26 18:01:07 2009 (r189078)
@@ -177,6 +177,7 @@ command(KINFO *k, VARENT *ve)
void
ucomm(KINFO *k, VARENT *ve)
{
+ char tmpbuff[COMMLEN + OCOMMLEN + 2];
VAR *v;
v = ve->var;
@@ -184,8 +185,15 @@ ucomm(KINFO *k, VARENT *ve)
(void)printf("%s", k->ki_p->ki_comm);
if (showthreads && k->ki_p->ki_numthreads > 1)
printf("/%s", k->ki_p->ki_ocomm);
- } else
- (void)printf("%-*s", v->width, k->ki_p->ki_comm);
+ } else {
+ bzero(tmpbuff, sizeof(tmpbuff));
+ if (showthreads && k->ki_p->ki_numthreads > 1)
+ sprintf(tmpbuff, "%s/%s", k->ki_p->ki_comm,
+ k->ki_p->ki_ocomm);
+ else
+ sprintf(tmpbuff, "%s", k->ki_p->ki_comm);
+ (void)printf("%-*s", v->width, tmpbuff);
+ }
}
void
@@ -821,6 +829,20 @@ out:
}
int
+s_comm(KINFO *k)
+{
+ char tmpbuff[COMMLEN + OCOMMLEN + 2];
+
+ bzero(tmpbuff, sizeof(tmpbuff));
+ if (showthreads && k->ki_p->ki_numthreads > 1)
+ sprintf(tmpbuff, "%s/%s", k->ki_p->ki_comm,
+ k->ki_p->ki_ocomm);
+ else
+ sprintf(tmpbuff, "%s", k->ki_p->ki_comm);
+ return (strlen(tmpbuff));
+}
+
+int
s_label(KINFO *k)
{
char *string = NULL;
More information about the svn-src-all
mailing list