BSD 4_1_snap release
[unix-history] / usr / src / cmd / 1kfix.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)1kfix.c 4.1 (Berkeley) 10/15/80";
ab50db23
BJ
2#include <stdio.h>
3#include <a.out.h>
4#include <sys/param.h>
5#include <sys/vm.h>
6char *malloc();
7
8#define round(a,b) (((a)+((b)-1))&~(b-1))
9
10main(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:
50format:
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);
109skip:
110 argc--, argv++;
111 close(io);
112 } while (argc > 0);
113 exit(0);
114}