Blob


1 #include <u.h>
2 #include <libc.h>
3 #include "tapefs.h"
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 */
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 unused2[16];
21 unsigned char checksum[2];
22 } dir[496+8];
24 char buffer[8192];
25 int tapefile;
27 void
28 populate(char *name)
29 {
30 int i, isabs, badcksum, goodcksum;
31 struct tp *tpp;
32 Fileinf f;
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 badcksum = goodcksum = 0;
40 for (i=0, tpp=&dir[8]; i<496; i++, tpp++) {
41 unsigned char *sp = (unsigned char *)tpp;
42 int j, cksum = 0;
43 for (j=0; j<32; j++, sp+=2)
44 cksum += sp[0] + (sp[1]<<8);
45 cksum &= 0xFFFF;
46 if (cksum!=0) {
47 badcksum++;
48 continue;
49 }
50 goodcksum++;
51 if (tpp->name[0]=='\0')
52 continue;
53 f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
54 if (f.addr==0)
55 continue;
56 f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8);
57 f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8)
58 +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24);
59 f.mode = tpp->mode[0]&0777;
60 f.uid = tpp->uid[0];
61 f.gid = tpp->gid[0];
62 isabs = tpp->name[0]=='/';
63 f.name = (char *)tpp->name+isabs;
64 poppath(f, 1);
65 }
66 fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
67 }
69 void
70 popdir(Ram *r)
71 {
72 USED(r);
73 }
75 void
76 dotrunc(Ram *r)
77 {
78 USED(r);
79 }
81 void
82 docreate(Ram *r)
83 {
84 USED(r);
85 }
87 char *
88 doread(Ram *r, vlong off, long cnt)
89 {
90 if (cnt>sizeof(buffer))
91 print("count too big\n");
92 seek(tapefile, 512*r->addr+off, 0);
93 read(tapefile, buffer, cnt);
94 return buffer;
95 }
97 void
98 dowrite(Ram *r, char *buf, long off, long cnt)
99 {
100 USED(r); USED(buf); USED(off); USED(cnt);
103 int
104 dopermw(Ram *r)
106 USED(r);
107 return 0;