xref: /original-bsd/old/arcv/arcv.c (revision c4c3f2a9)
1*c4c3f2a9Sbostic static	char sccsid[] = "@(#)arcv.c 4.2 10/21/88";
201ab68c2Sbill /*
301ab68c2Sbill  * arcv - convert old to new archive format
401ab68c2Sbill  */
501ab68c2Sbill 
601ab68c2Sbill #include <signal.h>
77a00fe69Sbill #include <ar.h>
801ab68c2Sbill #define	OARMAG	0177545
901ab68c2Sbill struct	oar_hdr {
1001ab68c2Sbill 	char	oar_name[14];
1101ab68c2Sbill 	long	oar_date;
1201ab68c2Sbill 	char	oar_uid;
1301ab68c2Sbill 	char	oar_gid;
1401ab68c2Sbill 	int	oar_mode;
1501ab68c2Sbill 	long	oar_size;
1601ab68c2Sbill };
1701ab68c2Sbill 
1801ab68c2Sbill struct	ar_hdr nh;
1901ab68c2Sbill struct	oar_hdr oh;
20*c4c3f2a9Sbostic char	tmp[] = "/usr/tmp/arcXXXXXX";
2101ab68c2Sbill char	*mktemp();
2201ab68c2Sbill int	f;
2301ab68c2Sbill char	buf[512];
2401ab68c2Sbill int	tf;
main(argc,argv)2501ab68c2Sbill main(argc, argv)
2601ab68c2Sbill char *argv[];
2701ab68c2Sbill {
2801ab68c2Sbill 	register i;
2901ab68c2Sbill 
3001ab68c2Sbill 	if (argc>1 && strcmp(argv[1], "-t")==0) {
3101ab68c2Sbill 		argc--;
3201ab68c2Sbill 		argv++;
33*c4c3f2a9Sbostic 	} else {
34*c4c3f2a9Sbostic 		strcpy(tmp, "/tmp/arcXXXXXX");
35*c4c3f2a9Sbostic 	}
36*c4c3f2a9Sbostic 	mktemp(tmp);
3701ab68c2Sbill 	for(i=1; i<4; i++)
3801ab68c2Sbill 		signal(i, SIG_IGN);
3901ab68c2Sbill 	for(i=1; i<argc; i++) {
4001ab68c2Sbill 		if (argc>1)
4101ab68c2Sbill 			printf("%s:\n", argv[i]);
4201ab68c2Sbill 		conv(argv[i]);
4301ab68c2Sbill 	}
4401ab68c2Sbill 	unlink(tmp);
4501ab68c2Sbill 	return(0);
4601ab68c2Sbill }
4701ab68c2Sbill 
conv(fil)4801ab68c2Sbill conv(fil)
4901ab68c2Sbill char *fil;
5001ab68c2Sbill {
5101ab68c2Sbill 	int oldmagic;
5201ab68c2Sbill 	long n;
5301ab68c2Sbill 	unsigned i;
5401ab68c2Sbill 
5501ab68c2Sbill 	f = open(fil, 2);
5601ab68c2Sbill 	if(f < 0) {
5701ab68c2Sbill 		printf("arcv: cannot open %s\n", fil);
5801ab68c2Sbill 		return;
5901ab68c2Sbill 	}
6001ab68c2Sbill 	close(creat(tmp, 0600));
6101ab68c2Sbill 	tf = open(tmp, 2);
6201ab68c2Sbill 	if(tf < 0) {
6301ab68c2Sbill 		printf("arcv: cannot open temp\n");
6401ab68c2Sbill 		close(f);
6501ab68c2Sbill 		return;
6601ab68c2Sbill 	}
6701ab68c2Sbill 	oldmagic = 0;
6801ab68c2Sbill 	read(f, (char *)&oldmagic, sizeof(oldmagic));
6901ab68c2Sbill 	if(oldmagic != 0177545) {
7001ab68c2Sbill 		printf("arcv: %s not old archive format\n", fil);
7101ab68c2Sbill 		close(tf);
7201ab68c2Sbill 		close(f);
7301ab68c2Sbill 		return;
7401ab68c2Sbill 	}
7501ab68c2Sbill 	chkwrite(tf, ARMAG, SARMAG);
7601ab68c2Sbill loop:
7701ab68c2Sbill 	i = read(f, (char *)&oh, sizeof(oh));
7801ab68c2Sbill 	if(i != sizeof(oh))
7901ab68c2Sbill 		goto out;
8001ab68c2Sbill 
8101ab68c2Sbill 	sprintf(buf, "%-16.14s%-12ld%-6u%-6u%-8o%-10ld%-2s",
8201ab68c2Sbill 	   oh.oar_name,
8301ab68c2Sbill 	   oh.oar_date,
8401ab68c2Sbill 	   oh.oar_uid,
8501ab68c2Sbill 	   oh.oar_gid,
8601ab68c2Sbill 	   (unsigned short)oh.oar_mode,
8701ab68c2Sbill 	   oh.oar_size,
8801ab68c2Sbill 	   ARFMAG);
8901ab68c2Sbill 	strncpy((char *)&nh, buf, sizeof(nh));
9001ab68c2Sbill 	n = oh.oar_size;
9101ab68c2Sbill 	chkwrite(tf, (char *)&nh, sizeof(nh));
9201ab68c2Sbill 	while(n > 0) {
9301ab68c2Sbill 		i = 512;
9401ab68c2Sbill 		if (n<i)
9501ab68c2Sbill 			i = n;
9601ab68c2Sbill 		read(f, buf, i&01? i+1:i);
9701ab68c2Sbill 		if (i&01) {
9801ab68c2Sbill 			buf[i] = '\n';
9901ab68c2Sbill 			i++;
10001ab68c2Sbill 		}
10101ab68c2Sbill 		chkwrite(tf, buf, i);
10201ab68c2Sbill 		n -= i;
10301ab68c2Sbill 	}
10401ab68c2Sbill 	goto loop;
10501ab68c2Sbill out:
10601ab68c2Sbill 	lseek(f, 0L, 0);
10701ab68c2Sbill 	lseek(tf, 0L, 0);
10801ab68c2Sbill 	while((i=read(tf, buf, 512)) > 0)
10901ab68c2Sbill 		chkwrite(f, buf, i);
11001ab68c2Sbill 	close(f);
11101ab68c2Sbill 	close(tf);
11201ab68c2Sbill }
11301ab68c2Sbill 
chkwrite(f,b,n)11401ab68c2Sbill chkwrite(f, b, n)
11501ab68c2Sbill char *b;
11601ab68c2Sbill {
11701ab68c2Sbill 	if (write(f, b, n) != n) {
11801ab68c2Sbill 		printf("arcv: write error\n");
11901ab68c2Sbill 		unlink(tmp);
12001ab68c2Sbill 		exit(1);
12101ab68c2Sbill 	}
12201ab68c2Sbill }
123