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