| #include <u.h> |
| #include <libc.h> |
| #include <ip.h> |
| #include <thread.h> |
| #include <sunrpc.h> |
| #include <nfs3.h> |
| #include <diskfs.h> |
| #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); |
| } |
| |