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