Annotation of 43BSDReno/usr.bin/systat/fetch.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.