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