⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nfsmount.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* Copyright © 2003 Russ Cox, MIT; see /sys/src/libsunrpc/COPYING */#include <u.h>#include <libc.h>#include <thread.h>#include <sunrpc.h>#include <nfs3.h>int chatty;SunClient *client;voidusage(void){	fprint(2, "usage: nfsmount address [cmd]\n"		"cmd is one of:\n"		"\tnull\n"		"\tmnt path\n"		"\tdump\n"		"\tumnt path\n"		"\tumntall\n"		"\texport (default)\n");	threadexitsall("usage");}voidportCall(SunCall *c, PortCallType type){	c->rpc.prog = PortProgram;	c->rpc.vers = PortVersion;	c->rpc.proc = type>>1;	c->rpc.iscall = !(type&1);	c->type = type;}intgetport(SunClient *client, uint prog, uint vers, uint prot, uint *port){	PortTGetport tx;	PortRGetport rx;	memset(&tx, 0, sizeof tx);	portCall(&tx.call, PortCallTGetport);	tx.map.prog = prog;	tx.map.vers = vers;	tx.map.prot = prot;	memset(&rx, 0, sizeof rx);	portCall(&rx.call, PortCallRGetport);	if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0)		return -1;	*port = rx.port;	return 0;}uchar unixauth[] = {	0x12, 0x23, 0x34, 0x45,	/* stamp */	0x00, 0x00, 0x00, 0x04,	/* gnot */	0x67, 0x6e, 0x6f, 0x74,	0x00, 0x00, 0x03, 0xE9,	/* 1001 */	0x00, 0x00, 0x03, 0xE9,	/* 1001 */	0x00, 0x00, 0x00, 0x00,	/* gid list */};voidmountCall(SunCall *c, NfsMount3CallType type){	c->rpc.prog = NfsMount3Program;	c->rpc.vers = NfsMount3Version;	c->rpc.proc = type>>1;	c->rpc.iscall = !(type&1);	if(c->rpc.iscall){		c->rpc.cred.flavor = SunAuthSys;		c->rpc.cred.data = unixauth;		c->rpc.cred.ndata = sizeof unixauth;	}	c->type = type;}voidtnull(char **argv){	NfsMount3TNull tx;	NfsMount3RNull rx;	USED(argv);	memset(&tx, 0, sizeof tx);	mountCall(&tx.call, NfsMount3CallTNull);	memset(&rx, 0, sizeof rx);	mountCall(&rx.call, NfsMount3CallRNull);	if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0)		sysfatal("rpc: %r");}voidtmnt(char **argv){	int i;	NfsMount3TMnt tx;	NfsMount3RMnt rx;	memset(&tx, 0, sizeof tx);	mountCall(&tx.call, NfsMount3CallTMnt);	tx.path = argv[0];	memset(&rx, 0, sizeof rx);	mountCall(&rx.call, NfsMount3CallRMnt);	if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0)		sysfatal("rpc: %r");	if(rx.status != 0){		nfs3Errstr(rx.status);		sysfatal("mnt: %r");	}	print("handle %.*H\n", rx.len, rx.handle);	print("auth:");	for(i=0; i<rx.nauth; i++)		print(" %ud", (uint)rx.auth[i]);	print("\n");}voidtdump(char **argv){	uchar *p, *ep;	NfsMount3TDump tx;	NfsMount3RDump rx;	NfsMount3Entry e;	memset(&tx, 0, sizeof tx);	mountCall(&tx.call, NfsMount3CallTDump);	USED(argv);	memset(&rx, 0, sizeof rx);	mountCall(&rx.call, NfsMount3CallRDump);	if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0)		sysfatal("rpc: %r");	p = rx.data;	ep = p+rx.count;	while(p < ep){		if(nfsMount3EntryUnpack(p, ep, &p, &e) < 0)			sysfatal("unpack entry structure failed");		print("%s %s\n", e.host, e.path);	}}voidtumnt(char **argv){	NfsMount3TUmnt tx;	NfsMount3RUmnt rx;	memset(&tx, 0, sizeof tx);	mountCall(&tx.call, NfsMount3CallTUmnt);	tx.path = argv[0];	memset(&rx, 0, sizeof rx);	mountCall(&rx.call, NfsMount3CallRUmnt);	if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0)		sysfatal("rpc: %r");	print("\n");}voidtumntall(char **argv){	NfsMount3TUmntall tx;	NfsMount3RUmntall rx;	memset(&tx, 0, sizeof tx);	mountCall(&tx.call, NfsMount3CallTUmntall);	USED(argv);	memset(&rx, 0, sizeof rx);	mountCall(&rx.call, NfsMount3CallRUmntall);	if(sunClientRpc(client, 0, &tx.call, &rx.call, nil) < 0)		sysfatal("rpc: %r");	print("\n");}voidtexport(char **argv){	uchar *p, *ep, *tofree;	char **g, **gg;	int ng, i, n;	NfsMount3TDump tx;	NfsMount3RDump rx;	NfsMount3Export e;	memset(&tx, 0, sizeof tx);	mountCall(&tx.call, NfsMount3CallTExport);	USED(argv);	memset(&rx, 0, sizeof rx);	mountCall(&rx.call, NfsMount3CallRExport);	if(sunClientRpc(client, 0, &tx.call, &rx.call, &tofree) < 0)		sysfatal("rpc: %r");	p = rx.data;	ep = p+rx.count;	g = nil;	ng = 0;	while(p < ep){		n = nfsMount3ExportGroupSize(p);		if(n > ng){			ng = n;			g = erealloc(g, sizeof(g[0])*ng);		}		if(nfsMount3ExportUnpack(p, ep, &p, g, &gg, &e) < 0)			sysfatal("unpack export structure failed");		print("%s", e.path);		for(i=0; i<e.ng; i++)			print(" %s", e.g[i]);		print("\n");	}	free(tofree);}static struct {	char *cmd;	int narg;	void (*fn)(char**);} tab[] = {	"null",	0,	tnull,	"mnt",	1,	tmnt,	"dump",	0,	tdump,	"umnt",	1,	tumnt,	"umntall",	1,	tumntall,	"export",	0,	texport,};char*netchangeport(char *addr, char *port){	static char buf[256];	char *r;	strecpy(buf, buf+sizeof buf, addr);	r = strrchr(buf, '!');	if(r == nil)		return nil;	r++;	strecpy(r, buf+sizeof buf, port);	return buf;}voidthreadmain(int argc, char **argv){	char *dflt[] = { "export", };	char *addr, *cmd;	int i, proto;	uint port;	char buf[32];	int mapit;	mapit = 1;	ARGBEGIN{	case 'R':		chatty++;		break;	case 'm':		mapit = 0;		break;	}ARGEND	if(argc < 1)		usage();	fmtinstall('B', sunRpcFmt);	fmtinstall('C', sunCallFmt);	fmtinstall('H', encodefmt);	sunFmtInstall(&portProg);	sunFmtInstall(&nfsMount3Prog);	addr = netmkaddr(argv[0], "udp", "portmap");	if(mapit){		/* translate with port mapper */		fprint(2, "connecting to %s\n", addr);		if((client = sunDial(addr)) == nil)			sysfatal("dial %s: %r", addr);		client->chatty = chatty;		sunClientProg(client, &portProg);		if(strstr(addr, "udp!"))			proto = PortProtoUdp;		else			proto = PortProtoTcp;		if(getport(client, NfsMount3Program, NfsMount3Version, proto, &port) < 0)			sysfatal("getport: %r");		snprint(buf, sizeof buf, "%ud!r", port);		addr = netchangeport(addr, buf);		sunClientClose(client);	}	fprint(2, "connecting to %s\n", addr);	if((client = sunDial(addr)) == nil)		sysfatal("dial %s: %r", addr);	client->chatty = chatty;	sunClientProg(client, &nfsMount3Prog);	argv++;	argc--;	if(argc == 0){		argc = 1;		argv = dflt;	}	cmd = argv[0];	argv++;	argc--;	for(i=0; i<nelem(tab); i++){		if(strcmp(tab[i].cmd, cmd) == 0){			if(tab[i].narg != argc)				usage();			(*tab[i].fn)(argv);			threadexitsall(nil);		}	}	usage();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -