xref: /plan9/sys/src/cmd/9nfs/mport.c (revision 883a8c51bed350ea85a0220461d31e311550db04)
17dd7cddfSDavid du Colombier #include "all.h"
27dd7cddfSDavid du Colombier 
37dd7cddfSDavid du Colombier typedef struct Rpcconn	Rpcconn;
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier struct Rpcconn
67dd7cddfSDavid du Colombier {
77dd7cddfSDavid du Colombier 	int	data;
87dd7cddfSDavid du Colombier 	int	ctl;
97dd7cddfSDavid du Colombier 	Rpccall	cmd;
107dd7cddfSDavid du Colombier 	Rpccall	reply;
117dd7cddfSDavid du Colombier 	uchar	rpcbuf[8192];
127dd7cddfSDavid du Colombier 	uchar	argbuf[8192];
137dd7cddfSDavid du Colombier };
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier void	putauth(char*, Auth*);
167dd7cddfSDavid du Colombier int	rpccall(Rpcconn*, int);
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier int	rpcdebug;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier Rpcconn	r;
217dd7cddfSDavid du Colombier char *	mach;
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier void
main(int argc,char ** argv)247dd7cddfSDavid du Colombier main(int argc, char **argv)
257dd7cddfSDavid du Colombier {
269a747e4fSDavid du Colombier 	char addr[64], dir[64], name[128];
27*883a8c51SDavid du Colombier 	char buf[33], *p;
287dd7cddfSDavid du Colombier 	uchar *dataptr, *argptr;
297dd7cddfSDavid du Colombier 	int i, fd, n, remport;
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier 	ARGBEGIN{
327dd7cddfSDavid du Colombier 	case 'm':
337dd7cddfSDavid du Colombier 		mach = ARGF();
347dd7cddfSDavid du Colombier 		break;
357dd7cddfSDavid du Colombier 	case 'D':
367dd7cddfSDavid du Colombier 		++rpcdebug;
377dd7cddfSDavid du Colombier 		break;
387dd7cddfSDavid du Colombier 	}ARGEND
397dd7cddfSDavid du Colombier 	if(argc != 1)
407dd7cddfSDavid du Colombier 		exits("usage");
41*883a8c51SDavid du Colombier 
429a747e4fSDavid du Colombier 	snprint(addr, sizeof addr, "udp!%s!111", argv[0]);
437dd7cddfSDavid du Colombier 	r.data = dial(addr, 0, dir, &r.ctl);
447dd7cddfSDavid du Colombier 	if(r.data < 0){
457dd7cddfSDavid du Colombier 		fprint(2, "dial %s: %r\n", addr);
467dd7cddfSDavid du Colombier 		exits("dial");
477dd7cddfSDavid du Colombier 	}
487dd7cddfSDavid du Colombier 	if(rpcdebug)
497dd7cddfSDavid du Colombier 		fprint(2, "dial %s: dir=%s\n", addr, dir);
507dd7cddfSDavid du Colombier 	if(fprint(r.ctl, "headers") < 0){
517dd7cddfSDavid du Colombier 		fprint(2, "can't set header mode: %r\n");
527dd7cddfSDavid du Colombier 		exits("headers");
537dd7cddfSDavid du Colombier 	}
547dd7cddfSDavid du Colombier 	sprint(name, "%s/remote", dir);
557dd7cddfSDavid du Colombier 	fd = open(name, OREAD);
567dd7cddfSDavid du Colombier 	if(fd < 0){
577dd7cddfSDavid du Colombier 		fprint(2, "can't open %s: %r\n", name);
587dd7cddfSDavid du Colombier 		exits("remote");
597dd7cddfSDavid du Colombier 	}
60*883a8c51SDavid du Colombier 	n = read(fd, buf, sizeof buf-1);
617dd7cddfSDavid du Colombier 	if(n < 0){
627dd7cddfSDavid du Colombier 		fprint(2, "can't read %s: %r\n", name);
637dd7cddfSDavid du Colombier 		exits("remote");
647dd7cddfSDavid du Colombier 	}
657dd7cddfSDavid du Colombier 	close(fd);
667dd7cddfSDavid du Colombier 	buf[n] = 0;
677dd7cddfSDavid du Colombier 	p = buf;
687dd7cddfSDavid du Colombier 	r.cmd.host = 0;
697dd7cddfSDavid du Colombier 	for(i=0; i<4; i++, p++)
707dd7cddfSDavid du Colombier 		r.cmd.host = (r.cmd.host<<8)|strtol(p, &p, 10);
717dd7cddfSDavid du Colombier 	r.cmd.port = strtol(p, 0, 10);
729a747e4fSDavid du Colombier 	fprint(2, "host=%ld.%ld.%ld.%ld, port=%lud\n",
737dd7cddfSDavid du Colombier 		(r.cmd.host>>24)&0xff, (r.cmd.host>>16)&0xff,
747dd7cddfSDavid du Colombier 		(r.cmd.host>>8)&0xff, r.cmd.host&0xff, r.cmd.port);
757dd7cddfSDavid du Colombier 	fprint(r.ctl, "disconnect");
767dd7cddfSDavid du Colombier 
777dd7cddfSDavid du Colombier 	r.cmd.xid = time(0);
787dd7cddfSDavid du Colombier 	r.cmd.mtype = CALL;
797dd7cddfSDavid du Colombier 	r.cmd.rpcvers = 2;
807dd7cddfSDavid du Colombier 	r.cmd.args = r.argbuf;
817dd7cddfSDavid du Colombier 	if(mach)
827dd7cddfSDavid du Colombier 		putauth(mach, &r.cmd.cred);
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier 	r.cmd.prog = 100000;	/* portmapper */
857dd7cddfSDavid du Colombier 	r.cmd.vers = 2;		/* vers */
867dd7cddfSDavid du Colombier 	r.cmd.proc = 3;		/* getport */
877dd7cddfSDavid du Colombier 	dataptr = r.cmd.args;
887dd7cddfSDavid du Colombier 
897dd7cddfSDavid du Colombier 	PLONG(100005);		/* mount */
907dd7cddfSDavid du Colombier 	PLONG(1);		/* vers */
917dd7cddfSDavid du Colombier 	PLONG(IPPROTO_UDP);
927dd7cddfSDavid du Colombier 	PLONG(0);
937dd7cddfSDavid du Colombier 
947dd7cddfSDavid du Colombier 	i = rpccall(&r, dataptr-(uchar*)r.cmd.args);
957dd7cddfSDavid du Colombier 	if(i != 4)
967dd7cddfSDavid du Colombier 		exits("trouble");
977dd7cddfSDavid du Colombier 	argptr = r.reply.results;
987dd7cddfSDavid du Colombier 	remport = GLONG();
997dd7cddfSDavid du Colombier 	fprint(2, "remote port = %d\n", remport);
1007dd7cddfSDavid du Colombier 
1017dd7cddfSDavid du Colombier 	r.cmd.port = remport;
1027dd7cddfSDavid du Colombier 	r.cmd.prog = 100005;	/* mount */
1037dd7cddfSDavid du Colombier 	r.cmd.vers = 1;		/* vers */
1047dd7cddfSDavid du Colombier 	r.cmd.proc = 0;		/* null */
1057dd7cddfSDavid du Colombier 	dataptr = r.cmd.args;
1067dd7cddfSDavid du Colombier 
1077dd7cddfSDavid du Colombier 	i = rpccall(&r, dataptr-(uchar*)r.cmd.args);
1087dd7cddfSDavid du Colombier 	if(i != 0)
1097dd7cddfSDavid du Colombier 		exits("trouble");
1107dd7cddfSDavid du Colombier 	fprint(2, "OK ping mount\n");
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier 	r.cmd.prog = 100005;	/* mount */
1137dd7cddfSDavid du Colombier 	r.cmd.vers = 1;		/* vers */
1147dd7cddfSDavid du Colombier 	r.cmd.proc = 5;		/* export */
1157dd7cddfSDavid du Colombier 	dataptr = r.cmd.args;
1167dd7cddfSDavid du Colombier 
1177dd7cddfSDavid du Colombier 	i = rpccall(&r, dataptr-(uchar*)r.cmd.args);
1187dd7cddfSDavid du Colombier 	fprint(2, "export: %d bytes returned\n", i);
1197dd7cddfSDavid du Colombier 	argptr = r.reply.results;
120*883a8c51SDavid du Colombier 	while (GLONG() != 0) {
1217dd7cddfSDavid du Colombier 		n = GLONG();
1227dd7cddfSDavid du Colombier 		p = GPTR(n);
12359cc4ca5SDavid du Colombier 		print("%.*s\n", utfnlen(p, n), p);
124*883a8c51SDavid du Colombier 		while (GLONG() != 0) {
1257dd7cddfSDavid du Colombier 			n = GLONG();
1267dd7cddfSDavid du Colombier 			p = GPTR(n);
12759cc4ca5SDavid du Colombier 			print("\t%.*s\n", utfnlen(p, n), p);
1287dd7cddfSDavid du Colombier 		}
1297dd7cddfSDavid du Colombier 	}
1307dd7cddfSDavid du Colombier 
1317dd7cddfSDavid du Colombier 	exits(0);
1327dd7cddfSDavid du Colombier }
1337dd7cddfSDavid du Colombier 
1347dd7cddfSDavid du Colombier void
putauth(char * mach,Auth * a)1357dd7cddfSDavid du Colombier putauth(char *mach, Auth *a)
1367dd7cddfSDavid du Colombier {
1377dd7cddfSDavid du Colombier 	uchar *dataptr;
1387dd7cddfSDavid du Colombier 	long stamp = time(0);
1397dd7cddfSDavid du Colombier 	int n = strlen(mach);
1407dd7cddfSDavid du Colombier 
1417dd7cddfSDavid du Colombier 	dataptr = realloc(a->data, 2*4+ROUNDUP(n)+4*4);
1427dd7cddfSDavid du Colombier 	a->data = dataptr;
1437dd7cddfSDavid du Colombier 	a->flavor = AUTH_UNIX;
1447dd7cddfSDavid du Colombier 	PLONG(stamp);
1457dd7cddfSDavid du Colombier 	PLONG(n);
1467dd7cddfSDavid du Colombier 	PPTR(mach, n);
1477dd7cddfSDavid du Colombier 	PLONG(0);
1487dd7cddfSDavid du Colombier 	PLONG(1);
1497dd7cddfSDavid du Colombier 	PLONG(1);
1507dd7cddfSDavid du Colombier 	PLONG(0);
1517dd7cddfSDavid du Colombier 	a->count = dataptr - (uchar*)a->data;
1527dd7cddfSDavid du Colombier }
1537dd7cddfSDavid du Colombier 
1547dd7cddfSDavid du Colombier int
rpccall(Rpcconn * r,int narg)1557dd7cddfSDavid du Colombier rpccall(Rpcconn *r, int narg)
1567dd7cddfSDavid du Colombier {
1577dd7cddfSDavid du Colombier 	int n;
1587dd7cddfSDavid du Colombier 
1597dd7cddfSDavid du Colombier 	r->cmd.xid++;
1607dd7cddfSDavid du Colombier 	n = rpcS2M(&r->cmd, narg, r->rpcbuf);
1617dd7cddfSDavid du Colombier 	if(rpcdebug)
1627dd7cddfSDavid du Colombier 		rpcprint(2, &r->cmd);
1637dd7cddfSDavid du Colombier 	if(write(r->data, r->rpcbuf, n) < 0){
1647dd7cddfSDavid du Colombier 		fprint(2, "rpc write: %r\n");
1657dd7cddfSDavid du Colombier 		exits("rpc");
1667dd7cddfSDavid du Colombier 	}
1677dd7cddfSDavid du Colombier 	n = read(r->data, r->rpcbuf, sizeof r->rpcbuf);
1687dd7cddfSDavid du Colombier 	if(n < 0){
1697dd7cddfSDavid du Colombier 		fprint(2, "rpc read: %r\n");
1707dd7cddfSDavid du Colombier 		exits("rpc");
1717dd7cddfSDavid du Colombier 	}
1727dd7cddfSDavid du Colombier 	if(rpcM2S(r->rpcbuf, &r->reply, n) != 0){
1737dd7cddfSDavid du Colombier 		fprint(2, "rpc reply format error\n");
1747dd7cddfSDavid du Colombier 		exits("rpc");
1757dd7cddfSDavid du Colombier 	}
1767dd7cddfSDavid du Colombier 	if(rpcdebug)
1777dd7cddfSDavid du Colombier 		rpcprint(2, &r->reply);
1787dd7cddfSDavid du Colombier 	if(r->reply.mtype != REPLY || r->reply.stat != MSG_ACCEPTED ||
1797dd7cddfSDavid du Colombier 	   r->reply.astat != SUCCESS){
1809a747e4fSDavid du Colombier 		fprint(2, "rpc mtype, stat, astat = %ld, %ld, %ld\n",
1817dd7cddfSDavid du Colombier 			r->reply.mtype, r->reply.stat, r->reply.astat);
1827dd7cddfSDavid du Colombier 		exits("rpc");
1837dd7cddfSDavid du Colombier 	}
1847dd7cddfSDavid du Colombier 	return n - (((uchar *)r->reply.results) - r->rpcbuf);
1857dd7cddfSDavid du Colombier }
186