|
|
1.1 root 1: #include "nlist.h"
2: #include "stdio.h"
3:
4: struct nlist nl[] = {
5: {"_proFptr"},
6: {0}
7: };
8:
9: struct rec {
10: long len;
11: struct rec *next;
12: char *fname;
13: } proFptr;
14: FILE *outfd;
15: struct rec *x;
16: char buf[256];
17: long foo[1024];
18: int fd;
19:
20: main(argc, argv)
21: char **argv;
22: {
23: if(argc > 1)
24: nlist(argv[1], nl);
25: else
26: nlist("/unix", nl);
27: if(nl[0].n_value == 0) {
28: fprintf(stderr, "weird namelist?\n");
29: exit(1);
30: }
31: fd = open("/dev/kmem", 0);
32: if(fd < 0) {
33: perror("/dev/kmem");
34: exit(1);
35: }
36: outfd = fopen("prof.out", "w");
37: if(outfd == 0) {
38: perror("prof.out");
39: exit(1);
40: }
41: if(lseek(fd, nl[0].n_value, 0) == -1) {
42: fprintf(stderr, "lseek failed seeking to x%x\n", nl[0].n_value);
43: exit(1);
44: }
45: if(read(fd, (char *)&x, sizeof(long)) != sizeof(long)) {
46: fprintf(stderr, "read failed\n");
47: exit(1);;
48: }
49: for(;;) {
50: readit();
51: if(proFptr.next == 0 || proFptr.next == x)
52: break;
53: if(seenit(proFptr.next))
54: break;
55: x = proFptr.next;
56: }
57: }
58:
59: readit()
60: { int i;
61: i = lseek(fd, (char *)x, 0);
62: if(i == -1)
63: fatal("first lseek in readit, seeking to x%x\n", x);
64: i = read(fd, (char *)&proFptr, sizeof(proFptr));
65: if(i != sizeof(proFptr))
66: fatal("reading proFptr in readit\n");
67: i = read(fd, (char *)foo, sizeof(long) * proFptr.len);
68: if(i != sizeof(long) * proFptr.len)
69: fatal("read %d instead of %d\n", i, sizeof(long) * proFptr.len);
70: i = lseek(fd, proFptr.fname, 0);
71: if(i == -1)
72: fatal("seeking to x%x\n", proFptr.fname);
73: i = read(fd, buf, sizeof(buf));
74: fprintf(outfd, "%s\n", buf);
75: fflush(outfd);
76: for(i = 3; i < proFptr.len; i++)
77: fprintf(outfd, "%d\n", foo[i-3]);
78: }
79:
80: fatal(s, a, b, c, d, e, f, g)
81: char *s;
82: {
83: fprintf(stderr, s, a, b, c, d, e, f, g);
84: exit(1);
85: }
86:
87: /* very dumb loop finder, and of course loops can't happen */
88: #define NDUMB 1000
89: int seen[NDUMB];
90: int seencnt;
91: seenit(n)
92: { int i;
93: for(i = 0; i < seencnt; i++)
94: if(n == seen[i]) {
95: fprintf(stderr, "looping\n");
96: return(1);
97: }
98: seen[seencnt++] = n;
99: if(seencnt >= NDUMB) {
100: fprintf(stderr, "seen %d files, quitting\n", seencnt);
101: return(1);
102: }
103: return(0);
104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.