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