1 #ifndef lint 2 static char *sccsid = "@(#)strip.c 4.4 (Berkeley) 05/22/83"; 3 #endif 4 5 #include <a.out.h> 6 #include <signal.h> 7 8 #define BUFSIZ 1024 9 10 char *tname; 11 char *mktemp(); 12 struct exec head; 13 int status; 14 int tf; 15 int pagesize; 16 17 main(argc, argv) 18 char *argv[]; 19 { 20 register i; 21 22 pagesize = getpagesize(); 23 signal(SIGHUP, SIG_IGN); 24 signal(SIGINT, SIG_IGN); 25 signal(SIGQUIT, SIG_IGN); 26 tname = mktemp("/tmp/sXXXXX"); 27 close(creat(tname, 0600)); 28 tf = open(tname, 2); 29 if(tf < 0) { 30 printf("cannot create temp file\n"); 31 exit(2); 32 } 33 for(i=1; i<argc; i++) { 34 strip(argv[i]); 35 if(status > 1) 36 break; 37 } 38 close(tf); 39 unlink(tname); 40 exit(status); 41 } 42 43 strip(name) 44 char *name; 45 { 46 register f; 47 long size; 48 int i; 49 50 f = open(name, 0); 51 if(f < 0) { 52 perror(name); 53 status = 1; 54 goto out; 55 } 56 read(f, (char *)&head, sizeof(head)); 57 if (N_BADMAG(head)) { 58 printf("%s not in a.out format\n", name); 59 status = 1; 60 goto out; 61 } 62 if ((head.a_syms == 0) && (head.a_trsize == 0) && (head.a_drsize ==0)) { 63 printf("%s already stripped\n", name); 64 goto out; 65 } 66 size = (long)head.a_text + head.a_data; 67 head.a_syms = head.a_trsize = head.a_drsize = 0 ; 68 lseek(tf, (long)0, 0); 69 write(tf, (char *)&head, sizeof(head)); 70 if (head.a_magic == ZMAGIC) 71 size += pagesize - sizeof (head); 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 } 117