Files
retrobsd/src/cmd/strip.c
2014-04-09 14:27:18 +01:00

88 lines
1.8 KiB
C

/*
* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifdef CROSS
# include </usr/include/stdio.h>
#else
# include <stdio.h>
#endif
#include <a.out.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
struct exec head;
int status;
void
strip(name)
char *name;
{
register int f;
long size;
f = open(name, O_RDWR);
if (f < 0) {
fprintf(stderr, "strip: "); perror(name);
status = 1;
goto out;
}
if (read(f, (char *)&head, sizeof (head)) < 0 || N_BADMAG(head)) {
printf("strip: %s not in a.out format\n", name);
status = 1;
goto out;
}
if (head.a_syms == 0 && head.a_magic != RMAGIC)
goto out;
size = N_DATOFF(head) + head.a_data;
if (ftruncate(f, size) < 0) {
fprintf(stderr, "strip: ");
perror(name);
status = 1;
goto out;
}
head.a_magic = OMAGIC;
head.a_reltext = 0;
head.a_reldata = 0;
head.a_syms = 0;
(void) lseek(f, (off_t)0, SEEK_SET);
(void) write(f, (char *)&head, sizeof (head));
out:
close(f);
}
int
main(argc, argv)
char *argv[];
{
register int i;
while ((i = getopt(argc, argv, "h")) != EOF) {
switch(i) {
case 'h':
default:
usage: fprintf(stderr, "Usage:\n");
fprintf(stderr, " strip file...\n");
return(1);
}
}
argc -= optind;
argv += optind;
if (argc == 0)
goto usage;
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
for (i = 0; i < argc; i++) {
strip(argv[i]);
if (status > 1)
break;
}
return(status);
}