|
|
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.