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_flag&1) != 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 = 0;
63: head.a_flag |= 1;
64:
65: lseek(tf, (long)0, 0);
66: write(tf, (char *)&head, sizeof(head));
67: if(copy(name, f, tf, size)) {
68: status = 1;
69: goto out;
70: }
71: size += sizeof(head);
72: close(f);
73: f = creat(name, 0666);
74: if(f < 0) {
75: printf("%s cannot recreate\n", name);
76: status = 1;
77: goto out;
78: }
79: lseek(tf, (long)0, 0);
80: if(copy(name, tf, f, size))
81: status = 2;
82:
83: out:
84: close(f);
85: }
86:
87: copy(name, fr, to, size)
88: char *name;
89: long size;
90: {
91: register s, n;
92: char buf[512];
93:
94: while(size != 0) {
95: s = 512;
96: if(size < 512)
97: s = size;
98: n = read(fr, buf, s);
99: if(n != s) {
100: printf("%s unexpected eof\n", name);
101: return(1);
102: }
103: n = write(to, buf, s);
104: if(n != s) {
105: printf("%s unexpected write eof\n", name);
106: return(1);
107: }
108: size -= s;
109: }
110: return(0);
111: }
Defined functions
copy
defined in line
87; used 2 times
main
defined in line
11;
never used
strip
defined in line
36; used 1 times
Defined variables
head
defined in line
6; used 12 times
status
defined in line
8; used 7 times
tf
defined in line
9; used 8 times
tname
defined in line
4; used 4 times