ref: f0f2d452c873255dec4b3359b3f93e349be0f2c5
dir: /sys/src/cmd/tapefs/tapfs.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[Maxbuf]; 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; }