diff options
author | rsc <devnull@localhost> | 2006-02-24 21:17:00 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2006-02-24 21:17:00 +0000 |
commit | 64f7506b34106955fbbd5f6bf944ecd839610672 (patch) | |
tree | fa1efe1df3804519ef796042c457a34a2d9e187f /src/cmd/tapefs/tapfs.c | |
parent | 21b291a64e4f059744b4094a8f8e52784ad323f4 (diff) | |
download | plan9port-64f7506b34106955fbbd5f6bf944ecd839610672.tar.gz plan9port-64f7506b34106955fbbd5f6bf944ecd839610672.tar.bz2 plan9port-64f7506b34106955fbbd5f6bf944ecd839610672.zip |
tapefs from plan9
Diffstat (limited to 'src/cmd/tapefs/tapfs.c')
-rw-r--r-- | src/cmd/tapefs/tapfs.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/cmd/tapefs/tapfs.c b/src/cmd/tapefs/tapfs.c new file mode 100644 index 00000000..fb1738c2 --- /dev/null +++ b/src/cmd/tapefs/tapfs.c @@ -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; +} |