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