1: static  char *sccsid = "@(#)1kfix.c	4.1 (Berkeley) 10/16/80";
   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: }

Defined functions

main defined in line 10; never used

Defined variables

sccsid defined in line 1; never used

Defined macros

round defined in line 8; used 3 times
Last modified: 1982-10-22
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1105
Valid CSS Valid XHTML 1.0 Strict