|
|
1.1 root 1: #include <stdio.h>
2: #include "ps.h"
3:
4: inita()
5: {
6: if (drumf == NULL)
7: drumf = "/dev/drum";
8: if (memf == NULL)
9: memf = "/dev/kmem";
10: if ((drum = open(drumf, 0)) < 0) {
11: perror(drumf);
12: exit(1);
13: }
14: if ((memory = open(memf, 0)) < 0) {
15: perror(memf);
16: exit(1);
17: }
18: }
19:
20: getproca(s, pp)
21: char *s; register struct proc *pp;
22: {
23: register int fd;
24: char sstr[32];
25: extern char stack[];
26:
27: if((fd = open(strcat(strcpy(sstr, "/proc/"), s), 0)) == -1)
28: return -1;
29: if(ioctl(fd, PIOCGETPR, pp) < 0) {
30: close(fd);
31: fprintf(stderr, "%s %s: /proc ioctl error\n", progname, s);
32: return -1;
33: }
34: return fd;
35: }
36:
37: char *
38: getuareaa(fd, pp, up)
39: register struct proc *pp; register struct user *up;
40: {
41: if (up->u_procp)
42: return 0;
43: if (pp->p_stat == SZOMB) {
44: memset((char *)up, 0, sizeof(*up));
45: return (0);
46: }
47: if (pp->p_flag & SLOAD) {
48: register ntry = 4;
49: do
50: if (memrd(fd, (char *)up, sizeof(*up), UBASE) == sizeof(*up))
51: return 0;
52: while (errno == EBUSY && --ntry > 0);
53: close(fd);
54: return "/proc read error";
55: }
56: if (memrd(drum, (char *)up, sizeof(*up), ctob(pp->p_swaddr)) == sizeof(*up))
57: return 0;
58: close(fd);
59: return "drum read error";
60: }
61:
62: getstacka(f, pp, up, stack)
63: struct proc *pp;
64: struct user *up;
65: char *stack;
66: {
67: int nstack;
68: int nspte;
69: int szpt;
70: register int i;
71: struct pte pte[NPTEPG];
72:
73: nstack = ctob(up->u_ssize);
74: if (nstack <= 0)
75: return (0);
76: if (nstack > NSTACK)
77: nstack = NSTACK;
78: if (pp->p_flag & SLOAD) {
79: lseek(f, UBASE-nstack, 0);
80: return (read(f, stack, nstack));
81: } else {
82: nspte = btoc(nstack);
83: szpt = clrnd(ctopt(UPAGES+pp->p_tsize+pp->p_dsize+pp->p_ssize));
84: lseek(drum, ctob(pp->p_swaddr+UPAGES+szpt-1), 0);
85: if (read(drum, (char *)pte, sizeof(pte)) != sizeof(pte))
86: return (0);
87: for (i = nspte-1; i >= 0; stack += NBPG, --i)
88: rdpage(up, i, &pte[NPTEPG-UPAGES-1-i], stack);
89: return (nstack);
90: }
91: }
92:
93: List *
94: getprlista()
95: {
96: register List *prlist;
97:
98: if ((prlist = getdir("/proc", (List *)0)) == 0)
99: error("can't getdir /proc");
100: return prlist;
101: }
102:
103: kreada(addr, buf, size)
104: long addr;
105: char *buf;
106: int size;
107: {
108:
109: return (memrd(memory, buf, size, addr) == size);
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.