|
|
1.1 ! root 1: /* ! 2: * unpatch.c - display value of kernel variable(s) ! 3: */ ! 4: #include <stdio.h> ! 5: #include <l.out.h> ! 6: #include <string.h> ! 7: ! 8: #define NUMVARS 20 /* number of symbols we can look up */ ! 9: ! 10: /* ! 11: * Table for namelist. ! 12: */ ! 13: struct nlist nl[NUMVARS+1]; ! 14: char suffix[NUMVARS+1][3]; /* keep ":[cils]" for each variable */ ! 15: ! 16: /* ! 17: * Symbols. ! 18: */ ! 19: char *kfile; /* Kernel data memory file */ ! 20: char *nfile; /* Namelist file */ ! 21: int kfd; /* Kernel memory file descriptor */ ! 22: int pflag; /* true if patch-compatible output desired */ ! 23: int var_num; /* Number of symbols to look up */ ! 24: ! 25: main(argc, argv) ! 26: char *argv[]; ! 27: { ! 28: int argn; ! 29: ! 30: initialise(); ! 31: /* ! 32: * Scan command line. ! 33: * ! 34: * "-c nfile" means use alternate map file. ! 35: * "-p" means output format suitable for patch command ! 36: * ! 37: * variable names may have ":[cils]" appended to specify ! 38: * size of value to be fetched, e.g. ! 39: * unpatch foo:l ! 40: * says foo is a long ! 41: */ ! 42: for (argn = 1; argn < argc; argn++) { ! 43: if (strcmp(argv[argn], "-c") == 0) { ! 44: if (++argn < argc) { ! 45: nfile = argv[argn]; ! 46: } else { ! 47: fprintf(stderr, "bad kfile spec\n"); ! 48: usage(); ! 49: } ! 50: } else if (strcmp(argv[argn], "-p") == 0) { ! 51: pflag = 1; ! 52: } else { ! 53: char p[40], *p2; ! 54: ! 55: strcpy(p, argv[argn]); ! 56: if (p2 = strchr(p, ':')){ ! 57: if (strlen(p2) == 2) { ! 58: strcpy(suffix[var_num], p2); ! 59: *p2 = '\0'; ! 60: strncpy(nl[var_num].n_name, p, NCPLN); ! 61: } else { ! 62: fprintf(stderr, "bad suffix size\n"); ! 63: usage(); ! 64: } ! 65: } else ! 66: strncpy(nl[var_num].n_name, p, NCPLN); ! 67: var_num++; ! 68: } ! 69: } ! 70: if (var_num == 0) { ! 71: fprintf(stderr, "no variable to unpatch\n"); ! 72: usage(); ! 73: } ! 74: execute(); ! 75: exit(0); ! 76: } ! 77: ! 78: /* ! 79: * Initialise. ! 80: */ ! 81: initialise() ! 82: { ! 83: int i; ! 84: ! 85: for (i = 0; i < NUMVARS+1; i++) { ! 86: nl[i].n_name[0] = '\0'; ! 87: nl[i].n_type = 0; ! 88: suffix[i][0] = '\0'; ! 89: suffix[i][1] = '\0'; ! 90: } ! 91: nfile = "/coherent"; ! 92: kfile = "/dev/kmem"; ! 93: } ! 94: ! 95: /* ! 96: * Print out usage. ! 97: */ ! 98: usage() ! 99: { ! 100: panic("Usage: unpatch [-c map_file] [-p] var_name[:cils]..."); ! 101: } ! 102: ! 103: /* ! 104: * Display value ! 105: */ ! 106: execute() ! 107: { ! 108: int v, size; ! 109: long longval, result; ! 110: unsigned int intval; ! 111: unsigned short shortval; ! 112: unsigned char charval; ! 113: ! 114: if ((kfd = open(kfile, 0)) < 0) ! 115: panic("Cannot open %s", kfile); ! 116: nlist(nfile, nl); ! 117: for (v = 0; v < var_num; v++) { ! 118: if (nl[v].n_type == 0) ! 119: fprintf(stderr, "can't find variable %s in %s\n", nl[v].n_name, nfile); ! 120: else { ! 121: switch (suffix[v][1]) { ! 122: case 'c': ! 123: size = sizeof(char); ! 124: kread((long)nl[v].n_value, &charval, size); ! 125: result = (long) charval; ! 126: break; ! 127: case 'i': ! 128: default: ! 129: size = sizeof(int); ! 130: kread((long)nl[v].n_value, &intval, size); ! 131: result = (long) intval; ! 132: break; ! 133: case 'l': ! 134: size = sizeof(long); ! 135: kread((long)nl[v].n_value, &longval, size); ! 136: result = longval; ! 137: break; ! 138: case 's': ! 139: size = sizeof(short); ! 140: kread((long)nl[v].n_value, &shortval, size); ! 141: result = (long) shortval; ! 142: break; ! 143: } ! 144: if (pflag) ! 145: printf("%s=0x%lx%s ", nl[v].n_name, ! 146: result, suffix[v]); ! 147: else ! 148: printf("%s=0x%lx\n", nl[v].n_name, result); ! 149: } ! 150: } ! 151: } ! 152: ! 153: /* ! 154: * Read `n' bytes into the buffer `bp' from kernel memory ! 155: * starting at seek position `s'. ! 156: */ ! 157: kread(s, bp, n) ! 158: long s; ! 159: { ! 160: lseek(kfd, (long)s, 0); ! 161: if (read(kfd, bp, n) != n) ! 162: panic("Kernel memory read error"); ! 163: } ! 164: ! 165: /* ! 166: * Print out an error message and exit. ! 167: */ ! 168: panic(a1) ! 169: char *a1; ! 170: { ! 171: fflush(stdout); ! 172: fprintf(stderr, "%r", &a1); ! 173: fprintf(stderr, "\n"); ! 174: exit(1); ! 175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.