xref: /original-bsd/usr.bin/strip/strip.c (revision 264c46cb)
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