BSD 4_3_Reno release
[unix-history] / usr / src / old / arcv / arcv.c
CommitLineData
1c15e888 1static char sccsid[] = "@(#)arcv.c 4.2 10/21/88";
b6874cb1
BJ
2/*
3 * arcv - convert old to new archive format
4 */
5
6#include <signal.h>
c3348be5 7#include <ar.h>
b6874cb1
BJ
8#define OARMAG 0177545
9struct 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
18struct ar_hdr nh;
19struct oar_hdr oh;
e2faf5d5 20char tmp[] = "/usr/tmp/arcXXXXXX";
b6874cb1
BJ
21char *mktemp();
22int f;
23char buf[512];
24int tf;
25main(argc, argv)
26char *argv[];
27{
28 register i;
29
30 if (argc>1 && strcmp(argv[1], "-t")==0) {
b6874cb1
BJ
31 argc--;
32 argv++;
e2faf5d5
KB
33 } else {
34 strcpy(tmp, "/tmp/arcXXXXXX");
35 }
36 mktemp(tmp);
b6874cb1
BJ
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
48conv(fil)
49char *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);
76loop:
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;
105out:
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
114chkwrite(f, b, n)
115char *b;
116{
117 if (write(f, b, n) != n) {
118 printf("arcv: write error\n");
119 unlink(tmp);
120 exit(1);
121 }
122}