xref: /original-bsd/old/arcv/arcv.c (revision e59fb703)
1 static	char sccsid[] = "@(#)arcv.c 4.2 10/21/88";
2 /*
3  * arcv - convert old to new archive format
4  */
5 
6 #include <signal.h>
7 #include <ar.h>
8 #define	OARMAG	0177545
9 struct	oar_hdr {
10 	char	oar_name[14];
11 	long	oar_date;
12 	char	oar_uid;
13 	char	oar_gid;
14 	int	oar_mode;
15 	long	oar_size;
16 };
17 
18 struct	ar_hdr nh;
19 struct	oar_hdr oh;
20 char	tmp[] = "/usr/tmp/arcXXXXXX";
21 char	*mktemp();
22 int	f;
23 char	buf[512];
24 int	tf;
25 main(argc, argv)
26 char *argv[];
27 {
28 	register i;
29 
30 	if (argc>1 && strcmp(argv[1], "-t")==0) {
31 		argc--;
32 		argv++;
33 	} else {
34 		strcpy(tmp, "/tmp/arcXXXXXX");
35 	}
36 	mktemp(tmp);
37 	for(i=1; i<4; i++)
38 		signal(i, SIG_IGN);
39 	for(i=1; i<argc; i++) {
40 		if (argc>1)
41 			printf("%s:\n", argv[i]);
42 		conv(argv[i]);
43 	}
44 	unlink(tmp);
45 	return(0);
46 }
47 
48 conv(fil)
49 char *fil;
50 {
51 	int oldmagic;
52 	long n;
53 	unsigned i;
54 
55 	f = open(fil, 2);
56 	if(f < 0) {
57 		printf("arcv: cannot open %s\n", fil);
58 		return;
59 	}
60 	close(creat(tmp, 0600));
61 	tf = open(tmp, 2);
62 	if(tf < 0) {
63 		printf("arcv: cannot open temp\n");
64 		close(f);
65 		return;
66 	}
67 	oldmagic = 0;
68 	read(f, (char *)&oldmagic, sizeof(oldmagic));
69 	if(oldmagic != 0177545) {
70 		printf("arcv: %s not old archive format\n", fil);
71 		close(tf);
72 		close(f);
73 		return;
74 	}
75 	chkwrite(tf, ARMAG, SARMAG);
76 loop:
77 	i = read(f, (char *)&oh, sizeof(oh));
78 	if(i != sizeof(oh))
79 		goto out;
80 
81 	sprintf(buf, "%-16.14s%-12ld%-6u%-6u%-8o%-10ld%-2s",
82 	   oh.oar_name,
83 	   oh.oar_date,
84 	   oh.oar_uid,
85 	   oh.oar_gid,
86 	   (unsigned short)oh.oar_mode,
87 	   oh.oar_size,
88 	   ARFMAG);
89 	strncpy((char *)&nh, buf, sizeof(nh));
90 	n = oh.oar_size;
91 	chkwrite(tf, (char *)&nh, sizeof(nh));
92 	while(n > 0) {
93 		i = 512;
94 		if (n<i)
95 			i = n;
96 		read(f, buf, i&01? i+1:i);
97 		if (i&01) {
98 			buf[i] = '\n';
99 			i++;
100 		}
101 		chkwrite(tf, buf, i);
102 		n -= i;
103 	}
104 	goto loop;
105 out:
106 	lseek(f, 0L, 0);
107 	lseek(tf, 0L, 0);
108 	while((i=read(tf, buf, 512)) > 0)
109 		chkwrite(f, buf, i);
110 	close(f);
111 	close(tf);
112 }
113 
114 chkwrite(f, b, n)
115 char *b;
116 {
117 	if (write(f, b, n) != n) {
118 		printf("arcv: write error\n");
119 		unlink(tmp);
120 		exit(1);
121 	}
122 }
123