Blame


1 7763a61a 2003-11-23 devnull #include "stdinc.h"
2 7763a61a 2003-11-23 devnull #include "vac.h"
3 7763a61a 2003-11-23 devnull #include "dat.h"
4 7763a61a 2003-11-23 devnull #include "fns.h"
5 7763a61a 2003-11-23 devnull
6 7763a61a 2003-11-23 devnull static char EBadVacFormat[] = "bad format for vac file";
7 7763a61a 2003-11-23 devnull
8 7763a61a 2003-11-23 devnull static VacFS *
9 7763a61a 2003-11-23 devnull vfsAlloc(VtSession *z, int bsize, long ncache)
10 7763a61a 2003-11-23 devnull {
11 7763a61a 2003-11-23 devnull VacFS *fs;
12 7763a61a 2003-11-23 devnull
13 7763a61a 2003-11-23 devnull fs = vtMemAllocZ(sizeof(VacFS));
14 7763a61a 2003-11-23 devnull fs->ref = 1;
15 7763a61a 2003-11-23 devnull fs->z = z;
16 7763a61a 2003-11-23 devnull fs->bsize = bsize;
17 7763a61a 2003-11-23 devnull fs->cache = cacheAlloc(z, bsize, ncache);
18 7763a61a 2003-11-23 devnull return fs;
19 7763a61a 2003-11-23 devnull }
20 7763a61a 2003-11-23 devnull
21 7763a61a 2003-11-23 devnull static int
22 7763a61a 2003-11-23 devnull readScore(int fd, uchar score[VtScoreSize])
23 7763a61a 2003-11-23 devnull {
24 7763a61a 2003-11-23 devnull char buf[44];
25 7763a61a 2003-11-23 devnull int i, n, c;
26 7763a61a 2003-11-23 devnull
27 7763a61a 2003-11-23 devnull n = readn(fd, buf, sizeof(buf));
28 7763a61a 2003-11-23 devnull if(n < sizeof(buf)) {
29 7763a61a 2003-11-23 devnull vtSetError("short read");
30 7763a61a 2003-11-23 devnull return 0;
31 7763a61a 2003-11-23 devnull }
32 7763a61a 2003-11-23 devnull if(strncmp(buf, "vac:", 4) != 0) {
33 7763a61a 2003-11-23 devnull vtSetError("not a vac file");
34 7763a61a 2003-11-23 devnull return 0;
35 7763a61a 2003-11-23 devnull }
36 7763a61a 2003-11-23 devnull memset(score, 0, VtScoreSize);
37 7763a61a 2003-11-23 devnull for(i=4; i<sizeof(buf); i++) {
38 7763a61a 2003-11-23 devnull if(buf[i] >= '0' && buf[i] <= '9')
39 7763a61a 2003-11-23 devnull c = buf[i] - '0';
40 7763a61a 2003-11-23 devnull else if(buf[i] >= 'a' && buf[i] <= 'f')
41 7763a61a 2003-11-23 devnull c = buf[i] - 'a' + 10;
42 7763a61a 2003-11-23 devnull else if(buf[i] >= 'A' && buf[i] <= 'F')
43 7763a61a 2003-11-23 devnull c = buf[i] - 'A' + 10;
44 7763a61a 2003-11-23 devnull else {
45 7763a61a 2003-11-23 devnull vtSetError("bad format for venti score");
46 7763a61a 2003-11-23 devnull return 0;
47 7763a61a 2003-11-23 devnull }
48 7763a61a 2003-11-23 devnull if((i & 1) == 0)
49 7763a61a 2003-11-23 devnull c <<= 4;
50 7763a61a 2003-11-23 devnull
51 7763a61a 2003-11-23 devnull score[(i>>1)-2] |= c;
52 7763a61a 2003-11-23 devnull }
53 7763a61a 2003-11-23 devnull return 1;
54 7763a61a 2003-11-23 devnull }
55 7763a61a 2003-11-23 devnull
56 7763a61a 2003-11-23 devnull VacFS *
57 7763a61a 2003-11-23 devnull vfsOpen(VtSession *z, char *file, int readOnly, long ncache)
58 7763a61a 2003-11-23 devnull {
59 7763a61a 2003-11-23 devnull VacFS *fs;
60 7763a61a 2003-11-23 devnull int n, fd;
61 7763a61a 2003-11-23 devnull VtRoot rt;
62 7763a61a 2003-11-23 devnull uchar score[VtScoreSize], buf[VtRootSize];
63 7763a61a 2003-11-23 devnull VacFile *root;
64 7763a61a 2003-11-23 devnull
65 7763a61a 2003-11-23 devnull fd = open(file, OREAD);
66 7763a61a 2003-11-23 devnull if(fd < 0) {
67 7763a61a 2003-11-23 devnull vtOSError();
68 7763a61a 2003-11-23 devnull return nil;
69 7763a61a 2003-11-23 devnull }
70 7763a61a 2003-11-23 devnull
71 7763a61a 2003-11-23 devnull if(!readScore(fd, score)) {
72 7763a61a 2003-11-23 devnull close(fd);
73 7763a61a 2003-11-23 devnull return nil;
74 7763a61a 2003-11-23 devnull }
75 7763a61a 2003-11-23 devnull close(fd);
76 7763a61a 2003-11-23 devnull
77 7763a61a 2003-11-23 devnull n = vtRead(z, score, VtRootType, buf, VtRootSize);
78 7763a61a 2003-11-23 devnull if(n < 0)
79 7763a61a 2003-11-23 devnull return nil;
80 7763a61a 2003-11-23 devnull if(n != VtRootSize) {
81 7763a61a 2003-11-23 devnull vtSetError("vtRead on root too short");
82 7763a61a 2003-11-23 devnull return nil;
83 7763a61a 2003-11-23 devnull }
84 7763a61a 2003-11-23 devnull
85 7763a61a 2003-11-23 devnull if(!vtSha1Check(score, buf, VtRootSize)) {
86 7763a61a 2003-11-23 devnull vtSetError("vtSha1Check failed on root block");
87 7763a61a 2003-11-23 devnull return nil;
88 7763a61a 2003-11-23 devnull }
89 7763a61a 2003-11-23 devnull
90 7763a61a 2003-11-23 devnull if(!vtRootUnpack(&rt, buf))
91 7763a61a 2003-11-23 devnull return nil;
92 7763a61a 2003-11-23 devnull
93 7763a61a 2003-11-23 devnull if(strcmp(rt.type, "vac") != 0) {
94 7763a61a 2003-11-23 devnull vtSetError("not a vac root");
95 7763a61a 2003-11-23 devnull return nil;
96 7763a61a 2003-11-23 devnull }
97 7763a61a 2003-11-23 devnull
98 7763a61a 2003-11-23 devnull fs = vfsAlloc(z, rt.blockSize, ncache);
99 7763a61a 2003-11-23 devnull memmove(fs->score, score, VtScoreSize);
100 7763a61a 2003-11-23 devnull fs->readOnly = readOnly;
101 7763a61a 2003-11-23 devnull root = vfRoot(fs, rt.score);
102 7763a61a 2003-11-23 devnull if(root == nil)
103 7763a61a 2003-11-23 devnull goto Err;
104 7763a61a 2003-11-23 devnull fs->root = root;
105 7763a61a 2003-11-23 devnull
106 7763a61a 2003-11-23 devnull return fs;
107 7763a61a 2003-11-23 devnull Err:
108 7763a61a 2003-11-23 devnull if(root)
109 7763a61a 2003-11-23 devnull vfDecRef(root);
110 7763a61a 2003-11-23 devnull vfsClose(fs);
111 7763a61a 2003-11-23 devnull return nil;
112 7763a61a 2003-11-23 devnull }
113 7763a61a 2003-11-23 devnull
114 7763a61a 2003-11-23 devnull VacFS *
115 7763a61a 2003-11-23 devnull vacFsCreate(VtSession *z, int bsize, long ncache)
116 7763a61a 2003-11-23 devnull {
117 7763a61a 2003-11-23 devnull VacFS *fs;
118 7763a61a 2003-11-23 devnull
119 7763a61a 2003-11-23 devnull fs = vfsAlloc(z, bsize, ncache);
120 7763a61a 2003-11-23 devnull return fs;
121 7763a61a 2003-11-23 devnull }
122 7763a61a 2003-11-23 devnull
123 7763a61a 2003-11-23 devnull int
124 7763a61a 2003-11-23 devnull vfsIsReadOnly(VacFS *fs)
125 7763a61a 2003-11-23 devnull {
126 7763a61a 2003-11-23 devnull return fs->readOnly != 0;
127 7763a61a 2003-11-23 devnull }
128 7763a61a 2003-11-23 devnull
129 7763a61a 2003-11-23 devnull VacFile *
130 7763a61a 2003-11-23 devnull vfsGetRoot(VacFS *fs)
131 7763a61a 2003-11-23 devnull {
132 7763a61a 2003-11-23 devnull return vfIncRef(fs->root);
133 7763a61a 2003-11-23 devnull }
134 7763a61a 2003-11-23 devnull
135 7763a61a 2003-11-23 devnull int
136 7763a61a 2003-11-23 devnull vfsGetBlockSize(VacFS *fs)
137 7763a61a 2003-11-23 devnull {
138 7763a61a 2003-11-23 devnull return fs->bsize;
139 7763a61a 2003-11-23 devnull }
140 7763a61a 2003-11-23 devnull
141 7763a61a 2003-11-23 devnull int
142 7763a61a 2003-11-23 devnull vfsGetScore(VacFS *fs, uchar score[VtScoreSize])
143 7763a61a 2003-11-23 devnull {
144 7763a61a 2003-11-23 devnull memmove(fs, score, VtScoreSize);
145 7763a61a 2003-11-23 devnull return 1;
146 7763a61a 2003-11-23 devnull }
147 7763a61a 2003-11-23 devnull
148 7763a61a 2003-11-23 devnull long
149 7763a61a 2003-11-23 devnull vfsGetCacheSize(VacFS *fs)
150 7763a61a 2003-11-23 devnull {
151 7763a61a 2003-11-23 devnull return cacheGetSize(fs->cache);
152 7763a61a 2003-11-23 devnull }
153 7763a61a 2003-11-23 devnull
154 7763a61a 2003-11-23 devnull int
155 7763a61a 2003-11-23 devnull vfsSetCacheSize(VacFS *fs, long size)
156 7763a61a 2003-11-23 devnull {
157 7763a61a 2003-11-23 devnull return cacheSetSize(fs->cache, size);
158 7763a61a 2003-11-23 devnull }
159 7763a61a 2003-11-23 devnull
160 7763a61a 2003-11-23 devnull int
161 7763a61a 2003-11-23 devnull vfsSnapshot(VacFS *fs, char *src, char *dst)
162 7763a61a 2003-11-23 devnull {
163 7763a61a 2003-11-23 devnull USED(fs);
164 7763a61a 2003-11-23 devnull USED(src);
165 7763a61a 2003-11-23 devnull USED(dst);
166 7763a61a 2003-11-23 devnull return 1;
167 7763a61a 2003-11-23 devnull }
168 7763a61a 2003-11-23 devnull
169 7763a61a 2003-11-23 devnull int
170 7763a61a 2003-11-23 devnull vfsSync(VacFS*)
171 7763a61a 2003-11-23 devnull {
172 7763a61a 2003-11-23 devnull return 1;
173 7763a61a 2003-11-23 devnull }
174 7763a61a 2003-11-23 devnull
175 7763a61a 2003-11-23 devnull int
176 7763a61a 2003-11-23 devnull vfsClose(VacFS *fs)
177 7763a61a 2003-11-23 devnull {
178 7763a61a 2003-11-23 devnull if(fs->root)
179 7763a61a 2003-11-23 devnull vfDecRef(fs->root);
180 7763a61a 2003-11-23 devnull fs->root = nil;
181 7763a61a 2003-11-23 devnull cacheCheck(fs->cache);
182 7763a61a 2003-11-23 devnull cacheFree(fs->cache);
183 7763a61a 2003-11-23 devnull memset(fs, 0, sizeof(VacFS));
184 7763a61a 2003-11-23 devnull vtMemFree(fs);
185 7763a61a 2003-11-23 devnull return 1;
186 7763a61a 2003-11-23 devnull }
187 7763a61a 2003-11-23 devnull
188 7763a61a 2003-11-23 devnull