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