|
|
1.1 ! root 1: /* ! 2: * @(#)readfile.c 1.1 86/02/03 Copyright (c) 1985 by Sun Microsystems, Inc. ! 3: */ ! 4: ! 5: #include "saio.h" ! 6: #include <a.out.h> ! 7: ! 8: /* ! 9: * Read in a Unix executable file and return its entry point. ! 10: * Handle the various a.out formats correctly. ! 11: * "Io" is the standalone file descriptor to read from. ! 12: * Print informative little messages if "print" is on. ! 13: * Returns -1 for errors. ! 14: * ! 15: * The parameter <LOAD> must be set in the command line to cc, e.g. ! 16: * cc -DLOAD=0x4000 -o readfile.c ! 17: * The makefile takes care of this. ! 18: */ ! 19: int (* ! 20: readfile(io, print))() ! 21: register int io; ! 22: int print; ! 23: { ! 24: struct exec x; ! 25: register int i; ! 26: register char *addr; ! 27: register int shared = 0; ! 28: register int loadaddr; ! 29: register int segsiz; ! 30: register int datasize; ! 31: ! 32: i = read(io, (char *)&x, sizeof x); ! 33: if (x.a_magic == ZMAGIC || x.a_magic == NMAGIC) ! 34: shared = 1; ! 35: if (i != sizeof x || (!shared && x.a_magic != OMAGIC)) { ! 36: printf("Not executable\n"); ! 37: return (int (*)()) -1; ! 38: } ! 39: if (print) ! 40: printf("Size: %d", x.a_text); ! 41: datasize = x.a_data; ! 42: if (!shared) { ! 43: x.a_text = x.a_text + x.a_data; ! 44: x.a_data = 0; ! 45: } ! 46: if (lseek(io, N_TXTOFF(x), 0) == -1) ! 47: goto shread; ! 48: if (read(io, (char *)LOAD, (int)x.a_text) < x.a_text) ! 49: goto shread; ! 50: addr = (char *)(x.a_text + LOAD); ! 51: if (x.a_machtype == M_OLDSUN2) ! 52: segsiz = OLD_SEGSIZ; ! 53: else ! 54: segsiz = SEGSIZ; ! 55: if (shared) ! 56: while ((int)addr & (segsiz-1)) ! 57: *addr++ = 0; ! 58: if (print) ! 59: printf("+%d", datasize); ! 60: if (read(io, addr, (int)x.a_data) < x.a_data) ! 61: goto shread; ! 62: close(io); /* Done with it. */ ! 63: if (print) ! 64: printf("+%d", x.a_bss); ! 65: addr += x.a_data; ! 66: for (i = 0; i < x.a_bss; i++) ! 67: *addr++ = 0; ! 68: if (print) ! 69: printf(" bytes\n"); ! 70: if (x.a_machtype != M_OLDSUN2 && x.a_magic == ZMAGIC) ! 71: loadaddr = LOAD + sizeof (struct exec); ! 72: else ! 73: loadaddr = LOAD; ! 74: return (int (*)()) (loadaddr); ! 75: ! 76: shread: ! 77: printf("Truncated file\n"); ! 78: return (int (*)()) -1; ! 79: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.