1 64f7506b 2006-02-24 devnull #include <u.h>
2 64f7506b 2006-02-24 devnull #include <libc.h>
3 64f7506b 2006-02-24 devnull #include "tapefs.h"
6 64f7506b 2006-02-24 devnull * File system for tp tapes. dectape versions have 192
7 64f7506b 2006-02-24 devnull * entries, magtape have 496. This treats the same
8 64f7506b 2006-02-24 devnull * by ignoring entries with bad header checksums
11 64f7506b 2006-02-24 devnull struct tp {
12 64f7506b 2006-02-24 devnull unsigned char name[32];
13 64f7506b 2006-02-24 devnull unsigned char mode[2];
14 64f7506b 2006-02-24 devnull unsigned char uid[1];
15 64f7506b 2006-02-24 devnull unsigned char gid[1];
16 64f7506b 2006-02-24 devnull unsigned char unused[1];
17 64f7506b 2006-02-24 devnull unsigned char size[3];
18 64f7506b 2006-02-24 devnull unsigned char tmod[4];
19 64f7506b 2006-02-24 devnull unsigned char taddress[2];
20 64f7506b 2006-02-24 devnull unsigned char unused2[16];
21 64f7506b 2006-02-24 devnull unsigned char checksum[2];
22 64f7506b 2006-02-24 devnull } dir[496+8];
24 64f7506b 2006-02-24 devnull char buffer[8192];
25 64f7506b 2006-02-24 devnull int tapefile;
28 64f7506b 2006-02-24 devnull populate(char *name)
30 64f7506b 2006-02-24 devnull int i, isabs, badcksum, goodcksum;
31 64f7506b 2006-02-24 devnull struct tp *tpp;
32 64f7506b 2006-02-24 devnull Fileinf f;
34 64f7506b 2006-02-24 devnull replete = 1;
35 64f7506b 2006-02-24 devnull tapefile = open(name, OREAD);
36 64f7506b 2006-02-24 devnull if (tapefile<0)
37 64f7506b 2006-02-24 devnull error("Can't open argument file");
38 64f7506b 2006-02-24 devnull read(tapefile, dir, sizeof dir);
39 64f7506b 2006-02-24 devnull badcksum = goodcksum = 0;
40 64f7506b 2006-02-24 devnull for (i=0, tpp=&dir[8]; i<496; i++, tpp++) {
41 64f7506b 2006-02-24 devnull unsigned char *sp = (unsigned char *)tpp;
42 64f7506b 2006-02-24 devnull int j, cksum = 0;
43 64f7506b 2006-02-24 devnull for (j=0; j<32; j++, sp+=2)
44 64f7506b 2006-02-24 devnull cksum += sp[0] + (sp[1]<<8);
45 64f7506b 2006-02-24 devnull cksum &= 0xFFFF;
46 64f7506b 2006-02-24 devnull if (cksum!=0) {
47 64f7506b 2006-02-24 devnull badcksum++;
48 64f7506b 2006-02-24 devnull continue;
50 64f7506b 2006-02-24 devnull goodcksum++;
51 64f7506b 2006-02-24 devnull if (tpp->name[0]=='\0')
52 64f7506b 2006-02-24 devnull continue;
53 64f7506b 2006-02-24 devnull f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
54 64f7506b 2006-02-24 devnull if (f.addr==0)
55 64f7506b 2006-02-24 devnull continue;
56 64f7506b 2006-02-24 devnull f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8);
57 64f7506b 2006-02-24 devnull f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8)
58 64f7506b 2006-02-24 devnull +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24);
59 64f7506b 2006-02-24 devnull f.mode = tpp->mode[0]&0777;
60 64f7506b 2006-02-24 devnull f.uid = tpp->uid[0];
61 64f7506b 2006-02-24 devnull f.gid = tpp->gid[0];
62 64f7506b 2006-02-24 devnull isabs = tpp->name[0]=='/';
63 64f7506b 2006-02-24 devnull f.name = (char *)tpp->name+isabs;
64 64f7506b 2006-02-24 devnull poppath(f, 1);
66 64f7506b 2006-02-24 devnull fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
70 64f7506b 2006-02-24 devnull popdir(Ram *r)
76 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
82 64f7506b 2006-02-24 devnull docreate(Ram *r)
88 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
90 64f7506b 2006-02-24 devnull if (cnt>sizeof(buffer))
91 64f7506b 2006-02-24 devnull print("count too big\n");
92 64f7506b 2006-02-24 devnull seek(tapefile, 512*r->addr+off, 0);
93 64f7506b 2006-02-24 devnull read(tapefile, buffer, cnt);
94 64f7506b 2006-02-24 devnull return buffer;
98 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
100 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
104 64f7506b 2006-02-24 devnull dopermw(Ram *r)
106 64f7506b 2006-02-24 devnull USED(r);
107 64f7506b 2006-02-24 devnull return 0;