Research V7 development
[unix-history] / usr / src / cmd / arcv.c
/*
* 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);
}