# #include "/usr/sys/param.h" #include "/usr/sys/proc.h" #include "/usr/sys/tty.h" #include "/usr/sys/user.h" #define NDC11 10 #define NKL11 4 #define NDH11 16 struct { char name[8]; int type; char *value; } nl[5]; struct proc proc[1]; struct user u; int lflg; int kflg; int xflg; int tflg; int aflg; int mem; int swap; int stbuf[257]; char *coref; main(argc, argv) char **argv; { struct proc *p; int n, b; int i, c, mtty; char *ap; int hmem; int uid, puid; 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; } } setup(&nl[0], "_proc"); setup(&nl[1], "_dc11"); setup(&nl[2], "_kl11"); setup(&nl[3], "_dh11"); nlist("/unix", nl); if (nl[0].type==0) { printf("No namelist\n"); return; } coref = "/dev/mem"; if(kflg) coref = "/usr/sys/core"; if ((hmem = open(coref, 0)) < 0) { printf("No mem\n"); return; } mem = open(coref, 0); swap = open("/dev/swap", 0); if (swap < 0) printf("No swap\n"); n = &proc[1]; b = &proc; n =- b; seek(hmem, nl[0].value, 0); mtty = ttyn(0); uid = getuid() & 0377; for (i=0; i<NPROC; i++) { read(hmem, proc, n); if (proc[0].p_stat==0) continue; if ((c=ttyc(proc[0].p_ttyp))=='?' && xflg==0) continue; puid = proc[0].p_uid & 0377; if (uid != puid && aflg==0) continue; if (lflg || c!=mtty) printf("%c:", c); else printf(" "); if (lflg) { printf("%3o%4d%5d%5d", proc[0].p_flag<<3|proc[0].p_stat, puid, proc[0].p_pri, proc[0].p_time); } printf("%6d", proc[0].p_pid); if (lflg) { printf("%4d", (proc[0].p_size+7)>>3); if (proc[0].p_wchan) printf("%8o", proc[0].p_wchan); else printf(" "); } if (proc[0].p_stat==5) printf(" <defunct>"); else prcom(); printf("\n"); } } ttyc(p) struct tty *p; { int n; struct { struct tty xdc11[]; }; n = p - nl[1].value->xdc11; if (n>=0 && n<NDC11) { if (n<8) return(n+'0'); return(n+'a'-8); } n = p - nl[2].value->xdc11; if(n>=0 && n<NKL11) return('8'+n); n = p - nl[3].value->xdc11; if(n>=0 && n<NDH11) return('f'+n); return('?'); } setup(p, s) char *p, *s; { while (*p++ = *s++); } prcom() { int baddr, laddr, mf; int *ip; char *cp, *cp1; int c; baddr = 0; laddr = 0; if (proc[0].p_flag&SLOAD) { laddr = proc[0].p_addr; mf = mem; } else { baddr = proc[0].p_addr; mf = swap; } laddr =+ proc[0].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++; for (cp1 = cp; cp1 < &stbuf[256]; cp1++) { c = *cp1; if (c==0) *cp1 = ' '; else if (c < ' ' || c > 0176) *cp1 = '?'; } printf(" %.32s ", cp); return(1); } } return(0); }