135 lines · 2.6 KB · C
RawDownload
#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; voidusage(void){	fprint(2, "usage: disknfs [-RTr] disk\n");	threadexitsall("usage");} extern int _threaddebuglevel; voidthreadmain(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);} voidfsgetroot(Nfs3Handle *h){	fsysroot(fsys, h);} Nfs3Statusfsgetattr(SunAuthUnix *au, Nfs3Handle *h, Nfs3Attr *attr){	return fsysgetattr(fsys, au, h, attr);} Nfs3Statusfslookup(SunAuthUnix *au, Nfs3Handle *h, char *name, Nfs3Handle *nh){	return fsyslookup(fsys, au, h, name, nh);} Nfs3Statusfsaccess(SunAuthUnix *au, Nfs3Handle *h, u32int want, u32int *got, Nfs3Attr *attr){	return fsysaccess(fsys, au, h, want, got, attr);} Nfs3Statusfsreadlink(SunAuthUnix *au, Nfs3Handle *h, char **link){	return fsysreadlink(fsys, au, h, link);} Nfs3Statusfsreadfile(SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int offset, uchar **data, u32int *pcount, u1int *peof){	return fsysreadfile(fsys, au, h, count, offset, data, pcount, peof);} Nfs3Statusfsreaddir(SunAuthUnix *au, Nfs3Handle *h, u32int count, u64int cookie, uchar **data, u32int *pcount, u1int *peof){	return fsysreaddir(fsys, au, h, count, cookie, data, pcount, peof);}