2 004aa293 2005-07-13 devnull * Simple read-only NFS v3 server.
3 004aa293 2005-07-13 devnull * Runs every request in its own thread.
4 004aa293 2005-07-13 devnull * Expects client to provide the fsxxx routines in nfs3srv.h.
6 004aa293 2005-07-13 devnull #include <u.h>
7 004aa293 2005-07-13 devnull #include <libc.h>
8 004aa293 2005-07-13 devnull #include <thread.h>
9 004aa293 2005-07-13 devnull #include <sunrpc.h>
10 004aa293 2005-07-13 devnull #include <nfs3.h>
11 004aa293 2005-07-13 devnull #include "nfs3srv.h"
13 004aa293 2005-07-13 devnull static SunStatus
14 004aa293 2005-07-13 devnull authunixunpack(SunRpc *rpc, SunAuthUnix *au)
16 004aa293 2005-07-13 devnull uchar *p, *ep;
17 004aa293 2005-07-13 devnull SunAuthInfo *ai;
19 004aa293 2005-07-13 devnull ai = &rpc->cred;
20 004aa293 2005-07-13 devnull if(ai->flavor != SunAuthSys)
21 004aa293 2005-07-13 devnull return SunAuthTooWeak;
22 004aa293 2005-07-13 devnull p = ai->data;
23 004aa293 2005-07-13 devnull ep = p+ai->ndata;
24 004aa293 2005-07-13 devnull if(sunauthunixunpack(p, ep, &p, au) < 0)
25 004aa293 2005-07-13 devnull return SunGarbageArgs;
26 004aa293 2005-07-13 devnull if(au->uid == 0)
27 004aa293 2005-07-13 devnull au->uid = -1;
28 004aa293 2005-07-13 devnull if(au->gid == 0)
29 004aa293 2005-07-13 devnull au->gid = -1;
31 004aa293 2005-07-13 devnull return SunSuccess;
34 004aa293 2005-07-13 devnull static int
35 004aa293 2005-07-13 devnull rnull(SunMsg *m)
37 004aa293 2005-07-13 devnull NfsMount3RNull rx;
39 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
40 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
43 004aa293 2005-07-13 devnull static int
44 004aa293 2005-07-13 devnull rmnt(SunMsg *m)
46 004aa293 2005-07-13 devnull Nfs3Handle nh;
47 004aa293 2005-07-13 devnull NfsMount3RMnt rx;
48 004aa293 2005-07-13 devnull SunAuthUnix au;
51 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
52 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
54 004aa293 2005-07-13 devnull /* ignore file system path and return the dump tree */
56 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
57 004aa293 2005-07-13 devnull rx.nauth = 0;
58 004aa293 2005-07-13 devnull rx.status = 0;
59 004aa293 2005-07-13 devnull memset(&nh, 0, sizeof nh);
60 004aa293 2005-07-13 devnull fsgetroot(&nh);
61 004aa293 2005-07-13 devnull rx.handle = nh.h;
62 004aa293 2005-07-13 devnull rx.len = nh.len;
64 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
67 004aa293 2005-07-13 devnull static int
68 004aa293 2005-07-13 devnull rumnt(SunMsg *m)
70 004aa293 2005-07-13 devnull NfsMount3RUmnt rx;
72 004aa293 2005-07-13 devnull /* ignore */
74 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
75 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
78 004aa293 2005-07-13 devnull static int
79 004aa293 2005-07-13 devnull rumntall(SunMsg *m)
81 004aa293 2005-07-13 devnull NfsMount3RUmntall rx;
83 004aa293 2005-07-13 devnull /* ignore */
85 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
86 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
89 004aa293 2005-07-13 devnull static int
90 004aa293 2005-07-13 devnull rexport(SunMsg *m)
92 004aa293 2005-07-13 devnull NfsMount3RExport rx;
94 004aa293 2005-07-13 devnull /* ignore */
96 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
97 004aa293 2005-07-13 devnull rx.count = 0;
98 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
101 004aa293 2005-07-13 devnull static void
102 004aa293 2005-07-13 devnull rmount3(void *v)
104 004aa293 2005-07-13 devnull SunMsg *m;
107 004aa293 2005-07-13 devnull switch(m->call->type){
108 004aa293 2005-07-13 devnull default:
109 004aa293 2005-07-13 devnull sunmsgreplyerror(m, SunProcUnavail);
110 004aa293 2005-07-13 devnull case NfsMount3CallTNull:
111 004aa293 2005-07-13 devnull rnull(m);
113 004aa293 2005-07-13 devnull case NfsMount3CallTMnt:
114 004aa293 2005-07-13 devnull rmnt(m);
116 004aa293 2005-07-13 devnull case NfsMount3CallTDump:
117 004aa293 2005-07-13 devnull rmnt(m);
119 004aa293 2005-07-13 devnull case NfsMount3CallTUmnt:
120 004aa293 2005-07-13 devnull rumnt(m);
122 004aa293 2005-07-13 devnull case NfsMount3CallTUmntall:
123 004aa293 2005-07-13 devnull rumntall(m);
125 004aa293 2005-07-13 devnull case NfsMount3CallTExport:
126 004aa293 2005-07-13 devnull rexport(m);
132 004aa293 2005-07-13 devnull mount3proc(void *v)
134 004aa293 2005-07-13 devnull Channel *c;
135 004aa293 2005-07-13 devnull SunMsg *m;
137 004aa293 2005-07-13 devnull threadsetname("mount1");
139 004aa293 2005-07-13 devnull while((m=recvp(c)) != nil)
140 004aa293 2005-07-13 devnull threadcreate(rmount3, m, SunStackSize);
143 004aa293 2005-07-13 devnull static int
144 004aa293 2005-07-13 devnull senderror(SunMsg *m, SunCall *rc, Nfs3Status status)
146 004aa293 2005-07-13 devnull /* knows that status is first field in all replies */
147 004aa293 2005-07-13 devnull ((Nfs3RGetattr*)rc)->status = status;
148 004aa293 2005-07-13 devnull return sunmsgreply(m, rc);
151 004aa293 2005-07-13 devnull static int
152 004aa293 2005-07-13 devnull rnull0(SunMsg *m)
154 004aa293 2005-07-13 devnull Nfs3RNull rx;
156 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
157 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
160 004aa293 2005-07-13 devnull static int
161 004aa293 2005-07-13 devnull rgetattr(SunMsg *m)
163 004aa293 2005-07-13 devnull Nfs3TGetattr *tx = (Nfs3TGetattr*)m->call;
164 004aa293 2005-07-13 devnull Nfs3RGetattr rx;
165 004aa293 2005-07-13 devnull SunAuthUnix au;
168 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
169 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
171 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
172 004aa293 2005-07-13 devnull rx.status = fsgetattr(&au, &tx->handle, &rx.attr);
173 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
176 004aa293 2005-07-13 devnull static int
177 004aa293 2005-07-13 devnull rlookup(SunMsg *m)
179 004aa293 2005-07-13 devnull Nfs3TLookup *tx = (Nfs3TLookup*)m->call;
180 004aa293 2005-07-13 devnull Nfs3RLookup rx;
181 004aa293 2005-07-13 devnull SunAuthUnix au;
184 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
185 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
187 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
188 004aa293 2005-07-13 devnull rx.status = fsgetattr(&au, &tx->handle, &rx.dirAttr);
189 004aa293 2005-07-13 devnull if(rx.status != Nfs3Ok)
190 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
191 004aa293 2005-07-13 devnull rx.haveDirAttr = 1;
192 004aa293 2005-07-13 devnull rx.status = fslookup(&au, &tx->handle, tx->name, &rx.handle);
193 004aa293 2005-07-13 devnull if(rx.status != Nfs3Ok)
194 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
195 004aa293 2005-07-13 devnull rx.status = fsgetattr(&au, &rx.handle, &rx.attr);
196 004aa293 2005-07-13 devnull if(rx.status != Nfs3Ok)
197 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
198 004aa293 2005-07-13 devnull rx.haveAttr = 1;
199 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
202 004aa293 2005-07-13 devnull static int
203 004aa293 2005-07-13 devnull raccess(SunMsg *m)
205 004aa293 2005-07-13 devnull Nfs3TAccess *tx = (Nfs3TAccess*)m->call;
206 004aa293 2005-07-13 devnull Nfs3RAccess rx;
207 004aa293 2005-07-13 devnull SunAuthUnix au;
210 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
211 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
213 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
214 004aa293 2005-07-13 devnull rx.haveAttr = 1;
215 004aa293 2005-07-13 devnull rx.status = fsaccess(&au, &tx->handle, tx->access, &rx.access, &rx.attr);
216 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
219 004aa293 2005-07-13 devnull static int
220 004aa293 2005-07-13 devnull rreadlink(SunMsg *m)
222 004aa293 2005-07-13 devnull Nfs3RReadlink rx;
223 004aa293 2005-07-13 devnull Nfs3TReadlink *tx = (Nfs3TReadlink*)m->call;
224 004aa293 2005-07-13 devnull SunAuthUnix au;
227 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
228 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
230 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
231 004aa293 2005-07-13 devnull rx.haveAttr = 0;
232 004aa293 2005-07-13 devnull rx.data = nil;
233 004aa293 2005-07-13 devnull rx.status = fsreadlink(&au, &tx->handle, &rx.data);
234 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
235 004aa293 2005-07-13 devnull free(rx.data);
236 004aa293 2005-07-13 devnull return 0;
239 004aa293 2005-07-13 devnull static int
240 004aa293 2005-07-13 devnull rread(SunMsg *m)
242 004aa293 2005-07-13 devnull Nfs3TRead *tx = (Nfs3TRead*)m->call;
243 004aa293 2005-07-13 devnull Nfs3RRead rx;
244 004aa293 2005-07-13 devnull SunAuthUnix au;
247 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
248 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
250 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
251 004aa293 2005-07-13 devnull rx.haveAttr = 0;
252 004aa293 2005-07-13 devnull rx.data = nil;
253 004aa293 2005-07-13 devnull rx.status = fsreadfile(&au, &tx->handle, tx->count, tx->offset, &rx.data, &rx.count, &rx.eof);
254 004aa293 2005-07-13 devnull if(rx.status == Nfs3Ok)
255 004aa293 2005-07-13 devnull rx.ndata = rx.count;
257 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
258 004aa293 2005-07-13 devnull free(rx.data);
259 004aa293 2005-07-13 devnull return 0;
262 004aa293 2005-07-13 devnull static int
263 004aa293 2005-07-13 devnull rreaddir(SunMsg *m)
265 004aa293 2005-07-13 devnull Nfs3TReadDir *tx = (Nfs3TReadDir*)m->call;
266 004aa293 2005-07-13 devnull Nfs3RReadDir rx;
267 004aa293 2005-07-13 devnull SunAuthUnix au;
270 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
271 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
273 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
274 004aa293 2005-07-13 devnull rx.status = fsreaddir(&au, &tx->handle, tx->count, tx->cookie, &rx.data, &rx.count, &rx.eof);
275 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
276 004aa293 2005-07-13 devnull free(rx.data);
277 004aa293 2005-07-13 devnull return 0;
280 004aa293 2005-07-13 devnull static int
281 004aa293 2005-07-13 devnull rreaddirplus(SunMsg *m)
283 004aa293 2005-07-13 devnull Nfs3RReadDirPlus rx;
285 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
286 004aa293 2005-07-13 devnull rx.status = Nfs3ErrNotSupp;
287 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
288 004aa293 2005-07-13 devnull return 0;
291 004aa293 2005-07-13 devnull static int
292 004aa293 2005-07-13 devnull rfsstat(SunMsg *m)
294 004aa293 2005-07-13 devnull Nfs3RFsStat rx;
296 004aa293 2005-07-13 devnull /* just make something up */
297 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
298 004aa293 2005-07-13 devnull rx.status = Nfs3Ok;
299 004aa293 2005-07-13 devnull rx.haveAttr = 0;
300 004aa293 2005-07-13 devnull rx.totalBytes = 1000000000;
301 004aa293 2005-07-13 devnull rx.freeBytes = 0;
302 004aa293 2005-07-13 devnull rx.availBytes = 0;
303 004aa293 2005-07-13 devnull rx.totalFiles = 100000;
304 004aa293 2005-07-13 devnull rx.freeFiles = 0;
305 004aa293 2005-07-13 devnull rx.availFiles = 0;
306 004aa293 2005-07-13 devnull rx.invarSec = 0;
307 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
310 004aa293 2005-07-13 devnull static int
311 004aa293 2005-07-13 devnull rfsinfo(SunMsg *m)
313 004aa293 2005-07-13 devnull Nfs3RFsInfo rx;
315 004aa293 2005-07-13 devnull /* just make something up */
316 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
317 004aa293 2005-07-13 devnull rx.status = Nfs3Ok;
318 004aa293 2005-07-13 devnull rx.haveAttr = 0;
319 004aa293 2005-07-13 devnull rx.readMax = MaxDataSize;
320 004aa293 2005-07-13 devnull rx.readPref = MaxDataSize;
321 004aa293 2005-07-13 devnull rx.readMult = MaxDataSize;
322 004aa293 2005-07-13 devnull rx.writeMax = MaxDataSize;
323 004aa293 2005-07-13 devnull rx.writePref = MaxDataSize;
324 004aa293 2005-07-13 devnull rx.writeMult = MaxDataSize;
325 004aa293 2005-07-13 devnull rx.readDirPref = MaxDataSize;
326 004aa293 2005-07-13 devnull rx.maxFileSize = 1LL<<60;
327 004aa293 2005-07-13 devnull rx.timePrec.sec = 1;
328 004aa293 2005-07-13 devnull rx.timePrec.nsec = 0;
329 004aa293 2005-07-13 devnull rx.flags = Nfs3FsHomogeneous|Nfs3FsCanSetTime;
330 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
333 004aa293 2005-07-13 devnull static int
334 004aa293 2005-07-13 devnull rpathconf(SunMsg *m)
336 004aa293 2005-07-13 devnull Nfs3RPathconf rx;
338 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
339 004aa293 2005-07-13 devnull rx.status = Nfs3Ok;
340 004aa293 2005-07-13 devnull rx.haveAttr = 0;
341 004aa293 2005-07-13 devnull rx.maxLink = 1;
342 004aa293 2005-07-13 devnull rx.maxName = 1024;
343 004aa293 2005-07-13 devnull rx.noTrunc = 1;
344 004aa293 2005-07-13 devnull rx.chownRestricted = 0;
345 004aa293 2005-07-13 devnull rx.caseInsensitive = 0;
346 004aa293 2005-07-13 devnull rx.casePreserving = 1;
347 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
350 004aa293 2005-07-13 devnull static int
351 004aa293 2005-07-13 devnull rrofs(SunMsg *m)
353 004aa293 2005-07-13 devnull uchar buf[512]; /* clumsy hack*/
355 004aa293 2005-07-13 devnull memset(buf, 0, sizeof buf);
356 004aa293 2005-07-13 devnull return senderror(m, (SunCall*)buf, Nfs3ErrRoFs);
360 004aa293 2005-07-13 devnull static void
361 004aa293 2005-07-13 devnull rnfs3(void *v)
363 004aa293 2005-07-13 devnull SunMsg *m;
366 004aa293 2005-07-13 devnull switch(m->call->type){
367 004aa293 2005-07-13 devnull default:
368 004aa293 2005-07-13 devnull abort();
369 004aa293 2005-07-13 devnull case Nfs3CallTNull:
370 004aa293 2005-07-13 devnull rnull0(m);
372 004aa293 2005-07-13 devnull case Nfs3CallTGetattr:
373 004aa293 2005-07-13 devnull rgetattr(m);
375 004aa293 2005-07-13 devnull case Nfs3CallTLookup:
376 004aa293 2005-07-13 devnull rlookup(m);
378 004aa293 2005-07-13 devnull case Nfs3CallTAccess:
379 004aa293 2005-07-13 devnull raccess(m);
381 004aa293 2005-07-13 devnull case Nfs3CallTReadlink:
382 004aa293 2005-07-13 devnull rreadlink(m);
384 004aa293 2005-07-13 devnull case Nfs3CallTRead:
385 004aa293 2005-07-13 devnull rread(m);
387 004aa293 2005-07-13 devnull case Nfs3CallTReadDir:
388 004aa293 2005-07-13 devnull rreaddir(m);
390 004aa293 2005-07-13 devnull case Nfs3CallTReadDirPlus:
391 004aa293 2005-07-13 devnull rreaddirplus(m);
393 004aa293 2005-07-13 devnull case Nfs3CallTFsStat:
394 004aa293 2005-07-13 devnull rfsstat(m);
396 004aa293 2005-07-13 devnull case Nfs3CallTFsInfo:
397 004aa293 2005-07-13 devnull rfsinfo(m);
399 004aa293 2005-07-13 devnull case Nfs3CallTPathconf:
400 004aa293 2005-07-13 devnull rpathconf(m);
402 004aa293 2005-07-13 devnull case Nfs3CallTSetattr:
403 004aa293 2005-07-13 devnull case Nfs3CallTWrite:
404 004aa293 2005-07-13 devnull case Nfs3CallTCreate:
405 004aa293 2005-07-13 devnull case Nfs3CallTMkdir:
406 004aa293 2005-07-13 devnull case Nfs3CallTSymlink:
407 004aa293 2005-07-13 devnull case Nfs3CallTMknod:
408 004aa293 2005-07-13 devnull case Nfs3CallTRemove:
409 004aa293 2005-07-13 devnull case Nfs3CallTRmdir:
410 004aa293 2005-07-13 devnull case Nfs3CallTLink:
411 004aa293 2005-07-13 devnull case Nfs3CallTCommit:
412 004aa293 2005-07-13 devnull rrofs(m);
418 004aa293 2005-07-13 devnull nfs3proc(void *v)
420 004aa293 2005-07-13 devnull Channel *c;
421 004aa293 2005-07-13 devnull SunMsg *m;
424 004aa293 2005-07-13 devnull threadsetname("nfs3");
425 004aa293 2005-07-13 devnull while((m = recvp(c)) != nil)
426 004aa293 2005-07-13 devnull threadcreate(rnfs3, m, SunStackSize);