213 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#define DUK	/* Modifications by Duk Bekema. */
 | 
						|
 | 
						|
/* @(#)astrip.c	1.1 */
 | 
						|
/* $Header$ */
 | 
						|
#define	ushort	unsigned short
 | 
						|
 | 
						|
#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;
 | 
						|
 | 
						|
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;
 | 
						|
	FILE *f;
 | 
						|
 | 
						|
	if ((f = fopen(name,"r")) == NULL) {
 | 
						|
		fprintf(stderr, "astrip: cannot open %s\n", name);
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	getofmt ((char *)&buf, SF_HEAD , f);
 | 
						|
	if(BADMAGIC(buf)) {
 | 
						|
		fprintf(stderr, "astrip: %s-- bad format\n", name);
 | 
						|
		fclose(f);
 | 
						|
		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 ((tf = fopen(tname,"w")) == NULL) {
 | 
						|
		fprintf(stderr, "astrip: cannot create temp file %s\n", tname);
 | 
						|
		fclose(f);
 | 
						|
		return(2);
 | 
						|
	}
 | 
						|
	fseek(tf, (long)0, 0);
 | 
						|
	putofmt((char *)&buf,SF_HEAD,tf,tname);
 | 
						|
	if(copy(name, tname, f, tf, size)) {
 | 
						|
		fclose(f);
 | 
						|
		fclose(tf);
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	fclose(f);
 | 
						|
	fclose(tf);
 | 
						|
	size += SZ_HEAD;
 | 
						|
	if ((f = fopen(name,"w")) == NULL) {
 | 
						|
		fprintf(stderr, "astrip: cannot write %s\n", name);
 | 
						|
		return(1);
 | 
						|
	}
 | 
						|
	if ((tf = fopen(tname,"r")) == NULL) {
 | 
						|
		fprintf(stderr, "astrip: cannot read temp file %s\n", tname);
 | 
						|
		fclose(f);
 | 
						|
		return(2);
 | 
						|
	}
 | 
						|
	fseek(tf, (long)0, 0);
 | 
						|
	if(copy(tname, name, tf, f, size)) {
 | 
						|
		fclose(f);
 | 
						|
		fclose(tf);
 | 
						|
		return(2);
 | 
						|
	}
 | 
						|
 | 
						|
	fclose(f);
 | 
						|
	fclose(tf);
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
copy(fnam, tnam, fr, to, size)
 | 
						|
char *fnam;
 | 
						|
char *tnam;
 | 
						|
long size;
 | 
						|
FILE *fr,*to;
 | 
						|
{
 | 
						|
	register s, n;
 | 
						|
	char lbuf[512];
 | 
						|
 | 
						|
	while(size != (long)0) {
 | 
						|
		s = 512;
 | 
						|
		if(size < 512)
 | 
						|
			s = (int) size;
 | 
						|
		n = fread(lbuf,1,s,fr);
 | 
						|
		if(n != s) {
 | 
						|
			fprintf(stderr, "astrip: unexpected eof on %s\n", fnam);
 | 
						|
			return(1);
 | 
						|
		}
 | 
						|
		n = fwrite(lbuf,1,s,to);
 | 
						|
		if(n != s) {
 | 
						|
			fprintf(stderr, "astrip: write error on %s\n", tnam);
 | 
						|
			return(1);
 | 
						|
		}
 | 
						|
		size -= (long)s;
 | 
						|
	}
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
getofmt(p, s, f)
 | 
						|
register char	*p;
 | 
						|
register char	*s;
 | 
						|
register FILE	*f;
 | 
						|
{
 | 
						|
	register i;
 | 
						|
	register long l;
 | 
						|
 | 
						|
	for (;;) {
 | 
						|
		switch (*s++) {
 | 
						|
/*		case '0': p++; continue; */
 | 
						|
		case '1':
 | 
						|
			*p++ = getc(f);
 | 
						|
			continue;
 | 
						|
		case '2':
 | 
						|
			i = getc(f);
 | 
						|
			i |= (getc(f) << 8);
 | 
						|
#ifndef DUK
 | 
						|
			*((short *)p)++ = i;
 | 
						|
#else DUK
 | 
						|
			*((short *)p) = i;
 | 
						|
			p += sizeof(short);
 | 
						|
#endif DUK
 | 
						|
			continue;
 | 
						|
		case '4':
 | 
						|
			l = (long)getc(f);
 | 
						|
			l |= (long)(getc(f) << 8);
 | 
						|
			l |= ((long)getc(f) << 16);
 | 
						|
			l |= ((long)getc(f) << 24);
 | 
						|
#ifndef DUK
 | 
						|
			*((long *)p)++ = l;
 | 
						|
#else DUK
 | 
						|
			*((long *)p) = l;
 | 
						|
			p += sizeof(long);
 | 
						|
#endif DUK
 | 
						|
			continue;
 | 
						|
		default:
 | 
						|
		case '\0':
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
putofmt(p, s, f, fnam)
 | 
						|
register char	*p;
 | 
						|
register char	*s;
 | 
						|
register FILE	*f;
 | 
						|
char		*fnam;
 | 
						|
{
 | 
						|
	register i,j;
 | 
						|
	register long l;
 | 
						|
 | 
						|
	while (j = *s++) {
 | 
						|
		switch (j -= '0') {
 | 
						|
/*		case 0: p++; break; */
 | 
						|
		case 1:
 | 
						|
			i = *p++; putc(i,f);
 | 
						|
			break;
 | 
						|
		case 2:
 | 
						|
#ifndef DUK
 | 
						|
			i = *((short *)p)++;
 | 
						|
#else DUK
 | 
						|
			i = *((short *)p);
 | 
						|
			p += sizeof(short);
 | 
						|
#endif DUK
 | 
						|
			putc(i,f);
 | 
						|
			i>>=8; putc(i,f);
 | 
						|
			break;
 | 
						|
		case 4:
 | 
						|
#ifndef DUK
 | 
						|
			l = *((long *)p)++;
 | 
						|
#else DUK
 | 
						|
			l = *((long *)p);
 | 
						|
			p += sizeof(long);
 | 
						|
#endif DUK
 | 
						|
			putc(l,f);
 | 
						|
			l >>=8; putc(l,f);
 | 
						|
			l >>=8; putc(l,f);
 | 
						|
			l >>=8; putc(l,f);
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		if (ferror(f)) fprintf(stderr, "astrip: write error on %s\n", fnam);
 | 
						|
	}
 | 
						|
}
 |