|
|
1.1 ! root 1: #include "a.out.h" /*god: using pdp11 a.out fmt */ ! 2: #include <signal.h> ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: ! 6: char *tname; ! 7: char *mktemp(); ! 8: struct exec head; ! 9: int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0}; ! 10: int status; ! 11: int tf; ! 12: ! 13: main(argc, argv) ! 14: char *argv[]; ! 15: { ! 16: register i; ! 17: ! 18: signal(SIGHUP, SIG_IGN); ! 19: signal(SIGINT, SIG_IGN); ! 20: signal(SIGQUIT, SIG_IGN); ! 21: tname = mktemp("/tmp/sXXXXX"); ! 22: close(creat(tname, 0600)); ! 23: tf = open(tname, 2); ! 24: if(tf < 0) { ! 25: printf("cannot create temp file\n"); ! 26: exit(2); ! 27: } ! 28: if (argc == 1) { /*god: default 11a.out */ ! 29: argv[1] = A_DOT_OUT; /*god*/ ! 30: ++argc; /*god*/ ! 31: } /*god*/ ! 32: for(i=1; i<argc; i++) { ! 33: strip(argv[i]); ! 34: /*god*/ /*if(status > 1) ! 35: break;*/ /*god: no reason to abort*/ ! 36: } ! 37: close(tf); ! 38: unlink(tname); ! 39: exit(status); ! 40: } ! 41: ! 42: strip(name) ! 43: char *name; ! 44: { ! 45: register f; ! 46: long size; ! 47: int i; ! 48: time_t tm[2]; ! 49: struct stat stbuf; ! 50: ! 51: tm[0] = 0; ! 52: f = open(name, 0); ! 53: if(f < 0) { ! 54: printf("cannot open %s\n", name); ! 55: status = 1; ! 56: goto out; ! 57: } ! 58: fstat(f, &stbuf); ! 59: tm[0] = stbuf.st_atime; ! 60: tm[1] = stbuf.st_mtime; ! 61: read(f, (char *)&head, sizeof(head)); ! 62: for(i=0;a_magic[i];i++) ! 63: if(a_magic[i] == head.a_magic) break; ! 64: if(a_magic[i] == 0) { ! 65: printf("%s not in 11a.out format\n", name); /*god*/ ! 66: status = 1; ! 67: goto out; ! 68: } ! 69: if(head.a_syms == 0 && (head.a_flag&1) != 0) { ! 70: printf("%s already stripped\n", name); ! 71: goto out; ! 72: } ! 73: size = (long)head.a_text + head.a_data; ! 74: head.a_syms = 0; ! 75: head.a_flag |= 1; ! 76: ! 77: lseek(tf, (long)0, 0); ! 78: write(tf, (char *)&head, sizeof(head)); ! 79: if(copy(name, f, tf, size)) { ! 80: status = 1; ! 81: goto out; ! 82: } ! 83: size += sizeof(head); ! 84: close(f); ! 85: f = creat(name, 0666); ! 86: if(f < 0) { ! 87: printf("%s cannot recreate\n", name); ! 88: status = 1; ! 89: goto out; ! 90: } ! 91: lseek(tf, (long)0, 0); ! 92: if(copy(name, tf, f, size)) ! 93: status = 2; ! 94: ! 95: out: ! 96: close(f); ! 97: if (tm[0]) ! 98: utime(name, tm); ! 99: } ! 100: ! 101: copy(name, fr, to, size) ! 102: char *name; ! 103: long size; ! 104: { ! 105: register s, n; ! 106: char buf[512]; ! 107: ! 108: while(size != 0) { ! 109: s = 512; ! 110: if(size < 512) ! 111: s = size; ! 112: n = read(fr, buf, s); ! 113: if(n != s) { ! 114: printf("%s unexpected eof\n", name); ! 115: return(1); ! 116: } ! 117: n = write(to, buf, s); ! 118: if(n != s) { ! 119: printf("%s unexpected write eof\n", name); ! 120: return(1); ! 121: } ! 122: size -= s; ! 123: } ! 124: return(0); ! 125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.