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 23fb2edb 2005-07-24 devnull #define debug 0
7 23fb2edb 2005-07-24 devnull
8 7763a61a 2003-11-23 devnull static char EBadVacFormat[] = "bad format for vac file";
9 7763a61a 2003-11-23 devnull
10 3d77c87e 2004-03-15 devnull static VacFs *
11 3d77c87e 2004-03-15 devnull vacfsalloc(VtConn *z, int bsize, int ncache, int mode)
12 7763a61a 2003-11-23 devnull {
13 3d77c87e 2004-03-15 devnull VacFs *fs;
14 7763a61a 2003-11-23 devnull
15 3d77c87e 2004-03-15 devnull fs = vtmallocz(sizeof(VacFs));
16 7763a61a 2003-11-23 devnull fs->ref = 1;
17 7763a61a 2003-11-23 devnull fs->z = z;
18 7763a61a 2003-11-23 devnull fs->bsize = bsize;
19 c1e6f642 2005-07-13 devnull fs->cache = vtcachealloc(z, bsize, ncache);
20 7763a61a 2003-11-23 devnull return fs;
21 7763a61a 2003-11-23 devnull }
22 7763a61a 2003-11-23 devnull
23 7763a61a 2003-11-23 devnull static int
24 3d77c87e 2004-03-15 devnull readscore(int fd, uchar score[VtScoreSize])
25 7763a61a 2003-11-23 devnull {
26 3d77c87e 2004-03-15 devnull char buf[45], *pref;
27 3d77c87e 2004-03-15 devnull int n;
28 7763a61a 2003-11-23 devnull
29 3d77c87e 2004-03-15 devnull n = readn(fd, buf, sizeof(buf)-1);
30 a20a1468 2005-01-16 devnull if(n < sizeof(buf)-1) {
31 3d77c87e 2004-03-15 devnull werrstr("short read");
32 3d77c87e 2004-03-15 devnull return -1;
33 7763a61a 2003-11-23 devnull }
34 3d77c87e 2004-03-15 devnull buf[n] = 0;
35 3d77c87e 2004-03-15 devnull
36 3d77c87e 2004-03-15 devnull if(vtparsescore(buf, &pref, score) < 0){
37 3d77c87e 2004-03-15 devnull werrstr(EBadVacFormat);
38 3d77c87e 2004-03-15 devnull return -1;
39 7763a61a 2003-11-23 devnull }
40 3d77c87e 2004-03-15 devnull if(pref==nil || strcmp(pref, "vac") != 0) {
41 3d77c87e 2004-03-15 devnull werrstr("not a vac file");
42 3d77c87e 2004-03-15 devnull return -1;
43 7763a61a 2003-11-23 devnull }
44 3d77c87e 2004-03-15 devnull return 0;
45 7763a61a 2003-11-23 devnull }
46 7763a61a 2003-11-23 devnull
47 3d77c87e 2004-03-15 devnull VacFs*
48 3d77c87e 2004-03-15 devnull vacfsopen(VtConn *z, char *file, int mode, int ncache)
49 7763a61a 2003-11-23 devnull {
50 3d77c87e 2004-03-15 devnull int fd;
51 3d77c87e 2004-03-15 devnull uchar score[VtScoreSize];
52 7763a61a 2003-11-23 devnull
53 7763a61a 2003-11-23 devnull fd = open(file, OREAD);
54 3d77c87e 2004-03-15 devnull if(fd < 0)
55 7763a61a 2003-11-23 devnull return nil;
56 7763a61a 2003-11-23 devnull
57 3d77c87e 2004-03-15 devnull if(readscore(fd, score) < 0){
58 7763a61a 2003-11-23 devnull close(fd);
59 7763a61a 2003-11-23 devnull return nil;
60 7763a61a 2003-11-23 devnull }
61 7763a61a 2003-11-23 devnull close(fd);
62 7763a61a 2003-11-23 devnull
63 3d77c87e 2004-03-15 devnull return vacfsopenscore(z, score, mode, ncache);
64 3d77c87e 2004-03-15 devnull }
65 3d77c87e 2004-03-15 devnull
66 3d77c87e 2004-03-15 devnull VacFs*
67 3d77c87e 2004-03-15 devnull vacfsopenscore(VtConn *z, u8int *score, int mode, int ncache)
68 3d77c87e 2004-03-15 devnull {
69 3d77c87e 2004-03-15 devnull VacFs *fs;
70 3d77c87e 2004-03-15 devnull int n;
71 3d77c87e 2004-03-15 devnull VtRoot rt;
72 3d77c87e 2004-03-15 devnull uchar buf[VtRootSize];
73 3d77c87e 2004-03-15 devnull VacFile *root;
74 3d77c87e 2004-03-15 devnull VtFile *r;
75 3d77c87e 2004-03-15 devnull VtEntry e;
76 3d77c87e 2004-03-15 devnull
77 3d77c87e 2004-03-15 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 3d77c87e 2004-03-15 devnull if(n != VtRootSize){
81 3d77c87e 2004-03-15 devnull werrstr("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 3d77c87e 2004-03-15 devnull if(vtrootunpack(&rt, buf) < 0)
86 7763a61a 2003-11-23 devnull return nil;
87 7763a61a 2003-11-23 devnull
88 7763a61a 2003-11-23 devnull if(strcmp(rt.type, "vac") != 0) {
89 3d77c87e 2004-03-15 devnull werrstr("not a vac root");
90 7763a61a 2003-11-23 devnull return nil;
91 7763a61a 2003-11-23 devnull }
92 7763a61a 2003-11-23 devnull
93 3d77c87e 2004-03-15 devnull fs = vacfsalloc(z, rt.blocksize, ncache, mode);
94 7763a61a 2003-11-23 devnull memmove(fs->score, score, VtScoreSize);
95 3d77c87e 2004-03-15 devnull fs->mode = mode;
96 3d77c87e 2004-03-15 devnull
97 a20a1468 2005-01-16 devnull memmove(e.score, rt.score, VtScoreSize);
98 3d77c87e 2004-03-15 devnull e.gen = 0;
99 3d77c87e 2004-03-15 devnull e.psize = (rt.blocksize/VtEntrySize)*VtEntrySize;
100 3d77c87e 2004-03-15 devnull e.dsize = rt.blocksize;
101 3d77c87e 2004-03-15 devnull e.type = VtDirType;
102 3d77c87e 2004-03-15 devnull e.flags = VtEntryActive;
103 3d77c87e 2004-03-15 devnull e.size = 3*VtEntrySize;
104 3d77c87e 2004-03-15 devnull
105 3d77c87e 2004-03-15 devnull root = nil;
106 3d77c87e 2004-03-15 devnull if((r = vtfileopenroot(fs->cache, &e)) == nil)
107 3d77c87e 2004-03-15 devnull goto Err;
108 23fb2edb 2005-07-24 devnull if(debug)
109 23fb2edb 2005-07-24 devnull fprint(2, "r %p\n", r);
110 3d77c87e 2004-03-15 devnull root = _vacfileroot(fs, r);
111 23fb2edb 2005-07-24 devnull if(debug)
112 23fb2edb 2005-07-24 devnull fprint(2, "root %p\n", root);
113 3d77c87e 2004-03-15 devnull vtfileclose(r);
114 7763a61a 2003-11-23 devnull if(root == nil)
115 7763a61a 2003-11-23 devnull goto Err;
116 7763a61a 2003-11-23 devnull fs->root = root;
117 7763a61a 2003-11-23 devnull return fs;
118 7763a61a 2003-11-23 devnull Err:
119 7763a61a 2003-11-23 devnull if(root)
120 3d77c87e 2004-03-15 devnull vacfiledecref(root);
121 3d77c87e 2004-03-15 devnull vacfsclose(fs);
122 7763a61a 2003-11-23 devnull return nil;
123 7763a61a 2003-11-23 devnull }
124 7763a61a 2003-11-23 devnull
125 3d77c87e 2004-03-15 devnull VacFs *
126 3d77c87e 2004-03-15 devnull vacfscreate(VtConn *z, int bsize, int ncache)
127 7763a61a 2003-11-23 devnull {
128 3d77c87e 2004-03-15 devnull return vacfsalloc(z, bsize, ncache, VtORDWR);
129 7763a61a 2003-11-23 devnull }
130 7763a61a 2003-11-23 devnull
131 7763a61a 2003-11-23 devnull int
132 3d77c87e 2004-03-15 devnull vacfsmode(VacFs *fs)
133 7763a61a 2003-11-23 devnull {
134 3d77c87e 2004-03-15 devnull return fs->mode;
135 7763a61a 2003-11-23 devnull }
136 7763a61a 2003-11-23 devnull
137 3d77c87e 2004-03-15 devnull VacFile*
138 3d77c87e 2004-03-15 devnull vacfsgetroot(VacFs *fs)
139 7763a61a 2003-11-23 devnull {
140 3d77c87e 2004-03-15 devnull return vacfileincref(fs->root);
141 7763a61a 2003-11-23 devnull }
142 7763a61a 2003-11-23 devnull
143 7763a61a 2003-11-23 devnull int
144 3d77c87e 2004-03-15 devnull vacfsgetblocksize(VacFs *fs)
145 7763a61a 2003-11-23 devnull {
146 7763a61a 2003-11-23 devnull return fs->bsize;
147 7763a61a 2003-11-23 devnull }
148 7763a61a 2003-11-23 devnull
149 7763a61a 2003-11-23 devnull int
150 3d77c87e 2004-03-15 devnull vacfsgetscore(VacFs *fs, u8int *score)
151 7763a61a 2003-11-23 devnull {
152 3d77c87e 2004-03-15 devnull memmove(score, fs->score, VtScoreSize);
153 3d77c87e 2004-03-15 devnull return 0;
154 7763a61a 2003-11-23 devnull }
155 7763a61a 2003-11-23 devnull
156 7763a61a 2003-11-23 devnull int
157 3d77c87e 2004-03-15 devnull _vacfsnextqid(VacFs *fs, uvlong *qid)
158 7763a61a 2003-11-23 devnull {
159 3d77c87e 2004-03-15 devnull ++fs->qid;
160 3d77c87e 2004-03-15 devnull *qid = fs->qid;
161 3d77c87e 2004-03-15 devnull return 0;
162 7763a61a 2003-11-23 devnull }
163 7763a61a 2003-11-23 devnull
164 7763a61a 2003-11-23 devnull int
165 3d77c87e 2004-03-15 devnull vacfssync(VacFs *fs)
166 7763a61a 2003-11-23 devnull {
167 3d77c87e 2004-03-15 devnull return 0;
168 7763a61a 2003-11-23 devnull }
169 7763a61a 2003-11-23 devnull
170 3d77c87e 2004-03-15 devnull void
171 3d77c87e 2004-03-15 devnull vacfsclose(VacFs *fs)
172 7763a61a 2003-11-23 devnull {
173 7763a61a 2003-11-23 devnull if(fs->root)
174 3d77c87e 2004-03-15 devnull vacfiledecref(fs->root);
175 7763a61a 2003-11-23 devnull fs->root = nil;
176 3d77c87e 2004-03-15 devnull vtcachefree(fs->cache);
177 3d77c87e 2004-03-15 devnull vtfree(fs);
178 7763a61a 2003-11-23 devnull }
179 7763a61a 2003-11-23 devnull