- int ncl, size;
-
- size = sflg ? ctob(UPAGES) : sizeof (struct user);
- if ((mproc->p_flag & SLOAD) == 0) {
- lseek(swap, ctob(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 = &Usrptma[btokmx(mproc->p_p0br) + mproc->p_szpt - 1];
- lseek(kmem, kflg ? clear(pteaddr) : (int)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, swapf);
- return (0);
- }
- lseek(mem,
- 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, swapf);
- 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, 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[BUFSIZ];
- int pad1; /* avoid hardware botch */
- union {
- char argc[CLSIZE*NBPG];
- int argi[CLSIZE*NBPG/sizeof (int)];
- } argspac;
- int pad2; /* avoid hardware botch */
- register char *cp;
- register int *ip;
- char c;
- int nbad;
- struct dblock db;
-
- if (mproc->p_stat == SZOMB || mproc->p_flag&(SSYS|SWEXIT))
- return ("");
- if (cflg) {
- strncpy(cmdbuf, u.u_comm, sizeof (u.u_comm));
- return (savestr(cmdbuf));
- }
- if ((mproc->p_flag & SLOAD) == 0 || argaddr == 0) {
- vstodb(0, CLSIZE, &u.u_smap, &db, 1);
- lseek(swap, ctob(db.db_base), 0);
- if (read(swap, (char *)&argspac, sizeof(argspac))
- != sizeof(argspac))
- goto bad;
- } else {
- lseek(mem, argaddr, 0);
- if (read(mem, (char *)&argspac, sizeof (argspac))
- != sizeof (argspac))
- goto bad;
- }
- 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;
- strncpy(cmdbuf, cp, &argspac.argc[CLSIZE*NBPG] - cp);
- if (cp[0] == '-' || cp[0] == '?' || cp[0] <= ' ') {
- strcat(cmdbuf, " (");
- strncat(cmdbuf, u.u_comm, sizeof(u.u_comm));
- strcat(cmdbuf, ")");
- }
-/*
- if (xflg == 0 && gflg == 0 && tptr == 0 && cp[0] == '-')
- return (0);
-*/
- return (savestr(cmdbuf));
-
-bad:
- fprintf(stderr, "ps: error locating command name for pid %d\n",
- mproc->p_pid);
-retucomm:
- strcpy(cmdbuf, " (");
- strncat(cmdbuf, u.u_comm, sizeof (u.u_comm));
- 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->sun.lp;
-
- printf("%6x%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, ap->a_size/2, ap->a_rss/2);
- printf(lp->l_wchan ? " %5x" : " ", (int)lp->l_wchan&0xfffff);
- printf(" %4.4s ", state(ap));
- ptty(ap->a_tty);
- ptime(ap);
-}
-
-ptty(tp)
- char *tp;
-{
-
- printf("%-2.2s", tp);
-}
-
-ptime(ap)
- struct asav *ap;
-{