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"
6 7763a61a 2003-11-23 devnull static char EBadVacFormat[] = "bad format for vac file";
8 7763a61a 2003-11-23 devnull static VacFS *
9 7763a61a 2003-11-23 devnull vfsAlloc(VtSession *z, int bsize, long ncache)
11 7763a61a 2003-11-23 devnull VacFS *fs;
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;
21 7763a61a 2003-11-23 devnull static int
22 7763a61a 2003-11-23 devnull readScore(int fd, uchar score[VtScoreSize])
24 7763a61a 2003-11-23 devnull char buf[44];
25 7763a61a 2003-11-23 devnull int i, n, c;
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;
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;
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;
45 7763a61a 2003-11-23 devnull vtSetError("bad format for venti score");
46 7763a61a 2003-11-23 devnull return 0;
48 7763a61a 2003-11-23 devnull if((i & 1) == 0)
51 7763a61a 2003-11-23 devnull score[(i>>1)-2] |= c;
53 7763a61a 2003-11-23 devnull return 1;
57 7763a61a 2003-11-23 devnull vfsOpen(VtSession *z, char *file, int readOnly, long ncache)
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;
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;
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;
75 7763a61a 2003-11-23 devnull close(fd);
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;
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;
90 7763a61a 2003-11-23 devnull if(!vtRootUnpack(&rt, buf))
91 7763a61a 2003-11-23 devnull return nil;
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;
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;
106 7763a61a 2003-11-23 devnull return fs;
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;
115 7763a61a 2003-11-23 devnull vacFsCreate(VtSession *z, int bsize, long ncache)
117 7763a61a 2003-11-23 devnull VacFS *fs;
119 7763a61a 2003-11-23 devnull fs = vfsAlloc(z, bsize, ncache);
120 7763a61a 2003-11-23 devnull return fs;
124 7763a61a 2003-11-23 devnull vfsIsReadOnly(VacFS *fs)
126 7763a61a 2003-11-23 devnull return fs->readOnly != 0;
129 7763a61a 2003-11-23 devnull VacFile *
130 7763a61a 2003-11-23 devnull vfsGetRoot(VacFS *fs)
132 7763a61a 2003-11-23 devnull return vfIncRef(fs->root);
136 7763a61a 2003-11-23 devnull vfsGetBlockSize(VacFS *fs)
138 7763a61a 2003-11-23 devnull return fs->bsize;
142 7763a61a 2003-11-23 devnull vfsGetScore(VacFS *fs, uchar score[VtScoreSize])
144 7763a61a 2003-11-23 devnull memmove(fs, score, VtScoreSize);
145 7763a61a 2003-11-23 devnull return 1;
149 7763a61a 2003-11-23 devnull vfsGetCacheSize(VacFS *fs)
151 7763a61a 2003-11-23 devnull return cacheGetSize(fs->cache);
155 7763a61a 2003-11-23 devnull vfsSetCacheSize(VacFS *fs, long size)
157 7763a61a 2003-11-23 devnull return cacheSetSize(fs->cache, size);
161 7763a61a 2003-11-23 devnull vfsSnapshot(VacFS *fs, char *src, char *dst)
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;
170 7763a61a 2003-11-23 devnull vfsSync(VacFS*)
172 7763a61a 2003-11-23 devnull return 1;
176 7763a61a 2003-11-23 devnull vfsClose(VacFS *fs)
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;