Commit | Line | Data |
---|---|---|
ba5fdc97 TL |
1 | #include <a.out.h> |
2 | #include <signal.h> | |
3 | ||
4 | char *tname; | |
5 | char *mktemp(); | |
6 | struct exec head; | |
7 | int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0}; | |
8 | int status; | |
9 | int tf; | |
10 | ||
11 | main(argc, argv) | |
12 | char *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 | ||
36 | strip(name) | |
37 | char *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 | ||
82 | out: | |
83 | close(f); | |
84 | } | |
85 | ||
86 | copy(name, fr, to, size) | |
87 | char *name; | |
88 | long 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 | } |