Module Name: src Committed By: christos Date: Wed May 12 22:09:36 UTC 2010
Modified Files: src/external/bsd/top/dist/machine: m_netbsd.c Log Message: implement fullcmd mode. Now we need to modernize the machine specific code to handle displays > 80 columns to make this work effectively. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/external/bsd/top/dist/machine/m_netbsd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/top/dist/machine/m_netbsd.c diff -u src/external/bsd/top/dist/machine/m_netbsd.c:1.11 src/external/bsd/top/dist/machine/m_netbsd.c:1.12 --- src/external/bsd/top/dist/machine/m_netbsd.c:1.11 Wed Oct 21 17:11:57 2009 +++ src/external/bsd/top/dist/machine/m_netbsd.c Wed May 12 18:09:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: m_netbsd.c,v 1.11 2009/10/21 21:11:57 rmind Exp $ */ +/* $NetBSD: m_netbsd.c,v 1.12 2010/05/12 22:09:36 christos Exp $ */ /* * top - a top users display for Unix @@ -37,12 +37,12 @@ * Andrew Doran <a...@netbsd.org> * * - * $Id: m_netbsd.c,v 1.11 2009/10/21 21:11:57 rmind Exp $ + * $Id: m_netbsd.c,v 1.12 2010/05/12 22:09:36 christos Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: m_netbsd.c,v 1.11 2009/10/21 21:11:57 rmind Exp $"); +__RCSID("$NetBSD: m_netbsd.c,v 1.12 2010/05/12 22:09:36 christos Exp $"); #endif #include <sys/param.h> @@ -70,14 +70,15 @@ #include "loadavg.h" #include "username.h" -static void percentages64 __P((int, int *, u_int64_t *, u_int64_t *, - u_int64_t *)); -static int get_cpunum __P((u_int64_t)); +static void percentages64(int, int *, u_int64_t *, u_int64_t *, + u_int64_t *); +static int get_cpunum(u_int64_t); /* get_process_info passes back a handle. This is what it looks like: */ struct handle { + struct process_select *sel; struct kinfo_proc2 **next_proc; /* points to next valid proc pointer */ int remaining; /* number of pointers remaining */ }; @@ -188,17 +189,17 @@ }; /* forward definitions for comparison functions */ -static int compare_cpu __P((struct proc **, struct proc **)); -static int compare_prio __P((struct proc **, struct proc **)); -static int compare_res __P((struct proc **, struct proc **)); -static int compare_size __P((struct proc **, struct proc **)); -static int compare_state __P((struct proc **, struct proc **)); -static int compare_time __P((struct proc **, struct proc **)); -static int compare_pid __P((struct proc **, struct proc **)); -static int compare_command __P((struct proc **, struct proc **)); -static int compare_username __P((struct proc **, struct proc **)); +static int compare_cpu(struct proc **, struct proc **); +static int compare_prio(struct proc **, struct proc **); +static int compare_res(struct proc **, struct proc **); +static int compare_size(struct proc **, struct proc **); +static int compare_state(struct proc **, struct proc **); +static int compare_time(struct proc **, struct proc **); +static int compare_pid(struct proc **, struct proc **); +static int compare_command(struct proc **, struct proc **); +static int compare_username(struct proc **, struct proc **); -int (*proc_compares[]) __P((struct proc **, struct proc **)) = { +int (*proc_compares[])(struct proc **, struct proc **) = { compare_cpu, compare_prio, compare_res, @@ -248,6 +249,57 @@ #define pagetok(size) ((size) << pageshift) +/* + * Print swapped processes as <pname> and + * system processes as [pname] + */ +static const char * +get_pretty(const struct kinfo_proc2 *pp) +{ + if ((pp->p_flag & P_SYSTEM) != 0) + return "[]"; + if ((pp->p_flag & P_INMEM) == 0) + return "<>"; + return ""; +} + +static const char * +get_command(const struct process_select *sel, struct kinfo_proc2 *pp) +{ + static char cmdbuf[128]; + const char *pretty; + char **argv; + if (pp == NULL) + return "<gone>"; + pretty = get_pretty(pp); + + if (sel->fullcmd == 0 || kd == NULL || (argv = kvm_getargv2(kd, pp, + sizeof(cmdbuf))) == NULL) { + if (pretty[0] != '\0' && pp->p_comm[0] != pretty[0]) + snprintf(cmdbuf, sizeof(cmdbuf), "%c%s%c", pretty[0], + printable(pp->p_comm), pretty[1]); + else + strlcpy(cmdbuf, printable(pp->p_comm), sizeof(cmdbuf)); + } else { + char *d = cmdbuf; + if (pretty[0] != '\0' && argv[0][0] != pretty[0]) + *d++ = pretty[0]; + while (*argv) { + const char *s = printable(*argv++); + while (d < cmdbuf + sizeof(cmdbuf) - 2 && + (*d++ = *s++) != '\0') + continue; + if (d > cmdbuf && d < cmdbuf + sizeof(cmdbuf) - 2 && + d[-1] == '\0') + d[-1] = ' '; + } + if (pretty[0] != '\0' && pretty[0] == cmdbuf[0]) + *d++ = pretty[1]; + *d++ = '\0'; + } + return cmdbuf; +} + static int get_cpunum(id) u_int64_t id; @@ -364,6 +416,7 @@ statics->swap_names = swapnames; statics->order_names = ordernames; statics->flags.threads = 1; + statics->flags.fullcmds = 1; mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; @@ -637,6 +690,7 @@ /* pass back a handle */ handle.next_proc = pref; handle.remaining = active_procs; + handle.sel = sel; return((caddr_t)&handle); } @@ -750,6 +804,7 @@ /* pass back a handle */ handle.next_proc = (struct kinfo_proc2 **)lref; handle.remaining = active_lwps; + handle.sel = sel; return((caddr_t)&handle); } @@ -778,7 +833,6 @@ #endif char wmesg[KI_WMESGLEN + 1]; static char fmt[MAX_COLS]; /* static area where result is built */ - const char *pretty = ""; /* find and remember the next proc structure */ hp = (struct handle *)handle; @@ -786,24 +840,6 @@ hp->remaining--; /* get the process's user struct and set cputime */ - if ((pp->p_flag & P_SYSTEM) != 0) - pretty = "[]"; - - if (pretty[0] != '\0') { - /* - * Print swapped processes as <pname> and - * system processes as [pname] - */ - char *comm = pp->p_comm; -#define COMSIZ sizeof(pp->p_comm) - char buf[COMSIZ]; - (void) strncpy(buf, comm, COMSIZ); - comm[0] = pretty[0]; - (void) strncpy(&comm[1], buf, COMSIZ - 2); - comm[COMSIZ - 2] = '\0'; - (void) strncat(comm, &pretty[1], COMSIZ - 1); - comm[COMSIZ - 1] = '\0'; - } #if 0 /* This does not produce the correct results */ @@ -852,7 +888,7 @@ format_time(cputime), (wcpu >= 100.0) ? 0 : 2, wcpu, (cpu >= 100.0) ? 0 : 2, cpu, - printable(pp->p_comm)); + get_command(hp->sel, pp)); /* return the result */ return(fmt); @@ -867,14 +903,11 @@ double pct; struct handle *hp; const char *statep; - static char gone[] = "<gone>"; #ifdef KI_NOCPU char state[10]; #endif char wmesg[KI_WMESGLEN + 1]; static char fmt[MAX_COLS]; /* static area where result is built */ - const char *pretty = ""; - char *comm; int uid; /* find and remember the next proc structure */ @@ -884,30 +917,7 @@ pp = proc_from_thread(pl); /* get the process's user struct and set cputime */ - if (pp) { - comm = pp->p_comm; - if ((pp->p_flag & P_SYSTEM) != 0) - pretty = "[]"; - - if (pretty[0] != '\0' && comm[0] != pretty[0]) { - /* - * Print swapped processes as <pname> and - * system processes as [pname] - */ -#define COMSIZ sizeof(pp->p_comm) - char buf[COMSIZ]; - (void) strncpy(buf, comm, COMSIZ); - comm[0] = pretty[0]; - (void) strncpy(&comm[1], buf, COMSIZ - 2); - comm[COMSIZ - 2] = '\0'; - (void) strncat(comm, &pretty[1], COMSIZ - 1); - comm[COMSIZ - 1] = '\0'; - } - uid = pp->p_ruid; - } else { - comm = gone; - uid = 0; - } + uid = pp ? pp->p_ruid : 0; cputime = pl->l_rtime_sec; @@ -952,7 +962,7 @@ format_time(cputime), 100.0 * weighted_cpu(l_, pct, pl), 100.0 * pct, - printable(comm), + get_command(hp->sel, pp), printable(pl->l_name)); /* return the result */