- if (!isdigit(ap[-1]))
- break;
- chkpid = atoi(--ap);
- *ap = 0;
- aflg++;
- xflg++;
- break;
- }
- }
- openfiles(argc, argv);
- getkvars(argc, argv);
- uid = getuid();
- printhdr();
- procp = getw(nl[X_PROC].n_value);
- nproc = getw(nl[X_NPROC].n_value);
- savcom = (struct savcom *)calloc((unsigned) nproc, sizeof (*savcom));
- for (i=0; i<nproc; i += NPROC) {
- klseek(kmem, (long)procp, 0);
- j = nproc - i;
- if (j > NPROC)
- j = NPROC;
- 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)
- continue;
- if (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((char *) savcom, npr, sizeof(savcom[0]), pscomp);
- 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;
-{
- int 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) {
- if ((loc = vtophys(loc)) == -1)
- return;
- }
- (void) lseek(fd, (long)loc, off);
-}
-
-writepsdb(unixname)
- char *unixname;
-{
- int nllen;
- register FILE *fp;
-
- setuid(getuid());
- if ((fp = fopen(psdb, "w")) == NULL) {
- perror(psdb);
- exit(1);
- } else
- fchmod(fileno(fp), 0644);
- nllen = sizeof nl / sizeof (struct nlist);
- fwrite((char *) &nllen, sizeof nllen, 1, fp);
- fwrite((char *) nl, sizeof (struct nlist), nllen, fp);
- fwrite((char *) &nttys, sizeof nttys, 1, fp);
- fwrite((char *) allttys, sizeof (struct ttys), nttys, fp);
- fwrite(unixname, strlen(unixname) + 1, 1, fp);
- fclose(fp);
-}
-
-readpsdb(unixname)
- char *unixname;
-{
- int nllen;
- register i;
- register FILE *fp;
- char unamebuf[BUFSIZ];
- char *p = unamebuf;
- extern int errno;
-
- if ((fp = fopen(psdb, "r")) == NULL) {
- if (errno == ENOENT)
- return (0);
- perror(psdb);
- exit(1);
- }
-
- fread((char *) &nllen, sizeof nllen, 1, fp);
- fread((char *) nl, sizeof (struct nlist), nllen, fp);
- fread((char *) &nttys, sizeof nttys, 1, fp);
- fread((char *) allttys, sizeof (struct ttys), nttys, fp);
- while ((*p = getc(fp)) != '\0')
- p++;
- return (strcmp(unixname, unamebuf) == 0);
-}
-
-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;
-{
-
- nlistf = argc > 1 ? argv[1] : "/vmunix";
- if (Uflg) {
- nlist(nlistf, nl);
- getdev();
- writepsdb(nlistf);
- exit (0);
- } else if (!readpsdb(nlistf)) {
- if (!kflg)
- nl[X_SYSMAP].n_name = "";
- nlist(nlistf, nl);
- nttys = 0;
- getdev();
- }
-
- if (nl[0].n_type == 0) {
- fprintf(stderr, "%s: No namelist\n", nlistf);
- exit(1);
- }
- if (kflg) {
- /* We must do the sys map first because klseek uses it */
- long addr;
-
- Syssize = nl[X_SYSSIZE].n_value;
- Sysmap = (struct pte *)
- calloc((unsigned) Syssize, sizeof (struct pte));
- if (Sysmap == NULL) {
- fprintf(stderr, "Out of space for Sysmap\n");
- exit(1);
- }
- addr = (long) nl[X_SYSMAP].n_value;
- addr &= ~0x80000000;
- (void) lseek(kmem, addr, 0);
- read(kmem, (char *) Sysmap, Syssize * sizeof (struct pte));
- }
- usrpt = (struct pte *)nl[X_USRPT].n_value;
- Usrptmap = (struct pte *)nl[X_USRPTMAP].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 *)
- calloc((unsigned) ntext, sizeof (struct text));
- if (text == 0) {
- fprintf(stderr, "no room for text table\n");
- exit(1);