# /* * ps - process status * examine and print certain things about processes */ #include "/usr/sys/param.h" #include "/usr/sys/proc.h" #include "/usr/sys/tty.h" #include "/usr/sys/user.h" struct { char name[8]; int type; char *value; } nl[3]; struct proc proc[1]; int ua[256]; int lflg; int kflg; int xflg; int tflg; int aflg; int mem; int swmem; int swap; int swapdev; int ndev; char devc[65]; int devl[65]; char *coref; struct ibuf { char idevmin, idevmaj; int inum; int iflags; char inl; char iuid; char igid; char isize0; int isize; int iaddr[8]; char *ictime[2]; char *imtime[2]; int fill; }; main(argc, argv) char **argv; { struct proc *p; int n, b; int i, c; char *ap; int uid, puid; extern fout; if (argc>1) { ap = argv[1]; while (*ap) switch (*ap++) { case 'a': aflg++; break; case 't': tflg++; break; case 'x': xflg++; break; case 'l': lflg++; break; case 'k': kflg++; break; } } if(chdir("/dev") < 0) { printf("cannot change to /dev\n"); done(); } setup(&nl[0], "_proc"); nlist(argc>2? argv[2]:"/mx", nl); if (nl[0].type==0) { printf("No namelist\n"); done(); } coref = "/dev/mem"; if(kflg) coref = "/usr/sys/kore"; if ((mem = open(coref, 0)) < 0) { printf("No mem\n"); done(); } swmem = open(coref, 0); /* * read mem to find swap dev. */ swapdev = SWAPDEV; /* * Locate proc table */ seek(mem, nl[0].value, 0); getdev(); uid = getuid() & 0377; fout = dup(1); if(lflg) printf("F S UID PID CPU PRI ADDR SZ WCHAN TTY TIME COMMAND\n"); else printf(" PID TTY TIME COMMAND\n"); for (i=0; i<NPROC; i++) { read(mem, proc, sizeof proc); if (proc[0].p_stat==0) continue; if (proc[0].p_pgrp==0 && xflg==0) continue; puid = proc[0].p_uid & 0377; if (uid != puid && aflg==0) continue; if (lflg) { printf("%2o %c%4d", proc[0].p_flag, "0SWRIZT"[proc[0].p_stat], puid); } printf("%6l", proc[0].p_pid); if (lflg) { printf("%4d%4d%6o%4d", proc[0].p_cpu&0377, proc[0].p_pri, proc[0].p_pid*SWPSIZ + SWPLO, proc[0].p_size); if (proc[0].p_wchan) printf("%7o", proc[0].p_wchan); else printf(" "); } prcom(proc[0].p_stat); printf("\n"); flush(); } done(); } getdev() { register struct { int dir_ino; char dir_n[14]; } *p; register i, c; int f; char dbuf[512]; int sbuf[20]; f = open("/dev", 0); if(f < 0) { printf("cannot open /dev\n"); done(); } swap = -1; c = 0; loop: i = read(f, dbuf, 512); if(i <= 0) { close(f); if(swap < 0) { printf("no swap device\n"); done(); } ndev = c; return; } while(i < 512) dbuf[i++] = 0; for(p = dbuf; p < dbuf+512; p++) { if(p->dir_ino == 0) continue; if(p->dir_n[0] == 't' && p->dir_n[1] == 't' && p->dir_n[2] == 'y' && p->dir_n[4] == 0 && p->dir_n[3] != 0) { if(stat(p->dir_n, sbuf) < 0) continue; devc[c] = p->dir_n[3]; devl[c] = sbuf->iaddr[0]; c++; continue; } if(swap >= 0) continue; if(stat(p->dir_n, sbuf) < 0) continue; if((sbuf->iflags & 060000) != 060000) continue; if(sbuf->iaddr[0] == swapdev) swap = open(p->dir_n, 0); } goto loop; } setup(p, s) char *p, *s; { while (*p++ = *s++); } prcom(stat) { int baddr, laddr, mf; register int *ip; register char *cp, *cp1; int c, nbad; baddr = 0; laddr = 0; if (proc[0].p_flag&SLOAD) { laddr = (TOPSYS>>6) - 16; mf = swmem; } else { baddr = proc[0].p_pid*SWPSIZ + SWPLO; mf = swap; } baddr =+ laddr>>3; laddr = (laddr&07)<<6; seek(mf, baddr, 3); seek(mf, laddr, 1); if (read(mf, &ua[0], 512) != 512) return(0); printf(" %c", gettty()); if (stat==5) { printf(" <defunct>"); return; } c = ((ua[0].u_utime>>1)&077777); c =+ ((ua[0].u_stime>>1)&077777); c = ldiv(0, c, 30); printf(" %2d:", c/60); c =% 60; printf(c<10?"0%d":"%d", c); if (proc[0].p_flag&SLOAD) c = (SWPSIZ<<3) - 8; else c = proc[0].p_size - 8; laddr =+ (c&07)<<6; baddr =+ c>>3; seek(mf, baddr, 3); seek(mf, laddr, 1); if (read(mf, ua, 512) != 512) return(0); for (ip = &ua[256]; ip > &ua[0];) { if (*--ip == -1) { cp = ip+1; if (*cp==0) cp++; nbad = 0; for (cp1 = cp; cp1 < &ua[256]; cp1++) { c = *cp1; if (c==0) *cp1 = ' '; else if (c < ' ' || c > 0176) { if (++nbad >= 5) { *cp1++ = ' '; break; } *cp1 = '?'; } } while (*--cp1==' ') *cp1 = 0; printf(lflg?" %.16s":" %.64s", cp); return(1); } } return(0); } gettty() { register i; if (ua[0].u_ttyp==0) return('?'); for (i=0; i<ndev; i++) if (devl[i] == ua[0].u_ttyd) return(devc[i]); return('?'); } done() { flush(); exit(); }