xref: /plan9/sys/src/cmd/9nfs/portmapper.c (revision 883a8c51bed350ea85a0220461d31e311550db04)
1 /*
2  * sunrpc portmapper
3  */
4 #include "all.h"
5 
6 typedef struct Portmap	Portmap;
7 struct Portmap
8 {
9 	int	prog;
10 	int	vers;
11 	int	protocol;
12 	int	port;
13 };
14 
15 Portmap map[] = {
16 	100003, 2, IPPROTO_UDP, 2049,	/* nfs v2 */
17 //	100003, 3, IPPROTO_UDP, 2049,	/* nfs v3 */
18 	100005, 1, IPPROTO_UDP, 2049,	/* mount */
19 	150001, 2, IPPROTO_UDP, 1111,	/* pcnfsd v2 */
20 	150001, 1, IPPROTO_UDP, 1111,	/* pcnfsd v1 */
21 	0, 0, 0, 0,
22 };
23 
24 static void	pmapinit(int, char**);
25 static int	pmapnull(int, Rpccall*, Rpccall*);
26 static int	pmapset(int, Rpccall*, Rpccall*);
27 static int	pmapunset(int, Rpccall*, Rpccall*);
28 static int	pmapgetport(int, Rpccall*, Rpccall*);
29 static int	pmapdump(int, Rpccall*, Rpccall*);
30 static int	pmapcallit(int, Rpccall*, Rpccall*);
31 
32 static Procmap pmapproc[] = {
33 	0, pmapnull,
34 	1, pmapset,
35 	2, pmapunset,
36 	3, pmapgetport,
37 	4, pmapdump,
38 	5, pmapcallit,
39 	0, 0
40 };
41 
42 int	myport = 111;
43 
44 Progmap progmap[] = {
45 	100000, 2, pmapinit, pmapproc,
46 	0, 0, 0,
47 };
48 
49 void
main(int argc,char * argv[])50 main(int argc, char *argv[])
51 {
52 	server(argc, argv, myport, progmap);
53 }
54 
55 static
56 void
pmapinit(int argc,char ** argv)57 pmapinit(int argc, char **argv)
58 {
59 	ARGBEGIN{
60 	default:
61 		if(argopt(ARGC()) < 0)
62 			sysfatal("usage: %s %s", argv0, commonopts);
63 		break;
64 	}ARGEND;
65 	clog("portmapper init\n");
66 }
67 
68 static int
pmapnull(int n,Rpccall * cmd,Rpccall * reply)69 pmapnull(int n, Rpccall *cmd, Rpccall *reply)
70 {
71 	USED(n, cmd, reply);
72 	return 0;
73 }
74 
75 static int
pmapset(int n,Rpccall * cmd,Rpccall * reply)76 pmapset(int n, Rpccall *cmd, Rpccall *reply)
77 {
78 	uchar *dataptr = reply->results;
79 
80 	if(n != 16)
81 		return garbage(reply, "bad count");
82 	USED(cmd);
83 	PLONG(FALSE);
84 	return dataptr - (uchar *)reply->results;
85 }
86 
87 static int
pmapunset(int n,Rpccall * cmd,Rpccall * reply)88 pmapunset(int n, Rpccall *cmd, Rpccall *reply)
89 {
90 	uchar *dataptr = reply->results;
91 
92 	if(n != 16)
93 		return garbage(reply, "bad count");
94 	USED(cmd);
95 	PLONG(TRUE);
96 	return dataptr - (uchar *)reply->results;
97 }
98 
99 static int
pmapgetport(int n,Rpccall * cmd,Rpccall * reply)100 pmapgetport(int n, Rpccall *cmd, Rpccall *reply)
101 {
102 	int prog, vers, prot;
103 	uchar *argptr = cmd->args;
104 	uchar *dataptr = reply->results;
105 	Portmap *mp;
106 
107 	clog("get port\n");
108 
109 	if(n != 16)
110 		return garbage(reply, "bad count");
111 	prog = GLONG();
112 	vers = GLONG();
113 	prot = GLONG();
114 	chat("host=%I, port=%ld: ", cmd->host, cmd->port);
115 	chat("getport: %d, %d, %d...", prog, vers, prot);
116 	for(mp=map; mp->prog>0; mp++)
117 		if(prog == mp->prog && vers == mp->vers &&
118 		   prot == mp->protocol)
119 			break;
120 	chat("%d\n", mp->port);
121 	PLONG(mp->port);
122 	return dataptr - (uchar *)reply->results;
123 }
124 
125 static int
pmapdump(int n,Rpccall * cmd,Rpccall * reply)126 pmapdump(int n, Rpccall *cmd, Rpccall *reply)
127 {
128 	uchar *dataptr = reply->results;
129 	Portmap *mp;
130 
131 	if(n != 0)
132 		return garbage(reply, "bad count");
133 	USED(cmd);
134 	for(mp=map; mp->prog>0; mp++){
135 		PLONG(1);
136 		PLONG(mp->prog);
137 		PLONG(mp->vers);
138 		PLONG(mp->protocol);
139 		PLONG(mp->port);
140 	}
141 	PLONG(0);
142 	return dataptr - (uchar *)reply->results;
143 }
144 
145 static int
pmapcallit(int n,Rpccall * cmd,Rpccall * reply)146 pmapcallit(int n, Rpccall *cmd, Rpccall *reply)
147 {
148 	int prog, vers, proc;
149 	uchar *argptr = cmd->args;
150 	uchar *dataptr = reply->results;
151 	Portmap *mp;
152 
153 	if(n < 12)
154 		return garbage(reply, "bad count");
155 	prog = GLONG();
156 	vers = GLONG();
157 	proc = GLONG();
158 	chat("host=%I, port=%ld: ", cmd->host, cmd->port);
159 	chat("callit: %d, %d, %d...", prog, vers, proc);
160 	for(mp=map; mp->prog>0; mp++)
161 		if(prog == mp->prog && vers == mp->vers &&
162 		   proc == 0)
163 			break;
164 	if(mp->port == 0){
165 		chat("ignored\n");
166 		return -1;
167 	}
168 	chat("%d\n", mp->port);
169 	PLONG(mp->port);
170 	PLONG(0);
171 	return dataptr - (uchar *)reply->results;
172 }
173