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/tpfs.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/tpfs.c')
-rw-r--r-- | src/cmd/tapefs/tpfs.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/cmd/tapefs/tpfs.c b/src/cmd/tapefs/tpfs.c new file mode 100644 index 00000000..02079a3a --- /dev/null +++ b/src/cmd/tapefs/tpfs.c @@ -0,0 +1,108 @@ +#include <u.h> +#include <libc.h> +#include "tapefs.h" + +/* + * File system for tp tapes. dectape versions have 192 + * entries, magtape have 496. This treats the same + * by ignoring entries with bad header checksums + */ + +struct tp { + unsigned char name[32]; + unsigned char mode[2]; + unsigned char uid[1]; + unsigned char gid[1]; + unsigned char unused[1]; + unsigned char size[3]; + unsigned char tmod[4]; + unsigned char taddress[2]; + unsigned char unused2[16]; + unsigned char checksum[2]; +} dir[496+8]; + +char buffer[8192]; +int tapefile; + +void +populate(char *name) +{ + int i, isabs, badcksum, goodcksum; + struct tp *tpp; + Fileinf f; + + replete = 1; + tapefile = open(name, OREAD); + if (tapefile<0) + error("Can't open argument file"); + read(tapefile, dir, sizeof dir); + badcksum = goodcksum = 0; + for (i=0, tpp=&dir[8]; i<496; 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) { + badcksum++; + continue; + } + goodcksum++; + 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]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8); + f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8) + +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24); + f.mode = tpp->mode[0]&0777; + f.uid = tpp->uid[0]; + f.gid = tpp->gid[0]; + isabs = tpp->name[0]=='/'; + f.name = (char *)tpp->name+isabs; + poppath(f, 1); + } + fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum); +} + +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; +} |