115 lines
1.9 KiB
C
115 lines
1.9 KiB
C
#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;
|
|
}
|