143 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						|
 */
 | 
						|
/* $Header$ */
 | 
						|
 | 
						|
#include "out.h"
 | 
						|
#include <signal.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
/*
 | 
						|
 | 
						|
	astrip -- remove symbols and relocation bits
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
char	*tname;
 | 
						|
char	*mktemp();
 | 
						|
FILE	*fopen();
 | 
						|
FILE	*tf;
 | 
						|
struct outhead buf;
 | 
						|
int	readerror, writeerror;
 | 
						|
 | 
						|
main(argc, argv)
 | 
						|
char **argv;
 | 
						|
{
 | 
						|
	int	status;
 | 
						|
 | 
						|
	signal(SIGHUP, SIG_IGN);
 | 
						|
	signal(SIGINT, SIG_IGN);
 | 
						|
	signal(SIGQUIT, SIG_IGN);
 | 
						|
	tname = mktemp("/tmp/sXXXXX");
 | 
						|
	while(--argc) {
 | 
						|
		if ((status = strip(argv[argc])) > 1)
 | 
						|
			break;
 | 
						|
	}
 | 
						|
	unlink(tname);
 | 
						|
	exit(status);
 | 
						|
}
 | 
						|
 | 
						|
strip(name)
 | 
						|
char *name;
 | 
						|
{
 | 
						|
	long size;
 | 
						|
 | 
						|
	if (! rd_open(name)) {
 | 
						|
		fprintf(stderr, "astrip: cannot open %s\n", name);
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	readerror = 0;
 | 
						|
	writeerror = 0;
 | 
						|
	rd_ohead(&buf);
 | 
						|
	if(readerror || BADMAGIC(buf)) {
 | 
						|
		fprintf(stderr, "astrip: %s-- bad format\n", name);
 | 
						|
		rd_close();
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	size = OFF_RELO(buf) - SZ_HEAD;
 | 
						|
	buf.oh_flags &= ~HF_LINK;
 | 
						|
	buf.oh_nrelo = 0;
 | 
						|
	buf.oh_nname = 0;
 | 
						|
	buf.oh_nchar = 0;
 | 
						|
 | 
						|
 | 
						|
	if (! wr_open(tname)) {
 | 
						|
		fprintf(stderr, "astrip: cannot create temp file %s\n", tname);
 | 
						|
		rd_close();
 | 
						|
		return(2);
 | 
						|
	}
 | 
						|
	wr_ohead(&buf);
 | 
						|
	if (writeerror) {
 | 
						|
		fprintf(stderr, "astrip: write error on temp file %s\n", tname);
 | 
						|
		rd_close();
 | 
						|
		wr_close();
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	if(copy(name, tname, size)) {
 | 
						|
		rd_close();
 | 
						|
		wr_close();
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	rd_close();
 | 
						|
	wr_close();
 | 
						|
	size += SZ_HEAD;
 | 
						|
	if (! wr_open(name)) {
 | 
						|
		fprintf(stderr, "astrip: cannot write %s\n", name);
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	if (! rd_open(tname)) {
 | 
						|
		fprintf(stderr, "astrip: cannot read temp file %s\n", tname);
 | 
						|
		wr_close();
 | 
						|
		return(2);
 | 
						|
	}
 | 
						|
	if(copy(tname, name, size)) {
 | 
						|
		wr_close();
 | 
						|
		rd_close();
 | 
						|
		return(2);
 | 
						|
	}
 | 
						|
 | 
						|
	wr_close();
 | 
						|
	rd_close();
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
copy(fnam, tnam, size)
 | 
						|
char *fnam;
 | 
						|
char *tnam;
 | 
						|
long size;
 | 
						|
{
 | 
						|
	register s, n;
 | 
						|
	char lbuf[512];
 | 
						|
	int fr, fw;
 | 
						|
 | 
						|
	fr = rd_fd();
 | 
						|
	fw = wr_fd();
 | 
						|
	while(size != (long)0) {
 | 
						|
		s = 512;
 | 
						|
		if(size < 512)
 | 
						|
			s = (int) size;
 | 
						|
		rd_bytes(fr, lbuf, (long) s);
 | 
						|
		if (readerror) {
 | 
						|
			fprintf(stderr, "astrip: unexpected eof on %s\n", fnam);
 | 
						|
			return(1);
 | 
						|
		}
 | 
						|
		wr_bytes(fw, lbuf, (long) s);
 | 
						|
		if (writeerror) {
 | 
						|
			fprintf(stderr, "astrip: write error on %s\n", tnam);
 | 
						|
			return(1);
 | 
						|
		}
 | 
						|
		size -= (long)s;
 | 
						|
	}
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
rd_fatal()
 | 
						|
{
 | 
						|
	readerror = 1;
 | 
						|
}
 | 
						|
 | 
						|
wr_fatal()
 | 
						|
{
 | 
						|
	writeerror = 1;
 | 
						|
}
 |