# /* * 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[NPROC]; struct tty tty; struct user u; int lflg; int kflg; int xflg; int tflg; int aflg; int mem; int swap; int stbuf[257]; int ndev; char devc[65]; int devl[65]; int devt[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; }; int obuf[259]; main(argc, argv) char **argv; { struct proc *p; int n, b; int i, c, mtty; char *ap; int uid, puid; obuf[0] = 1; 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"); setup(&nl[1], "_swapdev"); nlist(argc>2? argv[2]:"/unix", nl); if (nl[0].type==0) { printf("No namelist\n"); return; } coref = "/dev/mem"; if(kflg) coref = "/usr/sys/core"; if ((mem = open(coref, 0)) < 0) { printf("No mem\n"); done(); } seek(mem, nl[1].value, 0); read(mem, &nl[1].value, 2); seek(mem, nl[0].value, 0); read(mem, proc, sizeof proc); getdev(); mtty = ttyn(0); uid = getuid() & 0377; if(lflg) printf("TTY F S UID PID PRI ADDR SZ WCHAN COMMAND\n"); else printf("TTY PID COMMAND\n"); for (i=0; i>3); if (proc[i].p_wchan) printf("%7o", proc[i].p_wchan); else printf(" "); } if (proc[i].p_stat==5) printf(" "); else prcom(i); printf("\n"); } 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"); 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] == nl[1].value) swap = open(p->dir_n, 0); } goto loop; } setup(p, s) char *p, *s; { while (*p++ = *s++); } prcom(i) { int baddr, laddr, mf; register int *ip; register char *cp, *cp1; int c, nbad; baddr = 0; laddr = 0; if (proc[i].p_flag&SLOAD) { laddr = proc[i].p_addr; mf = mem; } else { baddr = proc[i].p_addr; mf = swap; } laddr =+ proc[i].p_size - 8; baddr =+ laddr>>3; laddr = (laddr&07)<<6; seek(mf, baddr, 3); seek(mf, laddr, 1); if (read(mf, stbuf, 512) != 512) return(0); for (ip = &stbuf[256]; ip > &stbuf[0];) { if (*--ip == -1) { cp = ip+1; if (*cp==0) cp++; nbad = 0; for (cp1 = cp; cp1 < &stbuf[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); } done() { fflush(obuf); exit(); } putchar(c) { putc(c, obuf); }