|
|
1.1 root 1: #include <stdio.h>
2: #include <a.out.h>
3: #include <sys/param.h>
4: #include <sys/vm.h>
5: char *malloc();
6:
7: #define round(a,b) (((a)+((b)-1))&~(b-1))
8:
9: main(argc, argv)
10: int argc;
11: char *argv[];
12: {
13: char *tp, *dp, *sp;
14: struct exec x, y;
15: int io;
16: char zeroes[NBPG];
17:
18: --argc;
19: ++argv;
20: if (argc == 0) {
21: fprintf(stderr, "usage: 1kfix file ...\n");
22: exit(1);
23: }
24: do {
25: io = open(argv[0], 2);
26: if (io < 0) {
27: perror(argv[0]);
28: argc--, argv++;
29: continue;
30: }
31: if (read(io, &x, sizeof x) != sizeof x)
32: goto format;
33:
34: switch (x.a_magic) {
35:
36: case 0407:
37: case 0410:
38: if ((round(x.a_text,NBPG) & CLOFSET) == 0) {
39: fprintf(stderr, "%s: wins as is\n", argv[0]);
40: goto skip;
41: }
42: break;
43:
44: case 0413:
45: lseek(io, NBPG, 0);
46: break;
47:
48: default:
49: format:
50: printf("%s: not object file\n", argv[0]);
51: goto skip;
52: }
53:
54: tp = malloc(x.a_text);
55: dp = malloc(x.a_data);
56: sp = malloc(x.a_syms);
57: if (read(io, tp, x.a_text) != x.a_text ||
58: read(io, dp, x.a_data) != x.a_data ||
59: read(io, sp, x.a_syms) != x.a_syms) {
60: fprintf(stderr, "%s: short read\n", argv[0]);
61: goto skip;
62: }
63: close(io);
64: io = creat(argv[0], 0755);
65: if (io < 0) {
66: perror(argv[0]);
67: goto skip;
68: }
69:
70: y = x;
71: switch (x.a_magic) {
72:
73: case 0413: {
74: int i;
75: for (i = 0; i < 512; i++)
76: if (tp[i] != 0)
77: break;
78: if (i == 512)
79: printf("%s: already fixed\n", argv[0]);
80: if (x.a_text & CLOFSET) {
81: y.a_text -= NBPG;
82: y.a_data += NBPG;
83: }
84: }
85: break;
86:
87: case 0407:
88: case 0410:
89: y.a_text = round(x.a_text, NBPG) - NBPG;
90: y.a_data += NBPG;
91: if (y.a_text == 0) {
92: fprintf(stderr, "%s: text size would be 0\n", argv[0]);
93: goto skip;
94: }
95: }
96: y.a_trsize = y.a_drsize = 0;
97: write(io, (char *)&y, sizeof y);
98: if (x.a_magic == 0413)
99: lseek(io, BSIZE, 0);
100: write(io, tp, x.a_text);
101: if (x.a_magic != 0413)
102: write(io, zeroes, round(x.a_text, NBPG) - x.a_text);
103: write(io, dp, x.a_data);
104: write(io, sp, x.a_syms);
105: free(tp);
106: free(dp);
107: free(sp);
108: skip:
109: argc--, argv++;
110: close(io);
111: } while (argc > 0);
112: exit(0);
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.