|
|
1.1 ! root 1: #include <a.out.h> ! 2: ! 3: #define STDIN 0 ! 4: #define STDOUT 1 ! 5: #define STDERR 2 ! 6: ! 7: #define PGSIZE 1024 ! 8: #define BSIZE 4096 ! 9: ! 10: main() ! 11: { ! 12: struct exec a; ! 13: ! 14: if (read(STDIN, (char *)&a, sizeof(a)) != sizeof(a)) { ! 15: fprint(STDERR, "no header\n"); ! 16: exit(1); ! 17: } ! 18: if (a.a_magic != 0407 && a.a_magic != 0410) { ! 19: fprint(STDERR, "bad magic number\n"); ! 20: exit(1); ! 21: } ! 22: copy(a.a_text); ! 23: if (a.a_magic == 0410) ! 24: pad(PGSIZE - (a.a_text & (PGSIZE-1))); ! 25: copy(a.a_data); ! 26: pad(a.a_bss); ! 27: exit(0); ! 28: } ! 29: ! 30: copy(n) ! 31: register int n; ! 32: { ! 33: char buf[BSIZE]; ! 34: register int rn, r; ! 35: ! 36: while (n > 0) { ! 37: r = (n > BSIZE) ? BSIZE : n; ! 38: rn = read(STDIN, buf, r); ! 39: if (rn <= 0) { ! 40: fprint(STDERR, "short\n"); ! 41: exit(1); ! 42: } ! 43: if (write(STDOUT, buf, rn) != rn) { ! 44: fprint(STDERR, "write error\n"); ! 45: exit(1); ! 46: } ! 47: n -= rn; ! 48: } ! 49: } ! 50: ! 51: pad(n) ! 52: register int n; ! 53: { ! 54: char buf[BSIZE]; ! 55: register int i; ! 56: ! 57: for (i = 0; i < BSIZE; i++) ! 58: buf[i] = 0; ! 59: while (n > 0) { ! 60: i = (n > BSIZE) ? BSIZE : n; ! 61: if (write(STDOUT, buf, i) != i) { ! 62: fprint(STDERR, "write error\n"); ! 63: exit(1); ! 64: } ! 65: n -= i; ! 66: } ! 67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.