xref: /plan9/sys/src/cmd/9nfs/portmapper.c (revision 883a8c51bed350ea85a0220461d31e311550db04)
1*883a8c51SDavid du Colombier /*
2*883a8c51SDavid du Colombier  * sunrpc portmapper
3*883a8c51SDavid du Colombier  */
49a747e4fSDavid du Colombier #include "all.h"
59a747e4fSDavid du Colombier 
69a747e4fSDavid du Colombier typedef struct Portmap	Portmap;
79a747e4fSDavid du Colombier struct Portmap
89a747e4fSDavid du Colombier {
99a747e4fSDavid du Colombier 	int	prog;
109a747e4fSDavid du Colombier 	int	vers;
119a747e4fSDavid du Colombier 	int	protocol;
129a747e4fSDavid du Colombier 	int	port;
139a747e4fSDavid du Colombier };
149a747e4fSDavid du Colombier 
159a747e4fSDavid du Colombier Portmap map[] = {
16*883a8c51SDavid du Colombier 	100003, 2, IPPROTO_UDP, 2049,	/* nfs v2 */
17*883a8c51SDavid du Colombier //	100003, 3, IPPROTO_UDP, 2049,	/* nfs v3 */
186ab4d0ffSDavid du Colombier 	100005, 1, IPPROTO_UDP, 2049,	/* mount */
199a747e4fSDavid du Colombier 	150001, 2, IPPROTO_UDP, 1111,	/* pcnfsd v2 */
209a747e4fSDavid du Colombier 	150001, 1, IPPROTO_UDP, 1111,	/* pcnfsd v1 */
219a747e4fSDavid du Colombier 	0, 0, 0, 0,
229a747e4fSDavid du Colombier };
239a747e4fSDavid du Colombier 
249a747e4fSDavid du Colombier static void	pmapinit(int, char**);
259a747e4fSDavid du Colombier static int	pmapnull(int, Rpccall*, Rpccall*);
269a747e4fSDavid du Colombier static int	pmapset(int, Rpccall*, Rpccall*);
279a747e4fSDavid du Colombier static int	pmapunset(int, Rpccall*, Rpccall*);
289a747e4fSDavid du Colombier static int	pmapgetport(int, Rpccall*, Rpccall*);
299a747e4fSDavid du Colombier static int	pmapdump(int, Rpccall*, Rpccall*);
309a747e4fSDavid du Colombier static int	pmapcallit(int, Rpccall*, Rpccall*);
319a747e4fSDavid du Colombier 
329a747e4fSDavid du Colombier static Procmap pmapproc[] = {
339a747e4fSDavid du Colombier 	0, pmapnull,
349a747e4fSDavid du Colombier 	1, pmapset,
359a747e4fSDavid du Colombier 	2, pmapunset,
369a747e4fSDavid du Colombier 	3, pmapgetport,
379a747e4fSDavid du Colombier 	4, pmapdump,
389a747e4fSDavid du Colombier 	5, pmapcallit,
399a747e4fSDavid du Colombier 	0, 0
409a747e4fSDavid du Colombier };
419a747e4fSDavid du Colombier 
429a747e4fSDavid du Colombier int	myport = 111;
439a747e4fSDavid du Colombier 
449a747e4fSDavid du Colombier Progmap progmap[] = {
459a747e4fSDavid du Colombier 	100000, 2, pmapinit, pmapproc,
469a747e4fSDavid du Colombier 	0, 0, 0,
479a747e4fSDavid du Colombier };
489a747e4fSDavid du Colombier 
499a747e4fSDavid du Colombier void
main(int argc,char * argv[])509a747e4fSDavid du Colombier main(int argc, char *argv[])
519a747e4fSDavid du Colombier {
529a747e4fSDavid du Colombier 	server(argc, argv, myport, progmap);
539a747e4fSDavid du Colombier }
549a747e4fSDavid du Colombier 
559a747e4fSDavid du Colombier static
569a747e4fSDavid du Colombier void
pmapinit(int argc,char ** argv)579a747e4fSDavid du Colombier pmapinit(int argc, char **argv)
589a747e4fSDavid du Colombier {
59363b328dSDavid du Colombier 	ARGBEGIN{
60363b328dSDavid du Colombier 	default:
61363b328dSDavid du Colombier 		if(argopt(ARGC()) < 0)
62363b328dSDavid du Colombier 			sysfatal("usage: %s %s", argv0, commonopts);
63363b328dSDavid du Colombier 		break;
64363b328dSDavid du Colombier 	}ARGEND;
659a747e4fSDavid du Colombier 	clog("portmapper init\n");
669a747e4fSDavid du Colombier }
679a747e4fSDavid du Colombier 
689a747e4fSDavid du Colombier static int
pmapnull(int n,Rpccall * cmd,Rpccall * reply)699a747e4fSDavid du Colombier pmapnull(int n, Rpccall *cmd, Rpccall *reply)
709a747e4fSDavid du Colombier {
719a747e4fSDavid du Colombier 	USED(n, cmd, reply);
729a747e4fSDavid du Colombier 	return 0;
739a747e4fSDavid du Colombier }
749a747e4fSDavid du Colombier 
759a747e4fSDavid du Colombier static int
pmapset(int n,Rpccall * cmd,Rpccall * reply)769a747e4fSDavid du Colombier pmapset(int n, Rpccall *cmd, Rpccall *reply)
779a747e4fSDavid du Colombier {
789a747e4fSDavid du Colombier 	uchar *dataptr = reply->results;
799a747e4fSDavid du Colombier 
809a747e4fSDavid du Colombier 	if(n != 16)
819a747e4fSDavid du Colombier 		return garbage(reply, "bad count");
829a747e4fSDavid du Colombier 	USED(cmd);
839a747e4fSDavid du Colombier 	PLONG(FALSE);
849a747e4fSDavid du Colombier 	return dataptr - (uchar *)reply->results;
859a747e4fSDavid du Colombier }
869a747e4fSDavid du Colombier 
879a747e4fSDavid du Colombier static int
pmapunset(int n,Rpccall * cmd,Rpccall * reply)889a747e4fSDavid du Colombier pmapunset(int n, Rpccall *cmd, Rpccall *reply)
899a747e4fSDavid du Colombier {
909a747e4fSDavid du Colombier 	uchar *dataptr = reply->results;
919a747e4fSDavid du Colombier 
929a747e4fSDavid du Colombier 	if(n != 16)
939a747e4fSDavid du Colombier 		return garbage(reply, "bad count");
949a747e4fSDavid du Colombier 	USED(cmd);
959a747e4fSDavid du Colombier 	PLONG(TRUE);
969a747e4fSDavid du Colombier 	return dataptr - (uchar *)reply->results;
979a747e4fSDavid du Colombier }
989a747e4fSDavid du Colombier 
999a747e4fSDavid du Colombier static int
pmapgetport(int n,Rpccall * cmd,Rpccall * reply)1009a747e4fSDavid du Colombier pmapgetport(int n, Rpccall *cmd, Rpccall *reply)
1019a747e4fSDavid du Colombier {
1029a747e4fSDavid du Colombier 	int prog, vers, prot;
1039a747e4fSDavid du Colombier 	uchar *argptr = cmd->args;
1049a747e4fSDavid du Colombier 	uchar *dataptr = reply->results;
1059a747e4fSDavid du Colombier 	Portmap *mp;
1069a747e4fSDavid du Colombier 
1076ab4d0ffSDavid du Colombier 	clog("get port\n");
1089a747e4fSDavid du Colombier 
1099a747e4fSDavid du Colombier 	if(n != 16)
1109a747e4fSDavid du Colombier 		return garbage(reply, "bad count");
1119a747e4fSDavid du Colombier 	prog = GLONG();
1129a747e4fSDavid du Colombier 	vers = GLONG();
1139a747e4fSDavid du Colombier 	prot = GLONG();
1149a747e4fSDavid du Colombier 	chat("host=%I, port=%ld: ", cmd->host, cmd->port);
1159a747e4fSDavid du Colombier 	chat("getport: %d, %d, %d...", prog, vers, prot);
1169a747e4fSDavid du Colombier 	for(mp=map; mp->prog>0; mp++)
1179a747e4fSDavid du Colombier 		if(prog == mp->prog && vers == mp->vers &&
1189a747e4fSDavid du Colombier 		   prot == mp->protocol)
1199a747e4fSDavid du Colombier 			break;
1209a747e4fSDavid du Colombier 	chat("%d\n", mp->port);
1219a747e4fSDavid du Colombier 	PLONG(mp->port);
1229a747e4fSDavid du Colombier 	return dataptr - (uchar *)reply->results;
1239a747e4fSDavid du Colombier }
1249a747e4fSDavid du Colombier 
1259a747e4fSDavid du Colombier static int
pmapdump(int n,Rpccall * cmd,Rpccall * reply)1269a747e4fSDavid du Colombier pmapdump(int n, Rpccall *cmd, Rpccall *reply)
1279a747e4fSDavid du Colombier {
1289a747e4fSDavid du Colombier 	uchar *dataptr = reply->results;
1299a747e4fSDavid du Colombier 	Portmap *mp;
1309a747e4fSDavid du Colombier 
1319a747e4fSDavid du Colombier 	if(n != 0)
1329a747e4fSDavid du Colombier 		return garbage(reply, "bad count");
1339a747e4fSDavid du Colombier 	USED(cmd);
1349a747e4fSDavid du Colombier 	for(mp=map; mp->prog>0; mp++){
1359a747e4fSDavid du Colombier 		PLONG(1);
1369a747e4fSDavid du Colombier 		PLONG(mp->prog);
1379a747e4fSDavid du Colombier 		PLONG(mp->vers);
1389a747e4fSDavid du Colombier 		PLONG(mp->protocol);
1399a747e4fSDavid du Colombier 		PLONG(mp->port);
1409a747e4fSDavid du Colombier 	}
1419a747e4fSDavid du Colombier 	PLONG(0);
1429a747e4fSDavid du Colombier 	return dataptr - (uchar *)reply->results;
1439a747e4fSDavid du Colombier }
1449a747e4fSDavid du Colombier 
1459a747e4fSDavid du Colombier static int
pmapcallit(int n,Rpccall * cmd,Rpccall * reply)1469a747e4fSDavid du Colombier pmapcallit(int n, Rpccall *cmd, Rpccall *reply)
1479a747e4fSDavid du Colombier {
1489a747e4fSDavid du Colombier 	int prog, vers, proc;
1499a747e4fSDavid du Colombier 	uchar *argptr = cmd->args;
1509a747e4fSDavid du Colombier 	uchar *dataptr = reply->results;
1519a747e4fSDavid du Colombier 	Portmap *mp;
1529a747e4fSDavid du Colombier 
1539a747e4fSDavid du Colombier 	if(n < 12)
1549a747e4fSDavid du Colombier 		return garbage(reply, "bad count");
1559a747e4fSDavid du Colombier 	prog = GLONG();
1569a747e4fSDavid du Colombier 	vers = GLONG();
1579a747e4fSDavid du Colombier 	proc = GLONG();
1589a747e4fSDavid du Colombier 	chat("host=%I, port=%ld: ", cmd->host, cmd->port);
1599a747e4fSDavid du Colombier 	chat("callit: %d, %d, %d...", prog, vers, proc);
1609a747e4fSDavid du Colombier 	for(mp=map; mp->prog>0; mp++)
1619a747e4fSDavid du Colombier 		if(prog == mp->prog && vers == mp->vers &&
1629a747e4fSDavid du Colombier 		   proc == 0)
1639a747e4fSDavid du Colombier 			break;
1649a747e4fSDavid du Colombier 	if(mp->port == 0){
1659a747e4fSDavid du Colombier 		chat("ignored\n");
1669a747e4fSDavid du Colombier 		return -1;
1679a747e4fSDavid du Colombier 	}
1689a747e4fSDavid du Colombier 	chat("%d\n", mp->port);
1699a747e4fSDavid du Colombier 	PLONG(mp->port);
1709a747e4fSDavid du Colombier 	PLONG(0);
1719a747e4fSDavid du Colombier 	return dataptr - (uchar *)reply->results;
1729a747e4fSDavid du Colombier }
173