1bd389b36SDavid du Colombier #include <u.h> 2bd389b36SDavid du Colombier #include <libc.h> 3bd389b36SDavid du Colombier #include "tapefs.h" 4bd389b36SDavid du Colombier 5219b2ee8SDavid du Colombier /* 6219b2ee8SDavid du Colombier * File system for tp tapes. dectape versions have 192 7219b2ee8SDavid du Colombier * entries, magtape have 496. This treats the same 8219b2ee8SDavid du Colombier * by ignoring entries with bad header checksums 9219b2ee8SDavid 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]; 22219b2ee8SDavid du Colombier } dir[496+8]; 23219b2ee8SDavid du Colombier 24219b2ee8SDavid du Colombier char buffer[8192]; 25219b2ee8SDavid du Colombier int tapefile; 26bd389b36SDavid du Colombier 27bd389b36SDavid du Colombier void 28bd389b36SDavid du Colombier populate(char *name) 29bd389b36SDavid du Colombier { 30*7dd7cddfSDavid du Colombier int i, isabs, badcksum, goodcksum; 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"); 38219b2ee8SDavid du Colombier read(tapefile, dir, sizeof dir); 39*7dd7cddfSDavid du Colombier badcksum = goodcksum = 0; 40219b2ee8SDavid du Colombier for (i=0, tpp=&dir[8]; i<496; i++, tpp++) { 41219b2ee8SDavid du Colombier unsigned char *sp = (unsigned char *)tpp; 42219b2ee8SDavid du Colombier int j, cksum = 0; 43219b2ee8SDavid du Colombier for (j=0; j<32; j++, sp+=2) 44219b2ee8SDavid du Colombier cksum += sp[0] + (sp[1]<<8); 45219b2ee8SDavid du Colombier cksum &= 0xFFFF; 46*7dd7cddfSDavid du Colombier if (cksum!=0) { 47*7dd7cddfSDavid du Colombier badcksum++; 48219b2ee8SDavid du Colombier continue; 49*7dd7cddfSDavid du Colombier } 50*7dd7cddfSDavid du Colombier goodcksum++; 51bd389b36SDavid du Colombier if (tpp->name[0]=='\0') 52bd389b36SDavid du Colombier continue; 53bd389b36SDavid du Colombier f.addr = (void *)(tpp->taddress[0] + (tpp->taddress[1]<<8)); 54219b2ee8SDavid du Colombier if (f.addr==0) 55219b2ee8SDavid du Colombier continue; 56bd389b36SDavid du Colombier f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8); 57bd389b36SDavid du Colombier f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8) 58bd389b36SDavid du Colombier +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24); 59bd389b36SDavid du Colombier f.mode = tpp->mode[0]&0777; 60bd389b36SDavid du Colombier isabs = tpp->name[0]=='/'; 61bd389b36SDavid du Colombier f.name = (char *)tpp->name+isabs; 62bd389b36SDavid du Colombier poppath(f, 1); 63bd389b36SDavid du Colombier } 64*7dd7cddfSDavid du Colombier fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum); 65bd389b36SDavid du Colombier } 66bd389b36SDavid du Colombier 67bd389b36SDavid du Colombier void 68bd389b36SDavid du Colombier popdir(Ram *r) 69bd389b36SDavid du Colombier { 70bd389b36SDavid du Colombier USED(r); 71bd389b36SDavid du Colombier } 72bd389b36SDavid du Colombier 73bd389b36SDavid du Colombier void 74bd389b36SDavid du Colombier dotrunc(Ram *r) 75bd389b36SDavid du Colombier { 76bd389b36SDavid du Colombier USED(r); 77bd389b36SDavid du Colombier } 78bd389b36SDavid du Colombier 79bd389b36SDavid du Colombier void 80bd389b36SDavid du Colombier docreate(Ram *r) 81bd389b36SDavid du Colombier { 82bd389b36SDavid du Colombier USED(r); 83bd389b36SDavid du Colombier } 84bd389b36SDavid du Colombier 85bd389b36SDavid du Colombier char * 86bd389b36SDavid du Colombier doread(Ram *r, long off, long cnt) 87bd389b36SDavid du Colombier { 88219b2ee8SDavid du Colombier if (cnt>sizeof(buffer)) 89219b2ee8SDavid du Colombier print("count too big\n"); 90219b2ee8SDavid du Colombier seek(tapefile, 512*(int)r->data+off, 0); 91219b2ee8SDavid du Colombier read(tapefile, buffer, cnt); 92219b2ee8SDavid du Colombier return buffer; 93bd389b36SDavid du Colombier } 94bd389b36SDavid du Colombier 95bd389b36SDavid du Colombier void 96bd389b36SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt) 97bd389b36SDavid du Colombier { 98bd389b36SDavid du Colombier USED(r); USED(buf); USED(off); USED(cnt); 99bd389b36SDavid du Colombier } 100bd389b36SDavid du Colombier 101bd389b36SDavid du Colombier int 102bd389b36SDavid du Colombier dopermw(Ram *r) 103bd389b36SDavid du Colombier { 104bd389b36SDavid du Colombier USED(r); 105bd389b36SDavid du Colombier return 0; 106bd389b36SDavid du Colombier } 107