ack/util/amisc/astrip.c
2019-03-24 23:53:13 +08:00

157 lines
2.9 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".
*/
/* $Id$ */
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/stat.h>
#include "system.h"
#include "object.h"
#include "out.h"
/*
astrip -- remove symbols and relocation bits
*/
char tname[L_tmpnam];
FILE *tf;
struct outhead buf;
int readerror, writeerror;
static int copy(char *, char *, long, FILE *, FILE *);
static int strip(char *);
int main(int argc, char **argv)
{
int status;
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
if (sys_tmpnam(tname)==NULL)
{
fprintf(stderr, "astrip: cannot create temporary filename\n");
return(1);
}
fclose(fopen(tname,"wb"));
while(--argc) {
if ((status = strip(argv[argc])) > 1)
break;
}
remove(tname);
return status;
}
int strip(char *name)
{
long size;
FILE *fw;
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);
wr_close();
if (writeerror) {
fprintf(stderr, "astrip: write error on temp file %s\n", tname);
rd_close();
return(1);
}
fw = fopen(tname, "ab");
if ((fw == NULL) || (fseek(fw, (long)SZ_HEAD, SEEK_SET)!=0)) {
fprintf(stderr, "astrip: cannot create temp file %s\n", tname);
rd_close();
fclose(fw);
return(2);
}
if(copy(name, tname, size, rd_fd(), fw)) {
rd_close();
fclose(fw);
return(1);
}
rd_close();
fclose(fw);
size += SZ_HEAD;
if (! rd_open(tname)) {
fprintf(stderr, "astrip: cannot read temp file %s\n", tname);
return(2);
}
fw = fopen(name, "wb");
if (fw == NULL) {
fprintf(stderr, "astrip: cannot write %s\n", name);
rd_close();
return(1);
}
if(copy(tname, name, size, rd_fd(), fw)) {
fclose(fw);
rd_close();
return(2);
}
fclose(fw);
rd_close();
/* Change the mode to everything. */
chmod(name,S_IRWXU | S_IRWXG | S_IRWXO);
return(0);
}
static int copy(char *fnam, char *tnam, long size, FILE *fr, FILE *fw)
{
register int s;
char lbuf[512];
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);
}
void rd_fatal(void)
{
readerror = 1;
}
void wr_fatal(void)
{
writeerror = 1;
}