tapefs from plan9
This commit is contained in:
parent
21b291a64e
commit
64f7506b34
13 changed files with 2465 additions and 0 deletions
115
src/cmd/tapefs/tapfs.c
Normal file
115
src/cmd/tapefs/tapfs.c
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
#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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue