- if (u.u_ttyp == 0)
- return("?");
- x = u.u_ttyd & 017;
- for (dp = cand[x]; dp; dp = dp->cand) {
- if (dp->ttyd == -1) {
- if (stat(dp->name, &stb) == 0 &&
- (stb.st_mode&S_IFMT)==S_IFCHR)
- dp->ttyd = stb.st_rdev;
- else
- dp->ttyd = -2;
- }
- if (dp->ttyd == u.u_ttyd)
- goto found;
- }
- /* ick */
- for (dp = allttys; dp < &allttys[nttys]; dp++) {
- if (dp->ttyd == -1) {
- if (stat(dp->name, &stb) == 0 &&
- (stb.st_mode&S_IFMT)==S_IFCHR)
- dp->ttyd = stb.st_rdev;
- else
- dp->ttyd = -2;
- }
- if (dp->ttyd == u.u_ttyd)
- goto found;
- }
- return ("?");
-found:
- p = dp->name;
- if (p[0]=='t' && p[1]=='t' && p[2]=='y')
- p += 3;
- return (p);
-}
-
-save()
-{
- register struct savcom *sp;
- register struct asav *ap;
- register char *cp;
- register struct text *xp;
- char *ttyp, *cmdp;
-
- if (mproc->p_stat != SZOMB && getu() == 0)
- return;
- ttyp = gettty();
- if (xflg == 0 && ttyp[0] == '?' || tptr && strncmp(tptr, ttyp, 2))
- return;
- sp = &savcom[npr];
- cmdp = getcmd();
- if (cmdp == 0)
- return;
- sp->ap = ap = (struct asav *)calloc(1, sizeof (struct asav));
- sp->ap->a_cmdp = cmdp;
-#define e(a,b) ap->a = mproc->b
- e(a_flag, p_flag); e(a_stat, p_stat); e(a_nice, p_nice);
- e(a_uid, p_uid); e(a_pid, p_pid); e(a_pri, p_pri);
- e(a_slptime, p_slptime); e(a_time, p_time);
- ap->a_tty[0] = ttyp[0];
- ap->a_tty[1] = ttyp[1] ? ttyp[1] : ' ';
- if (ap->a_stat == SZOMB) {
- ap->a_cpu = 0;
- } else {
- ap->a_size = mproc->p_dsize + mproc->p_ssize;
- e(a_rss, p_rssize);
- ap->a_ttyd = u.u_ttyd;
- ap->a_cpu = u.u_ru.ru_utime.tv_sec + u.u_ru.ru_stime.tv_sec;
- if (sumcpu)
- ap->a_cpu += u.u_cru.ru_utime.tv_sec + u.u_cru.ru_stime.tv_sec;
- if (mproc->p_textp && text) {
- xp = &text[mproc->p_textp - atext];
- ap->a_tsiz = xp->x_size;
- ap->a_txtrss = xp->x_rssize;
- ap->a_xccount = xp->x_ccount;
- }
- }
-#undef e
- ap->a_maxrss = mproc->p_maxrss;
- if (lflg) {
- register struct lsav *lp;
-
- sp->s_un.lp = lp = (struct lsav *)
- calloc(1, sizeof (struct lsav));
-#define e(a,b) lp->a = mproc->b
- e(l_ppid, p_ppid); e(l_cpu, p_cpu);
- if (ap->a_stat != SZOMB)
- e(l_wchan, p_wchan);
-#undef e
- lp->l_addr = pcbpf;
- } else if (vflg) {
- register struct vsav *vp;
-
- sp->s_un.vp = vp = (struct vsav *)
- calloc(1, sizeof (struct vsav));
-#define e(a,b) vp->a = mproc->b
- if (ap->a_stat != SZOMB) {
- e(v_swrss, p_swrss);
- vp->v_majflt = u.u_ru.ru_majflt;
- if (mproc->p_textp)
- vp->v_txtswrss = xp->x_swrss;
- }
- vp->v_pctcpu = pcpu();
-#undef e
- } else if (uflg)
- sp->s_un.u_pctcpu = pcpu();
- else if (sflg) {
- if (ap->a_stat != SZOMB) {
- for (cp = (char *)u.u_stack;
- cp < &user.upages[UPAGES][0]; )
- if (*cp++)
- break;
- sp->s_un.s_ssiz = (&user.upages[UPAGES][0] - cp);
- }
- }
-
- npr++;
-}
-
-double
-pmem(ap)
- register struct asav *ap;
-{
- double fracmem;
- int szptudot;
-
- if ((ap->a_flag&SLOAD) == 0)
- fracmem = 0.0;
- else {
- szptudot = UPAGES + clrnd(ctopt(ap->a_size+ap->a_tsiz));
- fracmem = ((float)ap->a_rss+szptudot)/CLSIZE/ecmx;
- if (ap->a_xccount)
- fracmem += ((float)ap->a_txtrss)/CLSIZE/
- ap->a_xccount/ecmx;
- }
- return (100.0 * fracmem);
-}
-
-double
-pcpu()
-{
- time_t time;
-
- time = mproc->p_time;
- if (time == 0 || (mproc->p_flag&SLOAD) == 0)
- return (0.0);
- if (rawcpu)
- return (100.0 * mproc->p_pctcpu);
- return (100.0 * mproc->p_pctcpu / (1.0 - exp(time * log(ccpu))));
-}
-
-getu()
-{
- struct pte *pteaddr, apte;
- struct pte arguutl[UPAGES+CLSIZE];
- register int i;
- int ncl, size;
-
- size = sflg ? ctob(UPAGES) : sizeof (struct user);
- if ((mproc->p_flag & SLOAD) == 0) {
- if (swap < 0)
- return (0);
- (void) lseek(swap, (long)dtob(mproc->p_swaddr), 0);
- if (read(swap, (char *)&user.user, size) != size) {
- fprintf(stderr, "ps: cant read u for pid %d from %s\n",
- mproc->p_pid, swapf);
- return (0);
- }
- pcbpf = 0;
- argaddr = 0;
- return (1);
- }
- pteaddr = &Usrptmap[btokmx(mproc->p_p0br) + mproc->p_szpt - 1];
- klseek(kmem, (long)pteaddr, 0);
- if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
- printf("ps: cant read indir pte to get u for pid %d from %s\n",
- mproc->p_pid, kmemf);
- return (0);
- }
- lseek(mem,
- (long)ctob(apte.pg_pfnum+1) - (UPAGES+CLSIZE) * sizeof (struct pte),
- 0);
- if (read(mem, (char *)arguutl, sizeof(arguutl)) != sizeof(arguutl)) {
- printf("ps: cant read page table for u of pid %d from %s\n",
- mproc->p_pid, memf);
- return (0);
- }
- if (arguutl[0].pg_fod == 0 && arguutl[0].pg_pfnum)
- argaddr = ctob(arguutl[0].pg_pfnum);
- else
- argaddr = 0;
- pcbpf = arguutl[CLSIZE].pg_pfnum;
- ncl = (size + NBPG*CLSIZE - 1) / (NBPG*CLSIZE);
- while (--ncl >= 0) {
- i = ncl * CLSIZE;
- lseek(mem, (long)ctob(arguutl[CLSIZE+i].pg_pfnum), 0);
- if (read(mem, user.upages[i], CLSIZE*NBPG) != CLSIZE*NBPG) {
- printf("ps: cant read page %d of u of pid %d from %s\n",
- arguutl[CLSIZE+i].pg_pfnum, mproc->p_pid, memf);
- return(0);
- }
- }
- return (1);
-}
-
-char *
-getcmd()
-{
- char cmdbuf[CLSIZE*NBPG];
- union {
- char argc[CLSIZE*NBPG];
- int argi[CLSIZE*NBPG/sizeof (int)];
- } argspac;
- register char *cp;
- register int *ip;
- char c;
- int nbad;
- struct dblock db;
- char *file;
-
- if (mproc->p_stat == SZOMB || mproc->p_flag&(SSYS|SWEXIT))
- return ("");
- if (cflg) {
- (void) strncpy(cmdbuf, u.u_comm, sizeof (u.u_comm));
- return (savestr(cmdbuf));
- }
- if ((mproc->p_flag & SLOAD) == 0 || argaddr == 0) {
- if (swap < 0)
- goto retucomm;
- vstodb(0, CLSIZE, &u.u_smap, &db, 1);
- (void) lseek(swap, (long)dtob(db.db_base), 0);
- if (read(swap, (char *)&argspac, sizeof(argspac))
- != sizeof(argspac))
- goto bad;
- file = swapf;
- } else {
- lseek(mem, (long)argaddr, 0);
- if (read(mem, (char *)&argspac, sizeof (argspac))
- != sizeof (argspac))
- goto bad;
- file = memf;
- }
- ip = &argspac.argi[CLSIZE*NBPG/sizeof (int)];
- ip -= 2; /* last arg word and .long 0 */
- while (*--ip)
- if (ip == argspac.argi)
- goto retucomm;
- *(char *)ip = ' ';
- ip++;
- nbad = 0;
- for (cp = (char *)ip; cp < &argspac.argc[CLSIZE*NBPG]; cp++) {
- c = *cp & 0177;
- if (c == 0)
- *cp = ' ';
- else if (c < ' ' || c > 0176) {
- if (++nbad >= 5*(eflg+1)) {
- *cp++ = ' ';
- break;
- }
- *cp = '?';
- } else if (eflg == 0 && c == '=') {
- while (*--cp != ' ')
- if (cp <= (char *)ip)
- break;
- break;
- }
- }
- *cp = 0;
- while (*--cp == ' ')
- *cp = 0;
- cp = (char *)ip;
- (void) strncpy(cmdbuf, cp, &argspac.argc[CLSIZE*NBPG] - cp);
- if (cp[0] == '-' || cp[0] == '?' || cp[0] <= ' ') {
- (void) strcat(cmdbuf, " (");
- (void) strncat(cmdbuf, u.u_comm, sizeof(u.u_comm));
- (void) strcat(cmdbuf, ")");
- }
- return (savestr(cmdbuf));
-
-bad:
- fprintf(stderr, "ps: error locating command name for pid %d from %s\n",
- mproc->p_pid, file);
-retucomm:
- (void) strcpy(cmdbuf, " (");
- (void) strncat(cmdbuf, u.u_comm, sizeof (u.u_comm));
- (void) strcat(cmdbuf, ")");
- return (savestr(cmdbuf));
-}
-
-char *lhdr =
-" F UID PID PPID CP PRI NI ADDR SZ RSS WCHAN STAT TT TIME";
-lpr(sp)
- struct savcom *sp;
-{
- register struct asav *ap = sp->ap;
- register struct lsav *lp = sp->s_un.lp;
-
- printf("%7x%4d%6u%6u%3d%4d%3d%5x%4d%5d",
- ap->a_flag, ap->a_uid,
- ap->a_pid, lp->l_ppid, lp->l_cpu&0377, ap->a_pri-PZERO,
- ap->a_nice-NZERO, lp->l_addr, pgtok(ap->a_size), pgtok(ap->a_rss));
- printf(lp->l_wchan ? " %6x" : " ", (int)lp->l_wchan&0xffffff);
- printf(" %4.4s ", state(ap));
- ptty(ap->a_tty);
- ptime(ap);
-}
-
-ptty(tp)
- char *tp;
-{
-
- printf("%-2.2s", tp);
-}
-
-ptime(ap)
- struct asav *ap;
-{
-
- printf("%3ld:%02ld", ap->a_cpu / 60, ap->a_cpu % 60);
-}
-
-char *uhdr =
-"USER PID %CPU %MEM SZ RSS TT STAT TIME";
-upr(sp)
- struct savcom *sp;
-{
- register struct asav *ap = sp->ap;
- int vmsize, rmsize;
-
- vmsize = pgtok((ap->a_size + ap->a_tsiz));
- rmsize = pgtok(ap->a_rss);
- if (ap->a_xccount)
- rmsize += pgtok(ap->a_txtrss/ap->a_xccount);
- printf("%-8.8s %5d%5.1f%5.1f%5d%5d",
- getname(ap->a_uid), ap->a_pid, sp->s_un.u_pctcpu, pmem(ap),
- vmsize, rmsize);
- putchar(' ');
- ptty(ap->a_tty);
- printf(" %4.4s", state(ap));
- ptime(ap);
-}
-
-char *vhdr =
-" SIZE PID TT STAT TIME SL RE PAGEIN SIZE RSS LIM TSIZ TRS %CPU %MEM"+5;
-vpr(sp)
- struct savcom *sp;
-{
- register struct vsav *vp = sp->s_un.vp;
- register struct asav *ap = sp->ap;
-
- printf("%5u ", ap->a_pid);
- ptty(ap->a_tty);
- printf(" %4.4s", state(ap));
- ptime(ap);
- printf("%3d%3d%7d%5d%5d",
- ap->a_slptime > 99 ? 99 : ap-> a_slptime,
- ap->a_time > 99 ? 99 : ap->a_time, vp->v_majflt,
- pgtok(ap->a_size), pgtok(ap->a_rss));
- if (ap->a_maxrss == (RLIM_INFINITY/NBPG))
- printf(" xx");
- else
- printf("%5d", pgtok(ap->a_maxrss));
- printf("%5d%4d%5.1f%5.1f",
- pgtok(ap->a_tsiz), pgtok(ap->a_txtrss), vp->v_pctcpu, pmem(ap));
-}
-
-char *shdr =
-"SSIZ PID TT STAT TIME";
-spr(sp)
- struct savcom *sp;
-{
- register struct asav *ap = sp->ap;
-
- if (sflg)
- printf("%4d ", sp->s_un.s_ssiz);
- printf("%5u", ap->a_pid);
- putchar(' ');
- ptty(ap->a_tty);
- printf(" %4.4s", state(ap));
- ptime(ap);
-}
-
-char *
-state(ap)
- register struct asav *ap;
-{
- char stat, load, nice, anom;
- static char res[5];
-
- switch (ap->a_stat) {
-
- case SSTOP:
- stat = 'T';
- break;
-
- case SSLEEP:
- if (ap->a_pri >= PZERO)
- if (ap->a_slptime >= MAXSLP)
- stat = 'I';
- else
- stat = 'S';
- else if (ap->a_flag & SPAGE)
- stat = 'P';
- else
- stat = 'D';
- break;
-
- case SWAIT:
- case SRUN:
- case SIDL:
- stat = 'R';
- break;
-
- case SZOMB:
- stat = 'Z';
- break;
-
- default:
- stat = '?';
- }
- load = ap->a_flag & SLOAD ? (ap->a_rss>ap->a_maxrss ? '>' : ' ') : 'W';
- if (ap->a_nice < NZERO)
- nice = '<';
- else if (ap->a_nice > NZERO)
- nice = 'N';
- else
- nice = ' ';
- anom = (ap->a_flag&SUANOM) ? 'A' : ((ap->a_flag&SSEQL) ? 'S' : ' ');
- res[0] = stat; res[1] = load; res[2] = nice; res[3] = anom;
- return (res);
-}
-
-/*
- * Given a base/size pair in virtual swap area,
- * return a physical base/size pair which is the
- * (largest) initial, physically contiguous block.
- */
-vstodb(vsbase, vssize, dmp, dbp, rev)
- register int vsbase;
- int vssize;
- struct dmap *dmp;
- register struct dblock *dbp;
-{
- register int blk = dmmin;
- register swblk_t *ip = dmp->dm_map;
-
- vsbase = ctod(vsbase);
- vssize = ctod(vssize);
- if (vsbase < 0 || vsbase + vssize > dmp->dm_size)
- panic("vstodb");
- while (vsbase >= blk) {
- vsbase -= blk;
- if (blk < dmmax)
- blk *= 2;
- ip++;