/* * ps - process status * examine and print certain things about processes */ #include #include #include #include #include #include #include #include struct nlist nl[] = { { "_proc" }, { "_swapdev" }, { "_swplo" }, { "" }, }; struct proc mproc; struct user u; int chkpid; int retcode=1; int lflg; int vflg; int kflg; int xflg; char *tptr; long lseek(); char *gettty(); char *getptr(); char *strncmp(); int aflg; int mem; int swmem; int swap; daddr_t swplo; int ndev; struct devl { char dname[DIRSIZ]; dev_t dev; } devl[256]; char *coref; main(argc, argv) char **argv; { int i; char *ap; int uid, puid; if (argc>1) { ap = argv[1]; while (*ap) switch (*ap++) { case 'v': vflg++; break; case 'a': aflg++; break; case 't': if(*ap) tptr = ap; aflg++; if (*tptr == '?') xflg++; goto bbreak; case 'x': xflg++; break; case '-': break; case 'l': lflg++; break; case 'k': kflg++; break; default: chkpid = atoi(ap-1); goto bbreak; break; } } bbreak: if(chdir("/dev") < 0) { fprintf(stderr, "Can't change to /dev\n"); exit(1); } nlist(argc>2? argv[2]:"/unix", nl); if (nl[0].n_type==0) { fprintf(stderr, "No namelist\n"); exit(1); } coref = "/dev/mem"; if(kflg) coref = "/usr/sys/core"; if ((mem = open(coref, 0)) < 0) { fprintf(stderr, "No mem\n"); exit(1); } swmem = open(coref, 0); /* * read mem to find swap dev. */ lseek(mem, (long)nl[1].n_value, 0); read(mem, (char *)&nl[1].n_value, sizeof(nl[1].n_value)); /* * Find base of swap */ lseek(mem, (long)nl[2].n_value, 0); read(mem, (char *)&swplo, sizeof(swplo)); /* * Locate proc table */ lseek(mem, (long)nl[0].n_value, 0); getdev(); uid = getuid(); if (lflg) printf(" F S UID PID PPID CPU PRI NICE ADDR SZ WCHAN TTY TIME CMD\n"); else if (chkpid==0) printf(" PID TTY TIME CMD\n"); for (i=0; i register FILE *df; struct stat sbuf; struct direct dbuf; if ((df = fopen("/dev", "r")) == NULL) { fprintf(stderr, "Can't open /dev\n"); exit(1); } ndev = 0; while (fread((char *)&dbuf, sizeof(dbuf), 1, df) == 1) { if(dbuf.d_ino == 0) continue; if(stat(dbuf.d_name, &sbuf) < 0) continue; if ((sbuf.st_mode&S_IFMT) != S_IFCHR) continue; strcpy(devl[ndev].dname, dbuf.d_name); devl[ndev].dev = sbuf.st_rdev; ndev++; } fclose(df); if ((swap = open("/dev/swap", 0)) < 0) { fprintf(stderr, "Can't open /dev/swap\n"); exit(1); } } long round(a, b) long a, b; { long w = ((a+b-1)/b)*b; return(w); } struct map { long b1, e1; long f1; long b2, e2; long f2; }; struct map datmap; int file; prcom(puid) { char abuf[512]; long addr; register int *ip; register char *cp, *cp1; long tm; int c, nbad; register char *tp; long txtsiz, datsiz, stksiz; int septxt; int lw=(lflg?35:80); char **ap; if (mproc.p_flag&SLOAD) { addr = ctob((long)mproc.p_addr); file = swmem; } else { addr = (mproc.p_addr+swplo)<<9; file = swap; } lseek(file, addr, 0); if (read(file, (char *)&u, sizeof(u)) != sizeof(u)) return(0); /* set up address maps for user pcs */ txtsiz = ctob(u.u_tsize); datsiz = ctob(u.u_dsize); stksiz = ctob(u.u_ssize); septxt = u.u_sep; datmap.b1 = (septxt ? 0 : round(txtsiz,TXTRNDSIZ)); datmap.e1 = datmap.b1+datsiz; datmap.f1 = ctob(USIZE)+addr; datmap.b2 = stackbas(stksiz); datmap.e2 = stacktop(stksiz); datmap.f2 = ctob(USIZE)+(datmap.e1-datmap.b1)+addr; tp = gettty(); if (tptr && strncmp(tptr, tp, 2)) return(0); if (lflg) { printf("%2o %c%4d", mproc.p_flag, "0SWRIZT"[mproc.p_stat], puid); } printf("%6u", mproc.p_pid); if (lflg) { printf("%6u%4d%4d%5d%6o%4d", mproc.p_ppid, mproc.p_cpu&0377, mproc.p_pri, mproc.p_nice, mproc.p_addr, (mproc.p_size+7)>>3); if (mproc.p_wchan) printf("%7o", mproc.p_wchan); else printf(" "); } printf(" %-2.2s", tp); if (mproc.p_stat==SZOMB) { printf(" "); return(1); } tm = (u.u_utime + u.u_stime + 30)/60; printf(" %2ld:", tm/60); tm %= 60; printf(tm<10?"0%ld":"%ld", tm); if (vflg && lflg==0) { /* 0 == old tflg (print long times) */ tm = (u.u_cstime + 30)/60; printf(" %2ld:", tm/60); tm %= 60; printf(tm<10?"0%ld":"%ld", tm); tm = (u.u_cutime + 30)/60; printf(" %2ld:", tm/60); tm %= 60; printf(tm<10?"0%ld":"%ld", tm); } if (mproc.p_pid == 0) { printf(" swapper"); return(1); } addr += ctob((long)mproc.p_size) - 512; /* look for sh special */ lseek(file, addr+512-sizeof(char **), 0); if (read(file, (char *)&ap, sizeof(char *)) != sizeof(char *)) return(1); if (ap) { char b[82]; char *bp = b; while((cp=getptr(ap++)) && cp && (bp'~') { if (nbad++>3) break; continue; } *bp++ = c; } *bp++ = ' '; } *bp++ = 0; printf(lflg?" %.30s":" %.60s", b); return(1); } lseek(file, addr, 0); if (read(file, abuf, sizeof(abuf)) != sizeof(abuf)) return(1); for (ip = (int *)&abuf[512]-2; ip > (int *)abuf; ) { if (*--ip == -1 || *ip==0) { cp = (char *)(ip+1); if (*cp==0) cp++; nbad = 0; for (cp1 = cp; cp1 < &abuf[512]; cp1++) { c = *cp1&0177; if (c==0) *cp1 = ' '; else if (c < ' ' || c > 0176) { if (++nbad >= 5) { *cp1++ = ' '; break; } *cp1 = '?'; } else if (c=='=') { *cp1 = 0; while (cp1>cp && *--cp1!=' ') *cp1 = 0; break; } } while (*--cp1==' ') *cp1 = 0; printf(lflg?" %.30s":" %.60s", cp); return(1); } } return(1); } char * gettty() { register i; register char *p; if (u.u_ttyp==0) return("?"); for (i=0; ib1, amap->e1)) { if(within(adr, amap->b2, amap->e2)) { saddr = (unsigned)adr + amap->f2 - amap->b2; } else return(0); } else saddr = (unsigned)adr + amap->f1 - amap->b1; if(lseek(file, saddr, 0)==-1 || read(file, &b, 1)<1) { return(0); } return((unsigned)b); } within(adr,lbd,ubd) char *adr; long lbd, ubd; { return((unsigned)adr>=lbd && (unsigned)adr