Fixing so that can compile with FLEXNAMES turned off
[unix-history] / usr / src / old / arcv / arcv.c
CommitLineData
def89b26 1static char sccsid[] = "@(#)arcv.c 4.1 %G%";
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;
20char *tmp;
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) {
31 tmp = mktemp("/usr/tmp/arcXXXXXX");
32 argc--;
33 argv++;
34 } else
35 tmp = mktemp("/tmp/arcXXXXXX");
36 for(i=1; i<4; i++)
37 signal(i, SIG_IGN);
38 for(i=1; i<argc; i++) {
39 if (argc>1)
40 printf("%s:\n", argv[i]);
41 conv(argv[i]);
42 }
43 unlink(tmp);
44 return(0);
45}
46
47conv(fil)
48char *fil;
49{
50 int oldmagic;
51 long n;
52 unsigned i;
53
54 f = open(fil, 2);
55 if(f < 0) {
56 printf("arcv: cannot open %s\n", fil);
57 return;
58 }
59 close(creat(tmp, 0600));
60 tf = open(tmp, 2);
61 if(tf < 0) {
62 printf("arcv: cannot open temp\n");
63 close(f);
64 return;
65 }
66 oldmagic = 0;
67 read(f, (char *)&oldmagic, sizeof(oldmagic));
68 if(oldmagic != 0177545) {
69 printf("arcv: %s not old archive format\n", fil);
70 close(tf);
71 close(f);
72 return;
73 }
74 chkwrite(tf, ARMAG, SARMAG);
75loop:
76 i = read(f, (char *)&oh, sizeof(oh));
77 if(i != sizeof(oh))
78 goto out;
79
80 sprintf(buf, "%-16.14s%-12ld%-6u%-6u%-8o%-10ld%-2s",
81 oh.oar_name,
82 oh.oar_date,
83 oh.oar_uid,
84 oh.oar_gid,
85 (unsigned short)oh.oar_mode,
86 oh.oar_size,
87 ARFMAG);
88 strncpy((char *)&nh, buf, sizeof(nh));
89 n = oh.oar_size;
90 chkwrite(tf, (char *)&nh, sizeof(nh));
91 while(n > 0) {
92 i = 512;
93 if (n<i)
94 i = n;
95 read(f, buf, i&01? i+1:i);
96 if (i&01) {
97 buf[i] = '\n';
98 i++;
99 }
100 chkwrite(tf, buf, i);
101 n -= i;
102 }
103 goto loop;
104out:
105 lseek(f, 0L, 0);
106 lseek(tf, 0L, 0);
107 while((i=read(tf, buf, 512)) > 0)
108 chkwrite(f, buf, i);
109 close(f);
110 close(tf);
111}
112
113chkwrite(f, b, n)
114char *b;
115{
116 if (write(f, b, n) != n) {
117 printf("arcv: write error\n");
118 unlink(tmp);
119 exit(1);
120 }
121}