1*219b2ee8SDavid du Colombier #include <u.h> 2*219b2ee8SDavid du Colombier #include <libc.h> 3*219b2ee8SDavid du Colombier #include "tapefs.h" 4*219b2ee8SDavid du Colombier 5*219b2ee8SDavid du Colombier /* 6*219b2ee8SDavid du Colombier * File system for old tap tapes. 7*219b2ee8SDavid du Colombier */ 8*219b2ee8SDavid du Colombier 9*219b2ee8SDavid du Colombier struct tap { 10*219b2ee8SDavid du Colombier unsigned char name[32]; 11*219b2ee8SDavid du Colombier unsigned char mode[1]; 12*219b2ee8SDavid du Colombier unsigned char uid[1]; 13*219b2ee8SDavid du Colombier unsigned char size[2]; 14*219b2ee8SDavid du Colombier unsigned char tmod[4]; 15*219b2ee8SDavid du Colombier unsigned char taddress[2]; 16*219b2ee8SDavid du Colombier unsigned char unused[20]; 17*219b2ee8SDavid du Colombier unsigned char checksum[2]; 18*219b2ee8SDavid du Colombier } dir[192]; 19*219b2ee8SDavid du Colombier 20*219b2ee8SDavid du Colombier int tapefile; 21*219b2ee8SDavid du Colombier char buffer[8192]; 22*219b2ee8SDavid du Colombier long cvtime(unsigned char *); 23*219b2ee8SDavid du Colombier 24*219b2ee8SDavid du Colombier void 25*219b2ee8SDavid du Colombier populate(char *name) 26*219b2ee8SDavid du Colombier { 27*219b2ee8SDavid du Colombier int i, isabs; 28*219b2ee8SDavid du Colombier struct tap *tpp; 29*219b2ee8SDavid du Colombier Fileinf f; 30*219b2ee8SDavid du Colombier 31*219b2ee8SDavid du Colombier replete = 1; 32*219b2ee8SDavid du Colombier tapefile = open(name, OREAD); 33*219b2ee8SDavid du Colombier if (tapefile<0) 34*219b2ee8SDavid du Colombier error("Can't open argument file"); 35*219b2ee8SDavid du Colombier read(tapefile, dir, sizeof dir); 36*219b2ee8SDavid du Colombier for (i=0, tpp=&dir[8]; i<192; i++, tpp++) { 37*219b2ee8SDavid du Colombier unsigned char *sp = (unsigned char *)tpp; 38*219b2ee8SDavid du Colombier int j, cksum = 0; 39*219b2ee8SDavid du Colombier for (j=0; j<32; j++, sp+=2) 40*219b2ee8SDavid du Colombier cksum += sp[0] + (sp[1]<<8); 41*219b2ee8SDavid du Colombier cksum &= 0xFFFF; 42*219b2ee8SDavid du Colombier if (cksum!=0) 43*219b2ee8SDavid du Colombier continue; 44*219b2ee8SDavid du Colombier if (tpp->name[0]=='\0') 45*219b2ee8SDavid du Colombier continue; 46*219b2ee8SDavid du Colombier f.addr = (void *)(tpp->taddress[0] + (tpp->taddress[1]<<8)); 47*219b2ee8SDavid du Colombier if (f.addr==0) 48*219b2ee8SDavid du Colombier continue; 49*219b2ee8SDavid du Colombier f.size = tpp->size[0] + (tpp->size[1]<<8); 50*219b2ee8SDavid du Colombier f.mdate = cvtime(tpp->tmod); 51*219b2ee8SDavid du Colombier f.mode = tpp->mode[0]&0777; 52*219b2ee8SDavid du Colombier isabs = tpp->name[0]=='/'; 53*219b2ee8SDavid du Colombier f.name = (char *)tpp->name+isabs; 54*219b2ee8SDavid du Colombier poppath(f, 1); 55*219b2ee8SDavid du Colombier } 56*219b2ee8SDavid du Colombier } 57*219b2ee8SDavid du Colombier 58*219b2ee8SDavid du Colombier long 59*219b2ee8SDavid du Colombier cvtime(unsigned char *tp) 60*219b2ee8SDavid du Colombier { 61*219b2ee8SDavid du Colombier unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0); 62*219b2ee8SDavid du Colombier t /= 60; 63*219b2ee8SDavid du Colombier t += 2*365*24*3600; 64*219b2ee8SDavid du Colombier return t; 65*219b2ee8SDavid du Colombier } 66*219b2ee8SDavid du Colombier 67*219b2ee8SDavid du Colombier void 68*219b2ee8SDavid du Colombier popdir(Ram *r) 69*219b2ee8SDavid du Colombier { 70*219b2ee8SDavid du Colombier USED(r); 71*219b2ee8SDavid du Colombier } 72*219b2ee8SDavid du Colombier 73*219b2ee8SDavid du Colombier void 74*219b2ee8SDavid du Colombier dotrunc(Ram *r) 75*219b2ee8SDavid du Colombier { 76*219b2ee8SDavid du Colombier USED(r); 77*219b2ee8SDavid du Colombier } 78*219b2ee8SDavid du Colombier 79*219b2ee8SDavid du Colombier void 80*219b2ee8SDavid du Colombier docreate(Ram *r) 81*219b2ee8SDavid du Colombier { 82*219b2ee8SDavid du Colombier USED(r); 83*219b2ee8SDavid du Colombier } 84*219b2ee8SDavid du Colombier 85*219b2ee8SDavid du Colombier char * 86*219b2ee8SDavid du Colombier doread(Ram *r, long off, long cnt) 87*219b2ee8SDavid du Colombier { 88*219b2ee8SDavid du Colombier if (cnt>sizeof(buffer)) 89*219b2ee8SDavid du Colombier print("count too big\n"); 90*219b2ee8SDavid du Colombier seek(tapefile, 512*(int)r->data+off, 0); 91*219b2ee8SDavid du Colombier read(tapefile, buffer, cnt); 92*219b2ee8SDavid du Colombier return buffer; 93*219b2ee8SDavid du Colombier } 94*219b2ee8SDavid du Colombier 95*219b2ee8SDavid du Colombier void 96*219b2ee8SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt) 97*219b2ee8SDavid du Colombier { 98*219b2ee8SDavid du Colombier USED(r); USED(buf); USED(off); USED(cnt); 99*219b2ee8SDavid du Colombier } 100*219b2ee8SDavid du Colombier 101*219b2ee8SDavid du Colombier int 102*219b2ee8SDavid du Colombier dopermw(Ram *r) 103*219b2ee8SDavid du Colombier { 104*219b2ee8SDavid du Colombier USED(r); 105*219b2ee8SDavid du Colombier return 0; 106*219b2ee8SDavid du Colombier } 107