V7M/src/cmd/arcv.c

Compare this file to the similar file:
Show the results in this format:

/*
 * Convert old to new archive format
*/

#include <signal.h>
#include <ar.h>

#define	omag	0177555

struct	ar_hdr nh;
struct
{
	char	oname[8];
	long	odate;
	char	ouid;
	char	omode;
	unsigned siz;
} oh;

char	*tmp;
char	*mktemp();
int	f;
int	tf;
union {
	char	buf[512];
	int	magic;
} b;

main(argc, argv)
char *argv[];
{
	register i;

	tmp = mktemp("/tmp/arcXXXXX");
	for(i=1; i<4; i++)
		signal(i, SIG_IGN);
	for(i=1; i<argc; i++)
		conv(argv[i]);
	unlink(tmp);
}

conv(fil)
char *fil;
{
	register unsigned i, n;

	f = open(fil, 2);
	if(f < 0) {
		printf("arcv: cannot open %s\n", fil);
		return;
	}
	close(creat(tmp, 0600));
	tf = open(tmp, 2);
	if(tf < 0) {
		printf("arcv: cannot open temp\n");
		close(f);
		return;
	}
	b.magic = 0;
	read(f, (char *)&b.magic, sizeof(b.magic));
	if(b.magic != omag) {
		printf("arcv: %s not archive format\n", fil);
		close(tf);
		close(f);
		return;
	}
	b.magic = ARMAG;
	write(tf, (char *)&b.magic, sizeof(b.magic));
loop:
	i = read(f, (char *)&oh, sizeof(oh));
	if(i != sizeof(oh))
		goto out;
	for(i=0; i<8; i++)
		nh.ar_name[i] = oh.oname[i];
	nh.ar_size = oh.siz;
	nh.ar_uid = oh.ouid;
	nh.ar_gid = 1;
	nh.ar_mode = 0666;
	nh.ar_date = oh.odate;
	n = (oh.siz+1) & ~01;
	write(tf, (char *)&nh, sizeof(nh));
	while(n > 0) {
		i = 512;
		if(n < i)
			i = n;
		read(f, b.buf, i);
		write(tf, b.buf, i);
		n -= i;
	}
	goto loop;
out:
	lseek(f, 0L, 0);
	lseek(tf, 0L, 0);
	while((i=read(tf, b.buf, 512)) > 0)
		write(f, b.buf, i);
	close(f);
	close(tf);
}