#include #include #include #include #include #include #include #include "nfs3srv.h" Disk *disk; Fsys *fsys; void usage(void) { fprint(2, "usage: disknfs [-RTr] disk\n"); threadexitsall("usage"); } extern int _threaddebuglevel; void threadmain(int argc, char **argv) { char *addr; SunSrv *srv; Channel *nfs3chan; Channel *mountchan; Nfs3Handle h; fmtinstall('B', sunrpcfmt); fmtinstall('C', suncallfmt); fmtinstall('H', encodefmt); fmtinstall('I', eipfmt); sunfmtinstall(&nfs3prog); sunfmtinstall(&nfsmount3prog); srv = sunsrv(); addr = "*"; ARGBEGIN{ default: usage(); case 'L': if(srv->localonly == 0) srv->localonly = 1; else srv->localparanoia = 1; break; case 'R': srv->chatty++; break; case 'T': _threaddebuglevel = 0xFFFFFFFF; break; case 'r': srv->alwaysreject++; break; }ARGEND if(argc != 1 && argc != 2) usage(); if((disk = diskopenfile(argv[0])) == nil) sysfatal("diskopen: %r"); if((disk = diskcache(disk, 16384, 256)) == nil) sysfatal("diskcache: %r"); if((fsys = fsysopen(disk)) == nil) sysfatal("fsysopen: %r"); nfs3chan = chancreate(sizeof(SunMsg*), 0); mountchan = chancreate(sizeof(SunMsg*), 0); if(argc > 1) addr = argv[1]; addr = netmkaddr(addr, "udp", "2049"); if(sunsrvudp(srv, addr) < 0) sysfatal("starting server: %r"); sunsrvthreadcreate(srv, nfs3proc, nfs3chan); sunsrvthreadcreate(srv, mount3proc, mountchan); sunsrvprog(srv, &nfs3prog, nfs3chan); sunsrvprog(srv, &nfsmount3prog, mountchan); fsgetroot(&h); print("vmount0 -h %.*H %s /mnt\n", h.len, h.h, addr); threadexits(nil); } void fsgetroot(Nfs3Handle *h) { fsysroot(fsys, h); } Nfs3Status fsgetattr(SunAuthUnix *au, Nfs3Handle *h, Nfs3Attr *attr) { return fsysgetattr(fsys, au, h, attr); } Nfs3Status fslookup(SunAuthUnix *au, Nfs3Handle *h, char *name, Nfs3Handle *nh) { return fsyslookup(fsys, au, h, name, nh); } Nfs3Status fsaccess(SunAuthUnix *au, Nfs3Handle *h, u32int want, u32int *got, Nfs3Attr *attr) { return fsysaccess(fsys, au, h, want, got, attr); } Nfs3Status fsreadlink(SunAuthUnix *au, Nfs3Handle *h, char **link) { return fsysreadlink(fsys, au, h, link); } Nfs3Status fsreadfile(SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int offset, uchar **data, u32int *pcount, u1int *peof) { return fsysreadfile(fsys, au, h, count, offset, data, pcount, peof); } Nfs3Status fsreaddir(SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int cookie, uchar **data, u32int *pcount, u1int *peof) { return fsysreaddir(fsys, au, h, count, cookie, data, pcount, peof); }