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