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