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