#include <u.h>
#include <libc.h>
#include "tapefs.h"
/*
* File system for old tap tapes.
*/
struct tap {
unsigned char name[32];
unsigned char mode[1];
unsigned char uid[1];
unsigned char size[2];
unsigned char tmod[4];
unsigned char taddress[2];
unsigned char unused[20];
unsigned char checksum[2];
} dir[192];
int tapefile;
char buffer[8192];
long cvtime(unsigned char *);
extern int verbose;
extern int newtap;
void
populate(char *name)
{
int i, isabs;
struct tap *tpp;
Fileinf f;
replete = 1;
tapefile = open(name, OREAD);
if (tapefile<0)
error("Can't open argument file");
read(tapefile, dir, sizeof dir);
for (i=0, tpp=&dir[8]; i<192; i++, tpp++) {
unsigned char *sp = (unsigned char *)tpp;
int j, cksum = 0;
for (j=0; j<32; j++, sp+=2)
cksum += sp[0] + (sp[1]<<8);
cksum &= 0xFFFF;
if (cksum!=0) {
print("cksum failure\n");
continue;
}
if (tpp->name[0]=='\0')
continue;
f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
if (f.addr==0)
continue;
f.size = tpp->size[0] + (tpp->size[1]<<8);
f.mdate = cvtime(tpp->tmod);
f.mode = tpp->mode[0]&0777;
f.uid = tpp->uid[0]&0377;
isabs = tpp->name[0]=='/';
f.name = (char *)tpp->name+isabs;
if (verbose)
print("%s mode %o uid %d, %s", f.name, f.mode, f.uid, ctime(f.mdate));
poppath(f, 1);
}
}
long
cvtime(unsigned char *tp)
{
unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0);
if (!newtap) {
t /= 60;
t += 3*365*24*3600;
}
return t;
}
void
popdir(Ram *r)
{
USED(r);
}
void
dotrunc(Ram *r)
{
USED(r);
}
void
docreate(Ram *r)
{
USED(r);
}
char *
doread(Ram *r, vlong off, long cnt)
{
if (cnt>sizeof(buffer))
print("count too big\n");
seek(tapefile, 512*r->addr+off, 0);
read(tapefile, buffer, cnt);
return buffer;
}
void
dowrite(Ram *r, char *buf, long off, long cnt)
{
USED(r); USED(buf); USED(off); USED(cnt);
}
int
dopermw(Ram *r)
{
USED(r);
return 0;
}
|