Blame


1 004aa293 2005-07-13 devnull #include <u.h>
2 004aa293 2005-07-13 devnull #include <libc.h>
3 004aa293 2005-07-13 devnull #include <bio.h>
4 004aa293 2005-07-13 devnull #include <thread.h>
5 004aa293 2005-07-13 devnull #include <sunrpc.h>
6 004aa293 2005-07-13 devnull #include <nfs3.h>
7 004aa293 2005-07-13 devnull #include <diskfs.h>
8 004aa293 2005-07-13 devnull #include <venti.h>
9 004aa293 2005-07-13 devnull #include <libsec.h>
10 004aa293 2005-07-13 devnull
11 004aa293 2005-07-13 devnull #undef stime
12 004aa293 2005-07-13 devnull #define stime configstime /* sometimes in <time.h> */
13 004aa293 2005-07-13 devnull typedef struct Entry Entry;
14 004aa293 2005-07-13 devnull struct Entry
15 004aa293 2005-07-13 devnull {
16 004aa293 2005-07-13 devnull Entry *parent;
17 004aa293 2005-07-13 devnull Entry *nextdir;
18 004aa293 2005-07-13 devnull Entry *nexthash;
19 004aa293 2005-07-13 devnull Entry *kids;
20 004aa293 2005-07-13 devnull int isfsys;
21 004aa293 2005-07-13 devnull Fsys *fsys;
22 004aa293 2005-07-13 devnull uchar score[VtScoreSize]; /* of fsys */
23 004aa293 2005-07-13 devnull char *name;
24 004aa293 2005-07-13 devnull uchar sha1[VtScoreSize]; /* of path to this entry */
25 004aa293 2005-07-13 devnull ulong time;
26 004aa293 2005-07-13 devnull };
27 004aa293 2005-07-13 devnull
28 004aa293 2005-07-13 devnull typedef struct Config Config;
29 004aa293 2005-07-13 devnull struct Config
30 004aa293 2005-07-13 devnull {
31 004aa293 2005-07-13 devnull VtCache *vcache;
32 004aa293 2005-07-13 devnull Entry *root;
33 004aa293 2005-07-13 devnull Entry *hash[1024];
34 004aa293 2005-07-13 devnull Qid qid;
35 004aa293 2005-07-13 devnull };
36 004aa293 2005-07-13 devnull
37 004aa293 2005-07-13 devnull Config *config;
38 004aa293 2005-07-13 devnull static ulong mtime; /* mod time */
39 004aa293 2005-07-13 devnull static ulong stime; /* sync time */
40 004aa293 2005-07-13 devnull static char* configfile;
41 004aa293 2005-07-13 devnull
42 004aa293 2005-07-13 devnull static int addpath(Config*, char*, uchar[VtScoreSize], ulong);
43 004aa293 2005-07-13 devnull Fsys fsysconfig;
44 004aa293 2005-07-13 devnull
45 004aa293 2005-07-13 devnull static void
46 004aa293 2005-07-13 devnull freeconfig(Config *c)
47 004aa293 2005-07-13 devnull {
48 004aa293 2005-07-13 devnull Entry *next, *e;
49 004aa293 2005-07-13 devnull int i;
50 004aa293 2005-07-13 devnull
51 004aa293 2005-07-13 devnull for(i=0; i<nelem(c->hash); i++){
52 004aa293 2005-07-13 devnull for(e=c->hash[i]; e; e=next){
53 004aa293 2005-07-13 devnull next = e->nexthash;
54 004aa293 2005-07-13 devnull free(e);
55 004aa293 2005-07-13 devnull }
56 004aa293 2005-07-13 devnull }
57 004aa293 2005-07-13 devnull free(c);
58 004aa293 2005-07-13 devnull }
59 004aa293 2005-07-13 devnull
60 004aa293 2005-07-13 devnull static int
61 004aa293 2005-07-13 devnull namehash(uchar *s)
62 004aa293 2005-07-13 devnull {
63 004aa293 2005-07-13 devnull return (s[0]<<2)|(s[1]>>6);
64 004aa293 2005-07-13 devnull }
65 004aa293 2005-07-13 devnull
66 004aa293 2005-07-13 devnull static Entry*
67 004aa293 2005-07-13 devnull entrybyhandle(Nfs3Handle *h)
68 004aa293 2005-07-13 devnull {
69 004aa293 2005-07-13 devnull int hh;
70 004aa293 2005-07-13 devnull Entry *e;
71 004aa293 2005-07-13 devnull
72 004aa293 2005-07-13 devnull hh = namehash(h->h);
73 004aa293 2005-07-13 devnull for(e=config->hash[hh]; e; e=e->nexthash)
74 004aa293 2005-07-13 devnull if(memcmp(e->sha1, h->h, VtScoreSize) == 0)
75 004aa293 2005-07-13 devnull return e;
76 004aa293 2005-07-13 devnull return nil;
77 004aa293 2005-07-13 devnull }
78 004aa293 2005-07-13 devnull
79 004aa293 2005-07-13 devnull static Config*
80 004aa293 2005-07-13 devnull readconfigfile(char *name, VtCache *vcache)
81 004aa293 2005-07-13 devnull {
82 004aa293 2005-07-13 devnull char *p, *pref, *f[10];
83 004aa293 2005-07-13 devnull int ok;
84 004aa293 2005-07-13 devnull Config *c;
85 004aa293 2005-07-13 devnull uchar score[VtScoreSize];
86 004aa293 2005-07-13 devnull int h, nf, line;
87 004aa293 2005-07-13 devnull Biobuf *b;
88 004aa293 2005-07-13 devnull Dir *dir;
89 004aa293 2005-07-13 devnull
90 004aa293 2005-07-13 devnull configfile = vtstrdup(name);
91 004aa293 2005-07-13 devnull
92 004aa293 2005-07-13 devnull if((dir = dirstat(name)) == nil)
93 004aa293 2005-07-13 devnull return nil;
94 fa325e9b 2020-01-10 cross
95 004aa293 2005-07-13 devnull if((b = Bopen(name, OREAD)) == nil){
96 004aa293 2005-07-13 devnull free(dir);
97 004aa293 2005-07-13 devnull return nil;
98 004aa293 2005-07-13 devnull }
99 004aa293 2005-07-13 devnull
100 004aa293 2005-07-13 devnull line = 0;
101 004aa293 2005-07-13 devnull ok = 1;
102 004aa293 2005-07-13 devnull c = emalloc(sizeof(Config));
103 004aa293 2005-07-13 devnull c->vcache = vcache;
104 004aa293 2005-07-13 devnull c->qid = dir->qid;
105 004aa293 2005-07-13 devnull free(dir);
106 004aa293 2005-07-13 devnull c->root = emalloc(sizeof(Entry));
107 004aa293 2005-07-13 devnull c->root->name = "/";
108 004aa293 2005-07-13 devnull c->root->parent = c->root;
109 004aa293 2005-07-13 devnull sha1((uchar*)"/", 1, c->root->sha1, nil);
110 004aa293 2005-07-13 devnull h = namehash(c->root->sha1);
111 004aa293 2005-07-13 devnull c->hash[h] = c->root;
112 004aa293 2005-07-13 devnull
113 004aa293 2005-07-13 devnull for(; (p = Brdstr(b, '\n', 1)) != nil; free(p)){
114 004aa293 2005-07-13 devnull line++;
115 004aa293 2005-07-13 devnull if(p[0] == '#')
116 004aa293 2005-07-13 devnull continue;
117 004aa293 2005-07-13 devnull nf = tokenize(p, f, nelem(f));
118 004aa293 2005-07-13 devnull if(nf != 3){
119 004aa293 2005-07-13 devnull fprint(2, "%s:%d: syntax error\n", name, line);
120 cbeb0b26 2006-04-01 devnull /* ok = 0; */
121 004aa293 2005-07-13 devnull continue;
122 004aa293 2005-07-13 devnull }
123 004aa293 2005-07-13 devnull if(vtparsescore(f[1], &pref, score) < 0){
124 004aa293 2005-07-13 devnull fprint(2, "%s:%d: bad score '%s'\n", name, line, f[1]);
125 cbeb0b26 2006-04-01 devnull /* ok = 0; */
126 004aa293 2005-07-13 devnull continue;
127 004aa293 2005-07-13 devnull }
128 004aa293 2005-07-13 devnull if(f[0][0] != '/'){
129 004aa293 2005-07-13 devnull fprint(2, "%s:%d: unrooted path '%s'\n", name, line, f[0]);
130 cbeb0b26 2006-04-01 devnull /* ok = 0; */
131 004aa293 2005-07-13 devnull continue;
132 004aa293 2005-07-13 devnull }
133 004aa293 2005-07-13 devnull if(addpath(c, f[0], score, strtoul(f[2], 0, 0)) < 0){
134 004aa293 2005-07-13 devnull fprint(2, "%s:%d: %s: %r\n", name, line, f[0]);
135 cbeb0b26 2006-04-01 devnull /* ok = 0; */
136 004aa293 2005-07-13 devnull continue;
137 004aa293 2005-07-13 devnull }
138 004aa293 2005-07-13 devnull }
139 004aa293 2005-07-13 devnull Bterm(b);
140 004aa293 2005-07-13 devnull
141 004aa293 2005-07-13 devnull if(!ok){
142 004aa293 2005-07-13 devnull freeconfig(c);
143 004aa293 2005-07-13 devnull return nil;
144 004aa293 2005-07-13 devnull }
145 fa325e9b 2020-01-10 cross
146 004aa293 2005-07-13 devnull return c;
147 004aa293 2005-07-13 devnull }
148 004aa293 2005-07-13 devnull
149 004aa293 2005-07-13 devnull static void
150 004aa293 2005-07-13 devnull refreshconfig(void)
151 004aa293 2005-07-13 devnull {
152 004aa293 2005-07-13 devnull ulong now;
153 004aa293 2005-07-13 devnull Config *c, *old;
154 004aa293 2005-07-13 devnull Dir *d;
155 004aa293 2005-07-13 devnull
156 004aa293 2005-07-13 devnull now = time(0);
157 004aa293 2005-07-13 devnull if(now - stime < 60)
158 004aa293 2005-07-13 devnull return;
159 004aa293 2005-07-13 devnull if((d = dirstat(configfile)) == nil)
160 004aa293 2005-07-13 devnull return;
161 004aa293 2005-07-13 devnull if(d->mtime == mtime){
162 004aa293 2005-07-13 devnull free(d);
163 004aa293 2005-07-13 devnull stime = now;
164 004aa293 2005-07-13 devnull return;
165 004aa293 2005-07-13 devnull }
166 004aa293 2005-07-13 devnull
167 004aa293 2005-07-13 devnull c = readconfigfile(configfile, config->vcache);
168 004aa293 2005-07-13 devnull if(c == nil){
169 004aa293 2005-07-13 devnull free(d);
170 004aa293 2005-07-13 devnull return;
171 004aa293 2005-07-13 devnull }
172 004aa293 2005-07-13 devnull
173 004aa293 2005-07-13 devnull old = config;
174 004aa293 2005-07-13 devnull config = c;
175 004aa293 2005-07-13 devnull stime = now;
176 004aa293 2005-07-13 devnull mtime = d->mtime;
177 004aa293 2005-07-13 devnull free(d);
178 004aa293 2005-07-13 devnull freeconfig(old);
179 004aa293 2005-07-13 devnull }
180 004aa293 2005-07-13 devnull
181 004aa293 2005-07-13 devnull static Entry*
182 004aa293 2005-07-13 devnull entrylookup(Entry *e, char *p, int np)
183 004aa293 2005-07-13 devnull {
184 004aa293 2005-07-13 devnull for(e=e->kids; e; e=e->nextdir)
185 004aa293 2005-07-13 devnull if(strlen(e->name) == np && memcmp(e->name, p, np) == 0)
186 004aa293 2005-07-13 devnull return e;
187 004aa293 2005-07-13 devnull return nil;
188 004aa293 2005-07-13 devnull }
189 004aa293 2005-07-13 devnull
190 004aa293 2005-07-13 devnull static Entry*
191 004aa293 2005-07-13 devnull walkpath(Config *c, char *name)
192 004aa293 2005-07-13 devnull {
193 004aa293 2005-07-13 devnull Entry *e, *ee;
194 004aa293 2005-07-13 devnull char *p, *nextp;
195 004aa293 2005-07-13 devnull int h;
196 004aa293 2005-07-13 devnull
197 004aa293 2005-07-13 devnull e = c->root;
198 004aa293 2005-07-13 devnull p = name;
199 004aa293 2005-07-13 devnull for(; *p; p=nextp){
200 004aa293 2005-07-13 devnull assert(*p == '/');
201 004aa293 2005-07-13 devnull p++;
202 004aa293 2005-07-13 devnull nextp = strchr(p, '/');
203 004aa293 2005-07-13 devnull if(nextp == nil)
204 004aa293 2005-07-13 devnull nextp = p+strlen(p);
205 004aa293 2005-07-13 devnull if(e->fsys){
206 004aa293 2005-07-13 devnull werrstr("%.*s is already a mount point", utfnlen(name, nextp-name), name);
207 004aa293 2005-07-13 devnull return nil;
208 004aa293 2005-07-13 devnull }
209 004aa293 2005-07-13 devnull if((ee = entrylookup(e, p, nextp-p)) == nil){
210 004aa293 2005-07-13 devnull ee = emalloc(sizeof(Entry)+(nextp-p)+1);
211 004aa293 2005-07-13 devnull ee->parent = e;
212 004aa293 2005-07-13 devnull ee->nextdir = e->kids;
213 004aa293 2005-07-13 devnull e->kids = ee;
214 004aa293 2005-07-13 devnull ee->name = (char*)&ee[1];
215 004aa293 2005-07-13 devnull memmove(ee->name, p, nextp-p);
216 004aa293 2005-07-13 devnull ee->name[nextp-p] = 0;
217 004aa293 2005-07-13 devnull sha1((uchar*)name, nextp-name, ee->sha1, nil);
218 004aa293 2005-07-13 devnull h = namehash(ee->sha1);
219 004aa293 2005-07-13 devnull ee->nexthash = c->hash[h];
220 004aa293 2005-07-13 devnull c->hash[h] = ee;
221 004aa293 2005-07-13 devnull }
222 004aa293 2005-07-13 devnull e = ee;
223 004aa293 2005-07-13 devnull }
224 004aa293 2005-07-13 devnull if(e->kids){
225 004aa293 2005-07-13 devnull werrstr("%s already has children; cannot be mount point", name);
226 004aa293 2005-07-13 devnull return nil;
227 004aa293 2005-07-13 devnull }
228 004aa293 2005-07-13 devnull return e;
229 004aa293 2005-07-13 devnull }
230 004aa293 2005-07-13 devnull
231 004aa293 2005-07-13 devnull static int
232 004aa293 2005-07-13 devnull addpath(Config *c, char *name, uchar score[VtScoreSize], ulong time)
233 004aa293 2005-07-13 devnull {
234 004aa293 2005-07-13 devnull Entry *e;
235 004aa293 2005-07-13 devnull
236 004aa293 2005-07-13 devnull e = walkpath(c, name);
237 004aa293 2005-07-13 devnull if(e == nil)
238 004aa293 2005-07-13 devnull return -1;
239 004aa293 2005-07-13 devnull e->isfsys = 1;
240 004aa293 2005-07-13 devnull e->time = time;
241 004aa293 2005-07-13 devnull memmove(e->score, score, VtScoreSize);
242 004aa293 2005-07-13 devnull return 0;
243 004aa293 2005-07-13 devnull }
244 004aa293 2005-07-13 devnull
245 004aa293 2005-07-13 devnull static void
246 004aa293 2005-07-13 devnull mkhandle(Nfs3Handle *h, Entry *e)
247 004aa293 2005-07-13 devnull {
248 004aa293 2005-07-13 devnull memmove(h->h, e->sha1, VtScoreSize);
249 004aa293 2005-07-13 devnull h->len = VtScoreSize;
250 004aa293 2005-07-13 devnull }
251 004aa293 2005-07-13 devnull
252 004aa293 2005-07-13 devnull Nfs3Status
253 004aa293 2005-07-13 devnull handleparse(Nfs3Handle *h, Fsys **pfsys, Nfs3Handle *nh, int isgetattr)
254 004aa293 2005-07-13 devnull {
255 004aa293 2005-07-13 devnull int hh;
256 004aa293 2005-07-13 devnull Entry *e;
257 004aa293 2005-07-13 devnull Disk *disk;
258 004aa293 2005-07-13 devnull Fsys *fsys;
259 004aa293 2005-07-13 devnull
260 004aa293 2005-07-13 devnull refreshconfig();
261 004aa293 2005-07-13 devnull
262 004aa293 2005-07-13 devnull if(h->len < VtScoreSize)
263 004aa293 2005-07-13 devnull return Nfs3ErrBadHandle;
264 004aa293 2005-07-13 devnull
265 004aa293 2005-07-13 devnull hh = namehash(h->h);
266 004aa293 2005-07-13 devnull for(e=config->hash[hh]; e; e=e->nexthash)
267 004aa293 2005-07-13 devnull if(memcmp(e->sha1, h->h, VtScoreSize) == 0)
268 004aa293 2005-07-13 devnull break;
269 004aa293 2005-07-13 devnull if(e == nil)
270 004aa293 2005-07-13 devnull return Nfs3ErrBadHandle;
271 004aa293 2005-07-13 devnull
272 004aa293 2005-07-13 devnull if(e->isfsys == 1 && e->fsys == nil && (h->len != VtScoreSize || !isgetattr)){
273 004aa293 2005-07-13 devnull if((disk = diskopenventi(config->vcache, e->score)) == nil){
274 004aa293 2005-07-13 devnull fprint(2, "cannot open disk %V: %r\n", e->score);
275 004aa293 2005-07-13 devnull return Nfs3ErrIo;
276 004aa293 2005-07-13 devnull }
277 004aa293 2005-07-13 devnull if((fsys = fsysopen(disk)) == nil){
278 004aa293 2005-07-13 devnull fprint(2, "cannot open fsys on %V: %r\n", e->score);
279 004aa293 2005-07-13 devnull diskclose(disk);
280 004aa293 2005-07-13 devnull return Nfs3ErrIo;
281 004aa293 2005-07-13 devnull }
282 004aa293 2005-07-13 devnull e->fsys = fsys;
283 004aa293 2005-07-13 devnull }
284 004aa293 2005-07-13 devnull
285 004aa293 2005-07-13 devnull if(e->fsys == nil || (isgetattr && h->len == VtScoreSize)){
286 004aa293 2005-07-13 devnull if(h->len != VtScoreSize)
287 004aa293 2005-07-13 devnull return Nfs3ErrBadHandle;
288 004aa293 2005-07-13 devnull *pfsys = &fsysconfig;
289 004aa293 2005-07-13 devnull *nh = *h;
290 004aa293 2005-07-13 devnull return Nfs3Ok;
291 004aa293 2005-07-13 devnull }
292 004aa293 2005-07-13 devnull *pfsys = e->fsys;
293 004aa293 2005-07-13 devnull if(h->len == VtScoreSize)
294 004aa293 2005-07-13 devnull return fsysroot(*pfsys, nh);
295 004aa293 2005-07-13 devnull nh->len = h->len - VtScoreSize;
296 004aa293 2005-07-13 devnull memmove(nh->h, h->h+VtScoreSize, nh->len);
297 004aa293 2005-07-13 devnull return Nfs3Ok;
298 004aa293 2005-07-13 devnull }
299 004aa293 2005-07-13 devnull
300 004aa293 2005-07-13 devnull void
301 004aa293 2005-07-13 devnull handleunparse(Fsys *fsys, Nfs3Handle *h, Nfs3Handle *nh, int dotdot)
302 004aa293 2005-07-13 devnull {
303 004aa293 2005-07-13 devnull Entry *e;
304 004aa293 2005-07-13 devnull int hh;
305 004aa293 2005-07-13 devnull
306 004aa293 2005-07-13 devnull refreshconfig();
307 004aa293 2005-07-13 devnull
308 004aa293 2005-07-13 devnull if(fsys == &fsysconfig)
309 004aa293 2005-07-13 devnull return;
310 004aa293 2005-07-13 devnull
311 004aa293 2005-07-13 devnull if(dotdot && nh->len == h->len - VtScoreSize
312 004aa293 2005-07-13 devnull && memcmp(h->h+VtScoreSize, nh->h, nh->len) == 0){
313 004aa293 2005-07-13 devnull /* walked .. but didn't go anywhere: must be at root */
314 004aa293 2005-07-13 devnull hh = namehash(h->h);
315 004aa293 2005-07-13 devnull for(e=config->hash[hh]; e; e=e->nexthash)
316 004aa293 2005-07-13 devnull if(memcmp(e->sha1, h->h, VtScoreSize) == 0)
317 004aa293 2005-07-13 devnull break;
318 004aa293 2005-07-13 devnull if(e == nil)
319 004aa293 2005-07-13 devnull return; /* cannot happen */
320 004aa293 2005-07-13 devnull
321 004aa293 2005-07-13 devnull /* walk .. */
322 004aa293 2005-07-13 devnull e = e->parent;
323 004aa293 2005-07-13 devnull nh->len = VtScoreSize;
324 004aa293 2005-07-13 devnull memmove(nh->h, e->sha1, VtScoreSize);
325 004aa293 2005-07-13 devnull return;
326 004aa293 2005-07-13 devnull }
327 004aa293 2005-07-13 devnull
328 004aa293 2005-07-13 devnull /* otherwise just insert the same prefix */
329 004aa293 2005-07-13 devnull memmove(nh->h+VtScoreSize, nh->h, VtScoreSize);
330 004aa293 2005-07-13 devnull nh->len += VtScoreSize;
331 004aa293 2005-07-13 devnull memmove(nh->h, h->h, VtScoreSize);
332 004aa293 2005-07-13 devnull }
333 004aa293 2005-07-13 devnull
334 004aa293 2005-07-13 devnull Nfs3Status
335 004aa293 2005-07-13 devnull fsysconfigroot(Fsys *fsys, Nfs3Handle *h)
336 004aa293 2005-07-13 devnull {
337 004aa293 2005-07-13 devnull USED(fsys);
338 004aa293 2005-07-13 devnull
339 004aa293 2005-07-13 devnull mkhandle(h, config->root);
340 004aa293 2005-07-13 devnull return Nfs3Ok;
341 004aa293 2005-07-13 devnull }
342 004aa293 2005-07-13 devnull
343 004aa293 2005-07-13 devnull Nfs3Status
344 004aa293 2005-07-13 devnull fsysconfiggetattr(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, Nfs3Attr *attr)
345 004aa293 2005-07-13 devnull {
346 004aa293 2005-07-13 devnull Entry *e;
347 004aa293 2005-07-13 devnull
348 004aa293 2005-07-13 devnull USED(fsys);
349 004aa293 2005-07-13 devnull USED(au);
350 004aa293 2005-07-13 devnull
351 004aa293 2005-07-13 devnull if(h->len != VtScoreSize)
352 004aa293 2005-07-13 devnull return Nfs3ErrBadHandle;
353 004aa293 2005-07-13 devnull
354 004aa293 2005-07-13 devnull e = entrybyhandle(h);
355 004aa293 2005-07-13 devnull if(e == nil)
356 004aa293 2005-07-13 devnull return Nfs3ErrNoEnt;
357 004aa293 2005-07-13 devnull
358 004aa293 2005-07-13 devnull memset(attr, 0, sizeof *attr);
359 004aa293 2005-07-13 devnull attr->type = Nfs3FileDir;
360 004aa293 2005-07-13 devnull attr->mode = 0555;
361 004aa293 2005-07-13 devnull attr->nlink = 2;
362 004aa293 2005-07-13 devnull attr->size = 1024;
363 004aa293 2005-07-13 devnull attr->fileid = *(u64int*)h->h;
364 004aa293 2005-07-13 devnull attr->atime.sec = e->time;
365 004aa293 2005-07-13 devnull attr->mtime.sec = e->time;
366 004aa293 2005-07-13 devnull attr->ctime.sec = e->time;
367 004aa293 2005-07-13 devnull return Nfs3Ok;
368 004aa293 2005-07-13 devnull }
369 004aa293 2005-07-13 devnull
370 004aa293 2005-07-13 devnull Nfs3Status
371 004aa293 2005-07-13 devnull fsysconfigaccess(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int want, u32int *got, Nfs3Attr *attr)
372 004aa293 2005-07-13 devnull {
373 004aa293 2005-07-13 devnull want &= Nfs3AccessRead|Nfs3AccessLookup|Nfs3AccessExecute;
374 004aa293 2005-07-13 devnull *got = want;
375 004aa293 2005-07-13 devnull return fsysconfiggetattr(fsys, au, h, attr);
376 004aa293 2005-07-13 devnull }
377 004aa293 2005-07-13 devnull
378 004aa293 2005-07-13 devnull Nfs3Status
379 004aa293 2005-07-13 devnull fsysconfiglookup(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, char *name, Nfs3Handle *nh)
380 004aa293 2005-07-13 devnull {
381 004aa293 2005-07-13 devnull Entry *e;
382 004aa293 2005-07-13 devnull
383 004aa293 2005-07-13 devnull USED(fsys);
384 004aa293 2005-07-13 devnull USED(au);
385 004aa293 2005-07-13 devnull
386 004aa293 2005-07-13 devnull if(h->len != VtScoreSize)
387 004aa293 2005-07-13 devnull return Nfs3ErrBadHandle;
388 004aa293 2005-07-13 devnull
389 004aa293 2005-07-13 devnull e = entrybyhandle(h);
390 004aa293 2005-07-13 devnull if(e == nil)
391 004aa293 2005-07-13 devnull return Nfs3ErrNoEnt;
392 004aa293 2005-07-13 devnull
393 004aa293 2005-07-13 devnull if(strcmp(name, "..") == 0)
394 004aa293 2005-07-13 devnull e = e->parent;
395 004aa293 2005-07-13 devnull else if(strcmp(name, ".") == 0){
396 004aa293 2005-07-13 devnull /* nothing */
397 004aa293 2005-07-13 devnull }else{
398 004aa293 2005-07-13 devnull if((e = entrylookup(e, name, strlen(name))) == nil)
399 004aa293 2005-07-13 devnull return Nfs3ErrNoEnt;
400 004aa293 2005-07-13 devnull }
401 004aa293 2005-07-13 devnull
402 004aa293 2005-07-13 devnull mkhandle(nh, e);
403 004aa293 2005-07-13 devnull return Nfs3Ok;
404 004aa293 2005-07-13 devnull }
405 004aa293 2005-07-13 devnull
406 004aa293 2005-07-13 devnull Nfs3Status
407 004aa293 2005-07-13 devnull fsysconfigreadlink(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, char **link)
408 004aa293 2005-07-13 devnull {
409 004aa293 2005-07-13 devnull USED(h);
410 004aa293 2005-07-13 devnull USED(fsys);
411 004aa293 2005-07-13 devnull USED(au);
412 004aa293 2005-07-13 devnull
413 004aa293 2005-07-13 devnull *link = 0;
414 004aa293 2005-07-13 devnull return Nfs3ErrNotSupp;
415 004aa293 2005-07-13 devnull }
416 004aa293 2005-07-13 devnull
417 004aa293 2005-07-13 devnull Nfs3Status
418 004aa293 2005-07-13 devnull fsysconfigreadfile(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int offset, uchar **pdata, u32int *pcount, u1int *peof)
419 004aa293 2005-07-13 devnull {
420 004aa293 2005-07-13 devnull USED(fsys);
421 004aa293 2005-07-13 devnull USED(h);
422 004aa293 2005-07-13 devnull USED(count);
423 004aa293 2005-07-13 devnull USED(offset);
424 004aa293 2005-07-13 devnull USED(pdata);
425 004aa293 2005-07-13 devnull USED(pcount);
426 004aa293 2005-07-13 devnull USED(peof);
427 004aa293 2005-07-13 devnull USED(au);
428 004aa293 2005-07-13 devnull
429 004aa293 2005-07-13 devnull return Nfs3ErrNotSupp;
430 004aa293 2005-07-13 devnull }
431 004aa293 2005-07-13 devnull
432 004aa293 2005-07-13 devnull Nfs3Status
433 004aa293 2005-07-13 devnull fsysconfigreaddir(Fsys *fsys, SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int cookie, uchar **pdata, u32int *pcount, u1int *peof)
434 004aa293 2005-07-13 devnull {
435 004aa293 2005-07-13 devnull uchar *data, *p, *ep, *np;
436 004aa293 2005-07-13 devnull u64int c;
437 004aa293 2005-07-13 devnull Entry *e;
438 004aa293 2005-07-13 devnull Nfs3Entry ne;
439 004aa293 2005-07-13 devnull
440 004aa293 2005-07-13 devnull USED(fsys);
441 004aa293 2005-07-13 devnull USED(au);
442 004aa293 2005-07-13 devnull
443 004aa293 2005-07-13 devnull if(h->len != VtScoreSize)
444 004aa293 2005-07-13 devnull return Nfs3ErrBadHandle;
445 004aa293 2005-07-13 devnull
446 004aa293 2005-07-13 devnull e = entrybyhandle(h);
447 004aa293 2005-07-13 devnull if(e == nil)
448 004aa293 2005-07-13 devnull return Nfs3ErrNoEnt;
449 004aa293 2005-07-13 devnull
450 004aa293 2005-07-13 devnull e = e->kids;
451 004aa293 2005-07-13 devnull c = cookie;
452 004aa293 2005-07-13 devnull for(; c && e; c--)
453 004aa293 2005-07-13 devnull e = e->nextdir;
454 004aa293 2005-07-13 devnull if(e == nil){
455 004aa293 2005-07-13 devnull *pdata = 0;
456 004aa293 2005-07-13 devnull *pcount = 0;
457 004aa293 2005-07-13 devnull *peof = 1;
458 004aa293 2005-07-13 devnull return Nfs3Ok;
459 004aa293 2005-07-13 devnull }
460 004aa293 2005-07-13 devnull
461 004aa293 2005-07-13 devnull data = emalloc(count);
462 004aa293 2005-07-13 devnull p = data;
463 004aa293 2005-07-13 devnull ep = data+count;
464 004aa293 2005-07-13 devnull while(e && p < ep){
465 004aa293 2005-07-13 devnull ne.name = e->name;
466 80b4aedc 2006-05-04 devnull ne.namelen = strlen(e->name);
467 004aa293 2005-07-13 devnull ne.cookie = ++cookie;
468 004aa293 2005-07-13 devnull ne.fileid = *(u64int*)e->sha1;
469 004aa293 2005-07-13 devnull if(nfs3entrypack(p, ep, &np, &ne) < 0)
470 004aa293 2005-07-13 devnull break;
471 004aa293 2005-07-13 devnull p = np;
472 004aa293 2005-07-13 devnull e = e->nextdir;
473 004aa293 2005-07-13 devnull }
474 004aa293 2005-07-13 devnull *pdata = data;
475 004aa293 2005-07-13 devnull *pcount = p - data;
476 004aa293 2005-07-13 devnull *peof = 0;
477 004aa293 2005-07-13 devnull return Nfs3Ok;
478 004aa293 2005-07-13 devnull }
479 004aa293 2005-07-13 devnull
480 004aa293 2005-07-13 devnull void
481 004aa293 2005-07-13 devnull fsysconfigclose(Fsys *fsys)
482 004aa293 2005-07-13 devnull {
483 004aa293 2005-07-13 devnull USED(fsys);
484 004aa293 2005-07-13 devnull }
485 004aa293 2005-07-13 devnull
486 004aa293 2005-07-13 devnull int
487 004aa293 2005-07-13 devnull readconfig(char *name, VtCache *vcache, Nfs3Handle *h)
488 004aa293 2005-07-13 devnull {
489 004aa293 2005-07-13 devnull Config *c;
490 004aa293 2005-07-13 devnull Dir *d;
491 004aa293 2005-07-13 devnull
492 004aa293 2005-07-13 devnull if((d = dirstat(name)) == nil)
493 004aa293 2005-07-13 devnull return -1;
494 004aa293 2005-07-13 devnull
495 004aa293 2005-07-13 devnull c = readconfigfile(name, vcache);
496 004aa293 2005-07-13 devnull if(c == nil){
497 004aa293 2005-07-13 devnull free(d);
498 004aa293 2005-07-13 devnull return -1;
499 004aa293 2005-07-13 devnull }
500 004aa293 2005-07-13 devnull
501 004aa293 2005-07-13 devnull config = c;
502 004aa293 2005-07-13 devnull mtime = d->mtime;
503 004aa293 2005-07-13 devnull stime = time(0);
504 004aa293 2005-07-13 devnull free(d);
505 004aa293 2005-07-13 devnull
506 004aa293 2005-07-13 devnull mkhandle(h, c->root);
507 004aa293 2005-07-13 devnull fsysconfig._lookup = fsysconfiglookup;
508 004aa293 2005-07-13 devnull fsysconfig._access = fsysconfigaccess;
509 004aa293 2005-07-13 devnull fsysconfig._getattr = fsysconfiggetattr;
510 004aa293 2005-07-13 devnull fsysconfig._readdir = fsysconfigreaddir;
511 004aa293 2005-07-13 devnull fsysconfig._readfile = fsysconfigreadfile;
512 004aa293 2005-07-13 devnull fsysconfig._readlink = fsysconfigreadlink;
513 004aa293 2005-07-13 devnull fsysconfig._root = fsysconfigroot;
514 004aa293 2005-07-13 devnull fsysconfig._close = fsysconfigclose;
515 004aa293 2005-07-13 devnull return 0;
516 004aa293 2005-07-13 devnull }