]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/9nfs/portmapper.c
Import sources from 2011-03-30 iso image - lib
[plan9front.git] / sys / src / cmd / 9nfs / portmapper.c
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
50 main(int argc, char *argv[])
51 {
52         server(argc, argv, myport, progmap);
53 }
54
55 static
56 void
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
69 pmapnull(int n, Rpccall *cmd, Rpccall *reply)
70 {
71         USED(n, cmd, reply);
72         return 0;
73 }
74
75 static int
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
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
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
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
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 }