1: /*
   2:  * Copyright (c) 1980 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char sccsid[] = "@(#)fetch.c	5.1 (Berkeley) 5/30/85";
   9: #endif not lint
  10: 
  11: #include "systat.h"
  12: #include <sys/dir.h>
  13: #include <sys/user.h>
  14: #include <sys/proc.h>
  15: #include <sys/vmmac.h>
  16: #include <machine/pte.h>
  17: #include <pwd.h>
  18: 
  19: long
  20: getw(loc)
  21:         int loc;
  22: {
  23:         long word;
  24: 
  25:         lseek(kmem, loc, L_SET);
  26:         if (read(kmem, &word, sizeof (word)) != sizeof (word))
  27:                 printf("Error reading kmem at %x\n", loc);
  28:         return (word);
  29: }
  30: 
  31: char *
  32: getpname(pid, mproc)
  33:         int pid;
  34:         register struct proc *mproc;
  35: {
  36:         register struct procs *pp;
  37:         register char *namp;
  38:         register int j;
  39:         char *getcmd();
  40: 
  41:         pp = procs;
  42:         for (j = numprocs - 1; j >= 0; j--) {
  43:                 if (pp->pid == pid)
  44:                         return (pp->cmd);
  45:                 pp++;
  46:         }
  47:         if (j < 0) {
  48:                 if (numprocs < 200) {
  49:                         pp = &procs[numprocs];
  50:                         namp = strncpy(pp->cmd, getcmd(pid, mproc), 15);
  51:                         pp->cmd[15] = 0;
  52:                         pp->pid = pid;
  53:                         numprocs++;
  54:                 } else
  55:                         namp = getcmd(pid, mproc);
  56:         }
  57:         return (namp);
  58: }
  59: 
  60: union {
  61:         struct  user user;
  62:         char    upages[UPAGES][NBPG];
  63: } user;
  64: #define u       user.user
  65: 
  66: char *
  67: getcmd(pid, mproc)
  68:         int pid;
  69:         register struct proc *mproc;
  70: {
  71:         static char cmd[30];
  72: 
  73:         if (mproc == NULL || mproc->p_stat == SZOMB)
  74:         return ("");
  75:     if (pid == 1)
  76:         return ("swapper");
  77:     if (pid == 2)
  78:         return ("pagedaemon");
  79:         if (mproc->p_flag&(SSYS|SWEXIT))
  80:                 return ("");
  81:         if (getu(mproc) == 0)
  82:         return ("???");
  83:         (void) strncpy(cmd, u.u_comm, sizeof (cmd));
  84:         return (cmd);
  85: }
  86: 
  87: static  int argaddr;
  88: static  int pcbpf;
  89: 
  90: getu(mproc)
  91:         register struct proc *mproc;
  92: {
  93:         struct pte *pteaddr, apte;
  94:         struct pte arguutl[UPAGES+CLSIZE];
  95:         register int i;
  96:         int ncl, size;
  97: 
  98:         size = sizeof (struct user);
  99:         if ((mproc->p_flag & SLOAD) == 0) {
 100:                 if (swap < 0)
 101:                         return (0);
 102:                 (void) lseek(swap, (long)dtob(mproc->p_swaddr), L_SET);
 103:                 if (read(swap, (char *)&user.user, size) != size) {
 104:             error("cant read u for pid %d", mproc->p_pid);
 105:                         return (0);
 106:                 }
 107:                 pcbpf = 0;
 108:                 argaddr = 0;
 109:                 return (1);
 110:         }
 111:         pteaddr = &Usrptma[btokmx(mproc->p_p0br) + mproc->p_szpt - 1];
 112:         klseek(kmem, (long)pteaddr, L_SET);
 113:         if (read(kmem, (char *)&apte, sizeof (apte)) != sizeof (apte)) {
 114:                 error("cant read indir pte to get u for pid %d", mproc->p_pid);
 115:                 return (0);
 116:         }
 117:         klseek(mem,
 118:             (long)ctob(apte.pg_pfnum+1) - (UPAGES+CLSIZE) * sizeof (struct pte),
 119:                 L_SET);
 120:         if (read(mem, (char *)arguutl, sizeof (arguutl)) != sizeof (arguutl)) {
 121:                 error("cant read page table for u of pid %d", mproc->p_pid);
 122:                 return (0);
 123:         }
 124:         if (arguutl[0].pg_fod == 0 && arguutl[0].pg_pfnum)
 125:                 argaddr = ctob(arguutl[0].pg_pfnum);
 126:         else
 127:                 argaddr = 0;
 128:         pcbpf = arguutl[CLSIZE].pg_pfnum;
 129:         ncl = (size + NBPG*CLSIZE - 1) / (NBPG*CLSIZE);
 130:         while (--ncl >= 0) {
 131:                 i = ncl * CLSIZE;
 132:                 klseek(mem, (long)ctob(arguutl[CLSIZE+i].pg_pfnum), L_SET);
 133:                 if (read(mem, user.upages[i], CLSIZE*NBPG) != CLSIZE*NBPG) {
 134:                         error("cant read page %d of u of pid %d\n",
 135:                             arguutl[CLSIZE+i].pg_pfnum, mproc->p_pid);
 136:                         return (0);
 137:                 }
 138:         }
 139:         return (1);
 140: }
 141: 
 142: klseek(fd, loc, off)
 143:         int fd;
 144:         long loc;
 145:         int off;
 146: {
 147: 
 148:         (void) lseek(fd, (long)loc, off);
 149: }

Defined functions

getcmd defined in line 66; used 3 times
getpname defined in line 31; used 2 times
getu defined in line 90; used 2 times
klseek defined in line 142; used 4 times

Defined variables

argaddr defined in line 87; used 3 times
pcbpf defined in line 88; used 2 times
sccsid defined in line 8; never used

Defined macros

u defined in line 64; used 1 times
  • in line 83
Last modified: 1985-05-31
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2810
Valid CSS Valid XHTML 1.0 Strict