Blame


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"
4 64f7506b 2006-02-24 devnull
5 64f7506b 2006-02-24 devnull /*
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
9 64f7506b 2006-02-24 devnull */
10 64f7506b 2006-02-24 devnull
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];
23 64f7506b 2006-02-24 devnull
24 64f7506b 2006-02-24 devnull char buffer[8192];
25 64f7506b 2006-02-24 devnull int tapefile;
26 64f7506b 2006-02-24 devnull
27 64f7506b 2006-02-24 devnull void
28 64f7506b 2006-02-24 devnull populate(char *name)
29 64f7506b 2006-02-24 devnull {
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;
33 64f7506b 2006-02-24 devnull
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;
49 64f7506b 2006-02-24 devnull }
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);
65 64f7506b 2006-02-24 devnull }
66 64f7506b 2006-02-24 devnull fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
67 64f7506b 2006-02-24 devnull }
68 64f7506b 2006-02-24 devnull
69 64f7506b 2006-02-24 devnull void
70 64f7506b 2006-02-24 devnull popdir(Ram *r)
71 64f7506b 2006-02-24 devnull {
72 64f7506b 2006-02-24 devnull USED(r);
73 64f7506b 2006-02-24 devnull }
74 64f7506b 2006-02-24 devnull
75 64f7506b 2006-02-24 devnull void
76 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
77 64f7506b 2006-02-24 devnull {
78 64f7506b 2006-02-24 devnull USED(r);
79 64f7506b 2006-02-24 devnull }
80 64f7506b 2006-02-24 devnull
81 64f7506b 2006-02-24 devnull void
82 64f7506b 2006-02-24 devnull docreate(Ram *r)
83 64f7506b 2006-02-24 devnull {
84 64f7506b 2006-02-24 devnull USED(r);
85 64f7506b 2006-02-24 devnull }
86 64f7506b 2006-02-24 devnull
87 64f7506b 2006-02-24 devnull char *
88 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
89 64f7506b 2006-02-24 devnull {
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;
95 64f7506b 2006-02-24 devnull }
96 64f7506b 2006-02-24 devnull
97 64f7506b 2006-02-24 devnull void
98 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
99 64f7506b 2006-02-24 devnull {
100 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
101 64f7506b 2006-02-24 devnull }
102 64f7506b 2006-02-24 devnull
103 64f7506b 2006-02-24 devnull int
104 64f7506b 2006-02-24 devnull dopermw(Ram *r)
105 64f7506b 2006-02-24 devnull {
106 64f7506b 2006-02-24 devnull USED(r);
107 64f7506b 2006-02-24 devnull return 0;
108 64f7506b 2006-02-24 devnull }