- openfiles(argc, argv);
- getkvars(argc, argv);
- if (chdir("/dev") < 0) {
- perror("/dev");
- exit(1);
- }
- getdev();
- uid = getuid();
- printhdr();
- procp = getw(nl[X_PROC].n_value);
- nproc = getw(nl[X_NPROC].n_value);
- savcom = (struct savcom *)calloc(nproc, sizeof (*savcom));
- for (i=0; i<nproc; i += 8) {
- klseek(kmem, (long)procp, 0);
- j = nproc - i;
- if (j > 8)
- j = 8;
- j *= sizeof (struct proc);
- if (read(kmem, (char *)proc, j) != j) {
- cantread("proc table", kmemf);
- exit(1);
- }
- procp += j;
- for (j = j / sizeof (struct proc) - 1; j >= 0; j--) {
- mproc = &proc[j];
- if (mproc->p_stat == 0 ||
- mproc->p_pgrp == 0 && xflg == 0)
- continue;
- if (tptr == 0 && gflg == 0 && xflg == 0 &&
- mproc->p_ppid == 1)
- continue;
- if (uid != mproc->p_uid && aflg==0 ||
- chkpid != 0 && chkpid != mproc->p_pid)
- continue;
- if (vflg && gflg == 0 && xflg == 0) {
- if (mproc->p_stat == SZOMB ||
- mproc->p_flag&SWEXIT)
- continue;
- if (mproc->p_slptime > MAXSLP &&
- (mproc->p_stat == SSLEEP ||
- mproc->p_stat == SSTOP))
- continue;
- }
- save();
- }
- }
- qsort(savcom, npr, sizeof(savcom[0]), pscomp);
- if (ssflg) {
- walk(npr);
- exit (npr == 0);
- }
- for (i=0; i<npr; i++) {
- register struct savcom *sp = &savcom[i];
- if (lflg)
- lpr(sp);
- else if (vflg)
- vpr(sp);
- else if (uflg)
- upr(sp);
- else
- spr(sp);
- if (sp->ap->a_flag & SWEXIT)
- printf(" <exiting>");
- else if (sp->ap->a_stat == SZOMB)
- printf(" <defunct>");
- else if (sp->ap->a_pid == 0)
- printf(" swapper");
- else if (sp->ap->a_pid == 2)
- printf(" pagedaemon");
- else if (sp->ap->a_pid == 3 && sp->ap->a_flag & SSYS)
- printf(" ip input");
- else
- printf(" %.*s", twidth - cmdstart - 2, sp->ap->a_cmdp);
- printf("\n");
- }
- exit(npr == 0);
-}
-
-getw(loc)
- unsigned long loc;
-{
- long word;
-
- klseek(kmem, (long)loc, 0);
- if (read(kmem, (char *)&word, sizeof (word)) != sizeof (word))
- printf("error reading kmem at %x\n", loc);
- return (word);
-}
-
-klseek(fd, loc, off)
- int fd;
- long loc;
- int off;
-{
-
- if (kflg)
- loc &= 0x7fffffff;
- (void) lseek(fd, (long)loc, off);
-}
-
-openfiles(argc, argv)
- char **argv;
-{
-
- kmemf = "/dev/kmem";
- if (kflg)
- kmemf = argc > 2 ? argv[2] : "/vmcore";
- kmem = open(kmemf, 0);
- if (kmem < 0) {
- perror(kmemf);
- exit(1);
- }
- if (kflg) {
- mem = kmem;
- memf = kmemf;
- } else {
- memf = "/dev/mem";
- mem = open(memf, 0);
- if (mem < 0) {
- perror(memf);
- exit(1);
- }
- }
- if (kflg == 0 || argc > 3) {
- swapf = argc>3 ? argv[3]: "/dev/drum";
- swap = open(swapf, 0);
- if (swap < 0) {
- perror(swapf);
- exit(1);
- }
- }
-}
-
-getkvars(argc, argv)
- char **argv;
-{
- register struct nlist *nlp;
-
- nlistf = argc > 1 ? argv[1] : "/vmunix";
- nlist(nlistf, nl);
- if (nl[0].n_type == 0) {
- fprintf(stderr, "%s: No namelist\n", nlistf);
- exit(1);
- }
- if (kflg)
- for (nlp = nl; nlp < &nl[sizeof (nl)/sizeof (nl[0])]; nlp++)
- nlp->n_value = clear(nlp->n_value);
- usrpt = (struct pte *)nl[X_USRPT].n_value; /* don't clear!! */
- Usrptma = (struct pte *)nl[X_USRPTMA].n_value;
- klseek(kmem, (long)nl[X_NSWAP].n_value, 0);
- if (read(kmem, (char *)&nswap, sizeof (nswap)) != sizeof (nswap)) {
- cantread("nswap", kmemf);
- exit(1);
- }
- klseek(kmem, (long)nl[X_MAXSLP].n_value, 0);
- if (read(kmem, (char *)&maxslp, sizeof (maxslp)) != sizeof (maxslp)) {
- cantread("maxslp", kmemf);
- exit(1);
- }
- klseek(kmem, (long)nl[X_CCPU].n_value, 0);
- if (read(kmem, (char *)&ccpu, sizeof (ccpu)) != sizeof (ccpu)) {
- cantread("ccpu", kmemf);
- exit(1);
- }
- klseek(kmem, (long)nl[X_ECMX].n_value, 0);
- if (read(kmem, (char *)&ecmx, sizeof (ecmx)) != sizeof (ecmx)) {
- cantread("ecmx", kmemf);
- exit(1);
- }
- if (uflg || vflg) {
- ntext = getw(nl[X_NTEXT].n_value);
- text = (struct text *)alloc(ntext * sizeof (struct text));
- if (text == 0) {
- fprintf(stderr, "no room for text table\n");
- exit(1);
- }
- atext = (struct text *)getw(nl[X_TEXT].n_value);
- klseek(kmem, (long)atext, 0);
- if (read(kmem, (char *)text, ntext * sizeof (struct text))
- != ntext * sizeof (struct text)) {
- cantread("text table", kmemf);
- exit(1);
- }
- }
-}
-
-printhdr()
-{
- char *hdr;
-
- if (sflg+lflg+vflg+uflg > 1) {
- fprintf(stderr, "ps: specify only one of s,l,v and u\n");
- exit(1);
- }
- hdr = ssflg ? sshdr :
- (lflg ? lhdr :
- (vflg ? vhdr :
- (uflg ? uhdr : shdr)));
- if (lflg+vflg+uflg+sflg == 0)
- hdr += strlen("SSIZ ");
- cmdstart = strlen(hdr);
- printf("%s COMMAND\n", hdr);
- (void) fflush(stdout);
-}
-
-cantread(what, fromwhat)
- char *what, *fromwhat;
-{
-
- fprintf(stderr, "ps: error reading %s from %s\n", what, fromwhat);
-}
-
-struct direct *dbuf;
-int dialbase;
-
-getdev()
-{
- register DIR *df;
-
- dialbase = -1;
- if ((df = opendir(".")) == NULL) {
- fprintf(stderr, "Can't open . in /dev\n");
- exit(1);
- }
- while ((dbuf = readdir(df)) != NULL)
- maybetty();
- closedir(df);
-}
-
-/*
- * Attempt to avoid stats by guessing minor device
- * numbers from tty names. Console is known,
- * know that r(hp|up|mt) are unlikely as are different mem's,
- * floppy, null, tty, etc.
- */
-maybetty()
-{
- register char *cp = dbuf->d_name;
- register struct ttys *dp;
- int x;
- struct stat stb;
-
- switch (cp[0]) {
-
- case 'c':
- if (!strcmp(cp, "console")) {
- x = 0;
- goto donecand;
- }
- /* cu[la]? are possible!?! don't rule them out */
- break;
-
- case 'd':
- if (!strcmp(cp, "drum"))
- return;
- break;
-
- case 'f':
- if (!strcmp(cp, "floppy"))
- return;
- break;
-
- case 'k':
- cp++;
- if (*cp == 'U')
- cp++;
- goto trymem;
-
- case 'r':
- cp++;
- if (*cp == 'r' || *cp == 'u' || *cp == 'h')
- cp++;
-#define is(a,b) cp[0] == 'a' && cp[1] == 'b'
- if (is(r,p) || is(u,p) || is(r,k) || is(r,m) || is(m,t)) {
- cp += 2;
- if (isdigit(*cp) && cp[2] == 0)
- return;
- }
- break;
-
- case 'm':
-trymem:
- if (cp[0] == 'm' && cp[1] == 'e' && cp[2] == 'm' && cp[3] == 0)
- return;
- if (cp[0] == 'm' && cp[1] == 't')
- return;
- break;
-
- case 'n':
- if (!strcmp(cp, "null"))
- return;
- break;
-
- case 'v':
- if ((cp[1] == 'a' || cp[1] == 'p') && isdigit(cp[2]) &&
- cp[3] == 0)
- return;
- break;
- }
- cp = dbuf->d_name + dbuf->d_namlen - 1;
- x = 0;
- if (cp[-1] == 'd') {
- if (dialbase == -1) {
- if (stat("ttyd0", &stb) == 0)
- dialbase = stb.st_rdev & 017;
- else
- dialbase = -2;
- }
- if (dialbase == -2)
- x = 0;
- else
- x = 11;
- }
- if (cp > dbuf->d_name && isdigit(cp[-1]) && isdigit(*cp))
- x += 10 * (cp[-1] - ' ') + cp[0] - '0';
- else if (*cp >= 'a' && *cp <= 'f')
- x += 10 + *cp - 'a';
- else if (isdigit(*cp))
- x += *cp - '0';
- else
- x = -1;
-donecand:
- dp = (struct ttys *)alloc(sizeof (struct ttys));
- (void) strcpy(dp->name, dbuf->d_name);
- dp->next = allttys;
- dp->ttyd = -1;
- allttys = dp;
- if (x == -1)
- return;
- x &= 017;
- dp->cand = cand[x];
- cand[x] = dp;
-}
-
-char *
-gettty()
-{
- register char *p;
- register struct ttys *dp;
- struct stat stb;
- int x;
-
- if (u.u_ttyp == 0)
- return("?");
- x = u.u_ttyd & 017;
- for (dp = cand[x]; dp; dp = dp->cand) {
- if (dp->ttyd == -1) {
- if (stat(dp->name, &stb) == 0 &&
- (stb.st_mode&S_IFMT)==S_IFCHR)
- dp->ttyd = stb.st_rdev;
- else
- dp->ttyd = -2;
- }
- if (dp->ttyd == u.u_ttyd)
- goto found;
- }
- /* ick */
- for (dp = allttys; dp; dp = dp->next) {
- if (dp->ttyd == -1) {
- if (stat(dp->name, &stb) == 0 &&
- (stb.st_mode&S_IFMT)==S_IFCHR)
- dp->ttyd = stb.st_rdev;
- else
- dp->ttyd = -2;
- }
- if (dp->ttyd == u.u_ttyd)
- goto found;
- }
- return ("?");
-found:
- p = dp->name;
- if (p[0]=='t' && p[1]=='t' && p[2]=='y')
- p += 3;
- return (p);
-}
-
-save()
-{
- register struct savcom *sp;
- register struct asav *ap;
- register char *cp;
- register struct text *xp;
- char *ttyp, *cmdp;
-
- if (mproc->p_stat != SZOMB && getu() == 0)
- return;
- ttyp = gettty();
- if (xflg == 0 && ttyp[0] == '?' || tptr && strncmp(tptr, ttyp, 2))
- return;
- sp = &savcom[npr];
- cmdp = getcmd();
- if (cmdp == 0)
- return;
- sp->ap = ap = (struct asav *)alloc(sizeof (struct asav));
- sp->ap->a_cmdp = cmdp;
-#define e(a,b) ap->a = mproc->b
- e(a_flag, p_flag); e(a_stat, p_stat); e(a_nice, p_nice);
- e(a_uid, p_uid); e(a_pid, p_pid); e(a_pri, p_pri);
- e(a_slptime, p_slptime); e(a_time, p_time);
- ap->a_tty[0] = ttyp[0];
- ap->a_tty[1] = ttyp[1] ? ttyp[1] : ' ';
- if (ap->a_stat == SZOMB) {
- register struct xproc *xp = (struct xproc *)mproc;
-
- ap->a_cpu = 0;
- } else {
- ap->a_size = mproc->p_dsize + mproc->p_ssize;
- e(a_rss, p_rssize);
- ap->a_ttyd = u.u_ttyd;
- ap->a_cpu = u.u_ru.ru_utime.tv_sec + u.u_ru.ru_stime.tv_sec;
- if (sumcpu)
- ap->a_cpu += u.u_cru.ru_utime.tv_sec + u.u_cru.ru_stime.tv_sec;
- if (mproc->p_textp && text) {
- xp = &text[mproc->p_textp - atext];
- ap->a_tsiz = xp->x_size;
- ap->a_txtrss = xp->x_rssize;
- ap->a_xccount = xp->x_ccount;
- }
- }
-#undef e
- ap->a_maxrss = mproc->p_maxrss;
- if (lflg) {
- register struct lsav *lp;
-
- sp->sun.lp = lp = (struct lsav *)alloc(sizeof (struct lsav));
-#define e(a,b) lp->a = mproc->b
- e(l_ppid, p_ppid); e(l_cpu, p_cpu);
- if (ap->a_stat != SZOMB)
- e(l_wchan, p_wchan);
-#undef e
- lp->l_addr = pcbpf;
- } else if (vflg) {
- register struct vsav *vp;
-
- sp->sun.vp = vp = (struct vsav *)alloc(sizeof (struct vsav));
-#define e(a,b) vp->a = mproc->b
- if (ap->a_stat != SZOMB) {
- e(v_swrss, p_swrss);
- vp->v_majflt = u.u_ru.ru_majflt;
- if (mproc->p_textp)
- vp->v_txtswrss = xp->x_swrss;
- }
- vp->v_pctcpu = pcpu();
-#undef e
- } else if (uflg) {
- if (!ssflg)
- sp->sun.u_pctcpu = pcpu();
- else {
- register struct sssav *ssp;
-
- sp->sun.ssp =ssp= (struct sssav *)alloc(sizeof (struct sssav));
- ssp->ss_ppid = mproc->p_ppid;