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 d63790ee 2008-07-20 devnull int insecure = 0;
15 004aa293 2005-07-13 devnull static SunStatus
16 004aa293 2005-07-13 devnull authunixunpack(SunRpc *rpc, SunAuthUnix *au)
18 004aa293 2005-07-13 devnull uchar *p, *ep;
19 004aa293 2005-07-13 devnull SunAuthInfo *ai;
21 004aa293 2005-07-13 devnull ai = &rpc->cred;
22 004aa293 2005-07-13 devnull if(ai->flavor != SunAuthSys)
23 004aa293 2005-07-13 devnull return SunAuthTooWeak;
24 004aa293 2005-07-13 devnull p = ai->data;
25 004aa293 2005-07-13 devnull ep = p+ai->ndata;
26 004aa293 2005-07-13 devnull if(sunauthunixunpack(p, ep, &p, au) < 0)
27 004aa293 2005-07-13 devnull return SunGarbageArgs;
28 d63790ee 2008-07-20 devnull if(!insecure){
29 d63790ee 2008-07-20 devnull if(au->uid == 0)
30 d63790ee 2008-07-20 devnull au->uid = -1;
31 d63790ee 2008-07-20 devnull if(au->gid == 0)
32 d63790ee 2008-07-20 devnull au->gid = -1;
35 004aa293 2005-07-13 devnull return SunSuccess;
38 004aa293 2005-07-13 devnull static int
39 004aa293 2005-07-13 devnull rnull(SunMsg *m)
41 004aa293 2005-07-13 devnull NfsMount3RNull rx;
43 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
44 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
47 004aa293 2005-07-13 devnull static int
48 004aa293 2005-07-13 devnull rmnt(SunMsg *m)
50 004aa293 2005-07-13 devnull Nfs3Handle nh;
51 004aa293 2005-07-13 devnull NfsMount3RMnt rx;
52 004aa293 2005-07-13 devnull SunAuthUnix au;
55 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
56 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
58 004aa293 2005-07-13 devnull /* ignore file system path and return the dump tree */
60 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
61 004aa293 2005-07-13 devnull rx.nauth = 0;
62 004aa293 2005-07-13 devnull rx.status = 0;
63 004aa293 2005-07-13 devnull memset(&nh, 0, sizeof nh);
64 004aa293 2005-07-13 devnull fsgetroot(&nh);
65 004aa293 2005-07-13 devnull rx.handle = nh.h;
66 004aa293 2005-07-13 devnull rx.len = nh.len;
68 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
71 004aa293 2005-07-13 devnull static int
72 004aa293 2005-07-13 devnull rumnt(SunMsg *m)
74 004aa293 2005-07-13 devnull NfsMount3RUmnt rx;
76 004aa293 2005-07-13 devnull /* ignore */
78 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
79 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
82 004aa293 2005-07-13 devnull static int
83 004aa293 2005-07-13 devnull rumntall(SunMsg *m)
85 004aa293 2005-07-13 devnull NfsMount3RUmntall rx;
87 004aa293 2005-07-13 devnull /* ignore */
89 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
90 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
93 004aa293 2005-07-13 devnull static int
94 004aa293 2005-07-13 devnull rexport(SunMsg *m)
96 004aa293 2005-07-13 devnull NfsMount3RExport rx;
98 004aa293 2005-07-13 devnull /* ignore */
100 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
101 004aa293 2005-07-13 devnull rx.count = 0;
102 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
105 004aa293 2005-07-13 devnull static void
106 004aa293 2005-07-13 devnull rmount3(void *v)
108 004aa293 2005-07-13 devnull SunMsg *m;
111 004aa293 2005-07-13 devnull switch(m->call->type){
112 004aa293 2005-07-13 devnull default:
113 004aa293 2005-07-13 devnull sunmsgreplyerror(m, SunProcUnavail);
114 004aa293 2005-07-13 devnull case NfsMount3CallTNull:
115 004aa293 2005-07-13 devnull rnull(m);
117 004aa293 2005-07-13 devnull case NfsMount3CallTMnt:
118 004aa293 2005-07-13 devnull rmnt(m);
120 004aa293 2005-07-13 devnull case NfsMount3CallTDump:
121 004aa293 2005-07-13 devnull rmnt(m);
123 004aa293 2005-07-13 devnull case NfsMount3CallTUmnt:
124 004aa293 2005-07-13 devnull rumnt(m);
126 004aa293 2005-07-13 devnull case NfsMount3CallTUmntall:
127 004aa293 2005-07-13 devnull rumntall(m);
129 004aa293 2005-07-13 devnull case NfsMount3CallTExport:
130 004aa293 2005-07-13 devnull rexport(m);
136 004aa293 2005-07-13 devnull mount3proc(void *v)
138 004aa293 2005-07-13 devnull Channel *c;
139 004aa293 2005-07-13 devnull SunMsg *m;
141 004aa293 2005-07-13 devnull threadsetname("mount1");
143 004aa293 2005-07-13 devnull while((m=recvp(c)) != nil)
144 004aa293 2005-07-13 devnull threadcreate(rmount3, m, SunStackSize);
147 004aa293 2005-07-13 devnull static int
148 004aa293 2005-07-13 devnull senderror(SunMsg *m, SunCall *rc, Nfs3Status status)
150 004aa293 2005-07-13 devnull /* knows that status is first field in all replies */
151 004aa293 2005-07-13 devnull ((Nfs3RGetattr*)rc)->status = status;
152 004aa293 2005-07-13 devnull return sunmsgreply(m, rc);
155 004aa293 2005-07-13 devnull static int
156 004aa293 2005-07-13 devnull rnull0(SunMsg *m)
158 004aa293 2005-07-13 devnull Nfs3RNull rx;
160 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
161 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
164 004aa293 2005-07-13 devnull static int
165 004aa293 2005-07-13 devnull rgetattr(SunMsg *m)
167 004aa293 2005-07-13 devnull Nfs3TGetattr *tx = (Nfs3TGetattr*)m->call;
168 004aa293 2005-07-13 devnull Nfs3RGetattr rx;
169 004aa293 2005-07-13 devnull SunAuthUnix au;
172 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
173 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
175 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
176 004aa293 2005-07-13 devnull rx.status = fsgetattr(&au, &tx->handle, &rx.attr);
177 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
180 004aa293 2005-07-13 devnull static int
181 004aa293 2005-07-13 devnull rlookup(SunMsg *m)
183 004aa293 2005-07-13 devnull Nfs3TLookup *tx = (Nfs3TLookup*)m->call;
184 004aa293 2005-07-13 devnull Nfs3RLookup rx;
185 004aa293 2005-07-13 devnull SunAuthUnix au;
188 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
189 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
191 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
192 004aa293 2005-07-13 devnull rx.status = fsgetattr(&au, &tx->handle, &rx.dirAttr);
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.haveDirAttr = 1;
196 004aa293 2005-07-13 devnull rx.status = fslookup(&au, &tx->handle, tx->name, &rx.handle);
197 004aa293 2005-07-13 devnull if(rx.status != Nfs3Ok)
198 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
199 004aa293 2005-07-13 devnull rx.status = fsgetattr(&au, &rx.handle, &rx.attr);
200 004aa293 2005-07-13 devnull if(rx.status != Nfs3Ok)
201 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
202 004aa293 2005-07-13 devnull rx.haveAttr = 1;
203 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
206 004aa293 2005-07-13 devnull static int
207 004aa293 2005-07-13 devnull raccess(SunMsg *m)
209 004aa293 2005-07-13 devnull Nfs3TAccess *tx = (Nfs3TAccess*)m->call;
210 004aa293 2005-07-13 devnull Nfs3RAccess rx;
211 004aa293 2005-07-13 devnull SunAuthUnix au;
214 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
215 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
217 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
218 004aa293 2005-07-13 devnull rx.haveAttr = 1;
219 004aa293 2005-07-13 devnull rx.status = fsaccess(&au, &tx->handle, tx->access, &rx.access, &rx.attr);
220 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
223 004aa293 2005-07-13 devnull static int
224 004aa293 2005-07-13 devnull rreadlink(SunMsg *m)
226 004aa293 2005-07-13 devnull Nfs3RReadlink rx;
227 004aa293 2005-07-13 devnull Nfs3TReadlink *tx = (Nfs3TReadlink*)m->call;
228 004aa293 2005-07-13 devnull SunAuthUnix au;
231 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
232 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
234 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
235 004aa293 2005-07-13 devnull rx.haveAttr = 0;
236 004aa293 2005-07-13 devnull rx.data = nil;
237 004aa293 2005-07-13 devnull rx.status = fsreadlink(&au, &tx->handle, &rx.data);
238 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
239 004aa293 2005-07-13 devnull free(rx.data);
240 004aa293 2005-07-13 devnull return 0;
243 004aa293 2005-07-13 devnull static int
244 004aa293 2005-07-13 devnull rread(SunMsg *m)
246 004aa293 2005-07-13 devnull Nfs3TRead *tx = (Nfs3TRead*)m->call;
247 004aa293 2005-07-13 devnull Nfs3RRead rx;
248 004aa293 2005-07-13 devnull SunAuthUnix au;
251 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
252 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
254 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
255 004aa293 2005-07-13 devnull rx.haveAttr = 0;
256 004aa293 2005-07-13 devnull rx.data = nil;
257 004aa293 2005-07-13 devnull rx.status = fsreadfile(&au, &tx->handle, tx->count, tx->offset, &rx.data, &rx.count, &rx.eof);
258 004aa293 2005-07-13 devnull if(rx.status == Nfs3Ok)
259 004aa293 2005-07-13 devnull rx.ndata = rx.count;
261 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
262 004aa293 2005-07-13 devnull free(rx.data);
263 004aa293 2005-07-13 devnull return 0;
266 004aa293 2005-07-13 devnull static int
267 004aa293 2005-07-13 devnull rreaddir(SunMsg *m)
269 004aa293 2005-07-13 devnull Nfs3TReadDir *tx = (Nfs3TReadDir*)m->call;
270 004aa293 2005-07-13 devnull Nfs3RReadDir rx;
271 004aa293 2005-07-13 devnull SunAuthUnix au;
274 004aa293 2005-07-13 devnull if((ok = authunixunpack(&m->rpc, &au)) != SunSuccess)
275 004aa293 2005-07-13 devnull return sunmsgreplyerror(m, ok);
277 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
278 004aa293 2005-07-13 devnull rx.status = fsreaddir(&au, &tx->handle, tx->count, tx->cookie, &rx.data, &rx.count, &rx.eof);
279 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
280 004aa293 2005-07-13 devnull free(rx.data);
281 004aa293 2005-07-13 devnull return 0;
284 004aa293 2005-07-13 devnull static int
285 004aa293 2005-07-13 devnull rreaddirplus(SunMsg *m)
287 004aa293 2005-07-13 devnull Nfs3RReadDirPlus rx;
289 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
290 004aa293 2005-07-13 devnull rx.status = Nfs3ErrNotSupp;
291 004aa293 2005-07-13 devnull sunmsgreply(m, &rx.call);
292 004aa293 2005-07-13 devnull return 0;
295 004aa293 2005-07-13 devnull static int
296 004aa293 2005-07-13 devnull rfsstat(SunMsg *m)
298 004aa293 2005-07-13 devnull Nfs3RFsStat rx;
300 004aa293 2005-07-13 devnull /* just make something up */
301 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
302 004aa293 2005-07-13 devnull rx.status = Nfs3Ok;
303 004aa293 2005-07-13 devnull rx.haveAttr = 0;
304 004aa293 2005-07-13 devnull rx.totalBytes = 1000000000;
305 004aa293 2005-07-13 devnull rx.freeBytes = 0;
306 004aa293 2005-07-13 devnull rx.availBytes = 0;
307 004aa293 2005-07-13 devnull rx.totalFiles = 100000;
308 004aa293 2005-07-13 devnull rx.freeFiles = 0;
309 004aa293 2005-07-13 devnull rx.availFiles = 0;
310 004aa293 2005-07-13 devnull rx.invarSec = 0;
311 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
314 004aa293 2005-07-13 devnull static int
315 004aa293 2005-07-13 devnull rfsinfo(SunMsg *m)
317 004aa293 2005-07-13 devnull Nfs3RFsInfo rx;
319 004aa293 2005-07-13 devnull /* just make something up */
320 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
321 004aa293 2005-07-13 devnull rx.status = Nfs3Ok;
322 004aa293 2005-07-13 devnull rx.haveAttr = 0;
323 004aa293 2005-07-13 devnull rx.readMax = MaxDataSize;
324 004aa293 2005-07-13 devnull rx.readPref = MaxDataSize;
325 004aa293 2005-07-13 devnull rx.readMult = MaxDataSize;
326 004aa293 2005-07-13 devnull rx.writeMax = MaxDataSize;
327 004aa293 2005-07-13 devnull rx.writePref = MaxDataSize;
328 004aa293 2005-07-13 devnull rx.writeMult = MaxDataSize;
329 004aa293 2005-07-13 devnull rx.readDirPref = MaxDataSize;
330 004aa293 2005-07-13 devnull rx.maxFileSize = 1LL<<60;
331 004aa293 2005-07-13 devnull rx.timePrec.sec = 1;
332 004aa293 2005-07-13 devnull rx.timePrec.nsec = 0;
333 004aa293 2005-07-13 devnull rx.flags = Nfs3FsHomogeneous|Nfs3FsCanSetTime;
334 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
337 004aa293 2005-07-13 devnull static int
338 004aa293 2005-07-13 devnull rpathconf(SunMsg *m)
340 004aa293 2005-07-13 devnull Nfs3RPathconf rx;
342 004aa293 2005-07-13 devnull memset(&rx, 0, sizeof rx);
343 004aa293 2005-07-13 devnull rx.status = Nfs3Ok;
344 004aa293 2005-07-13 devnull rx.haveAttr = 0;
345 004aa293 2005-07-13 devnull rx.maxLink = 1;
346 004aa293 2005-07-13 devnull rx.maxName = 1024;
347 004aa293 2005-07-13 devnull rx.noTrunc = 1;
348 004aa293 2005-07-13 devnull rx.chownRestricted = 0;
349 004aa293 2005-07-13 devnull rx.caseInsensitive = 0;
350 004aa293 2005-07-13 devnull rx.casePreserving = 1;
351 004aa293 2005-07-13 devnull return sunmsgreply(m, &rx.call);
354 004aa293 2005-07-13 devnull static int
355 004aa293 2005-07-13 devnull rrofs(SunMsg *m)
357 004aa293 2005-07-13 devnull uchar buf[512]; /* clumsy hack*/
359 004aa293 2005-07-13 devnull memset(buf, 0, sizeof buf);
360 004aa293 2005-07-13 devnull return senderror(m, (SunCall*)buf, Nfs3ErrRoFs);
364 004aa293 2005-07-13 devnull static void
365 004aa293 2005-07-13 devnull rnfs3(void *v)
367 004aa293 2005-07-13 devnull SunMsg *m;
370 004aa293 2005-07-13 devnull switch(m->call->type){
371 004aa293 2005-07-13 devnull default:
372 004aa293 2005-07-13 devnull abort();
373 004aa293 2005-07-13 devnull case Nfs3CallTNull:
374 004aa293 2005-07-13 devnull rnull0(m);
376 004aa293 2005-07-13 devnull case Nfs3CallTGetattr:
377 004aa293 2005-07-13 devnull rgetattr(m);
379 004aa293 2005-07-13 devnull case Nfs3CallTLookup:
380 004aa293 2005-07-13 devnull rlookup(m);
382 004aa293 2005-07-13 devnull case Nfs3CallTAccess:
383 004aa293 2005-07-13 devnull raccess(m);
385 004aa293 2005-07-13 devnull case Nfs3CallTReadlink:
386 004aa293 2005-07-13 devnull rreadlink(m);
388 004aa293 2005-07-13 devnull case Nfs3CallTRead:
389 004aa293 2005-07-13 devnull rread(m);
391 004aa293 2005-07-13 devnull case Nfs3CallTReadDir:
392 004aa293 2005-07-13 devnull rreaddir(m);
394 004aa293 2005-07-13 devnull case Nfs3CallTReadDirPlus:
395 004aa293 2005-07-13 devnull rreaddirplus(m);
397 004aa293 2005-07-13 devnull case Nfs3CallTFsStat:
398 004aa293 2005-07-13 devnull rfsstat(m);
400 004aa293 2005-07-13 devnull case Nfs3CallTFsInfo:
401 004aa293 2005-07-13 devnull rfsinfo(m);
403 004aa293 2005-07-13 devnull case Nfs3CallTPathconf:
404 004aa293 2005-07-13 devnull rpathconf(m);
406 004aa293 2005-07-13 devnull case Nfs3CallTSetattr:
407 004aa293 2005-07-13 devnull case Nfs3CallTWrite:
408 004aa293 2005-07-13 devnull case Nfs3CallTCreate:
409 004aa293 2005-07-13 devnull case Nfs3CallTMkdir:
410 004aa293 2005-07-13 devnull case Nfs3CallTSymlink:
411 004aa293 2005-07-13 devnull case Nfs3CallTMknod:
412 004aa293 2005-07-13 devnull case Nfs3CallTRemove:
413 004aa293 2005-07-13 devnull case Nfs3CallTRmdir:
414 004aa293 2005-07-13 devnull case Nfs3CallTLink:
415 004aa293 2005-07-13 devnull case Nfs3CallTCommit:
416 004aa293 2005-07-13 devnull rrofs(m);
422 004aa293 2005-07-13 devnull nfs3proc(void *v)
424 004aa293 2005-07-13 devnull Channel *c;
425 004aa293 2005-07-13 devnull SunMsg *m;
428 004aa293 2005-07-13 devnull threadsetname("nfs3");
429 004aa293 2005-07-13 devnull while((m = recvp(c)) != nil)
430 004aa293 2005-07-13 devnull threadcreate(rnfs3, m, SunStackSize);