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