xref: /plan9/sys/src/libsunrpc/portmap.c (revision 34e0422554c8e8bef66509534d2c44f4660bf678)
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <sunrpc.h>
5 
6 static void
portMapPrint(Fmt * fmt,PortMap * x)7 portMapPrint(Fmt *fmt, PortMap *x)
8 {
9 	fmtprint(fmt, "[%ud %ud %ud %ud]", x->prog, x->vers, x->prot, x->port);
10 }
11 static uint
portMapSize(PortMap * x)12 portMapSize(PortMap *x)
13 {
14 	uint a;
15 	USED(x);
16 	a = 0 + 4 + 4 + 4 + 4;
17 	return a;
18 }
19 static int
portMapPack(uchar * a,uchar * ea,uchar ** pa,PortMap * x)20 portMapPack(uchar *a, uchar *ea, uchar **pa, PortMap *x)
21 {
22 	if(sunUint32Pack(a, ea, &a, &x->prog) < 0) goto Err;
23 	if(sunUint32Pack(a, ea, &a, &x->vers) < 0) goto Err;
24 	if(sunUint32Pack(a, ea, &a, &x->prot) < 0) goto Err;
25 	if(sunUint32Pack(a, ea, &a, &x->port) < 0) goto Err;
26 	*pa = a;
27 	return 0;
28 Err:
29 	*pa = ea;
30 	return -1;
31 }
32 static int
portMapUnpack(uchar * a,uchar * ea,uchar ** pa,PortMap * x)33 portMapUnpack(uchar *a, uchar *ea, uchar **pa, PortMap *x)
34 {
35 	if(sunUint32Unpack(a, ea, &a, &x->prog) < 0) goto Err;
36 	if(sunUint32Unpack(a, ea, &a, &x->vers) < 0) goto Err;
37 	if(sunUint32Unpack(a, ea, &a, &x->prot) < 0) goto Err;
38 	if(sunUint32Unpack(a, ea, &a, &x->port) < 0) goto Err;
39 	*pa = a;
40 	return 0;
41 Err:
42 	*pa = ea;
43 	return -1;
44 }
45 static void
portTNullPrint(Fmt * fmt,PortTNull * x)46 portTNullPrint(Fmt *fmt, PortTNull *x)
47 {
48 	USED(x);
49 	fmtprint(fmt, "%s", "PortTNull");
50 }
51 static uint
portTNullSize(PortTNull * x)52 portTNullSize(PortTNull *x)
53 {
54 	uint a;
55 	USED(x);
56 	a = 0;
57 	return a;
58 }
59 static int
portTNullPack(uchar * a,uchar * ea,uchar ** pa,PortTNull * x)60 portTNullPack(uchar *a, uchar *ea, uchar **pa, PortTNull *x)
61 {
62 	USED(ea);
63 	USED(x);
64 	*pa = a;
65 	return 0;
66 }
67 static int
portTNullUnpack(uchar * a,uchar * ea,uchar ** pa,PortTNull * x)68 portTNullUnpack(uchar *a, uchar *ea, uchar **pa, PortTNull *x)
69 {
70 	USED(ea);
71 	USED(x);
72 	*pa = a;
73 	return 0;
74 }
75 static void
portRNullPrint(Fmt * fmt,PortRNull * x)76 portRNullPrint(Fmt *fmt, PortRNull *x)
77 {
78 	USED(x);
79 	fmtprint(fmt, "%s", "PortRNull");
80 }
81 static uint
portRNullSize(PortRNull * x)82 portRNullSize(PortRNull *x)
83 {
84 	uint a;
85 	USED(x);
86 	a = 0;
87 	return a;
88 }
89 static int
portRNullPack(uchar * a,uchar * ea,uchar ** pa,PortRNull * x)90 portRNullPack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
91 {
92 	USED(ea);
93 	USED(x);
94 	*pa = a;
95 	return 0;
96 }
97 static int
portRNullUnpack(uchar * a,uchar * ea,uchar ** pa,PortRNull * x)98 portRNullUnpack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
99 {
100 	USED(ea);
101 	USED(x);
102 	*pa = a;
103 	return 0;
104 }
105 static void
portTSetPrint(Fmt * fmt,PortTSet * x)106 portTSetPrint(Fmt *fmt, PortTSet *x)
107 {
108 	fmtprint(fmt, "PortTSet ");
109 	portMapPrint(fmt, &x->map);
110 }
111 static uint
portTSetSize(PortTSet * x)112 portTSetSize(PortTSet *x)
113 {
114 	uint a;
115 	USED(x);
116 	a = 0 + portMapSize(&x->map);
117 	return a;
118 }
119 static int
portTSetPack(uchar * a,uchar * ea,uchar ** pa,PortTSet * x)120 portTSetPack(uchar *a, uchar *ea, uchar **pa, PortTSet *x)
121 {
122 	if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;
123 	*pa = a;
124 	return 0;
125 Err:
126 	*pa = ea;
127 	return -1;
128 }
129 static int
portTSetUnpack(uchar * a,uchar * ea,uchar ** pa,PortTSet * x)130 portTSetUnpack(uchar *a, uchar *ea, uchar **pa, PortTSet *x)
131 {
132 	if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;
133 	*pa = a;
134 	return 0;
135 Err:
136 	*pa = ea;
137 	return -1;
138 }
139 static void
portRSetPrint(Fmt * fmt,PortRSet * x)140 portRSetPrint(Fmt *fmt, PortRSet *x)
141 {
142 	fmtprint(fmt, "PortRSet %ud", x->b);
143 }
144 static uint
portRSetSize(PortRSet * x)145 portRSetSize(PortRSet *x)
146 {
147 	uint a;
148 	USED(x);
149 	a = 0 + 4;
150 	return a;
151 }
152 static int
portRSetPack(uchar * a,uchar * ea,uchar ** pa,PortRSet * x)153 portRSetPack(uchar *a, uchar *ea, uchar **pa, PortRSet *x)
154 {
155 	if(sunUint1Pack(a, ea, &a, &x->b) < 0) goto Err;
156 	*pa = a;
157 	return 0;
158 Err:
159 	*pa = ea;
160 	return -1;
161 }
162 static int
portRSetUnpack(uchar * a,uchar * ea,uchar ** pa,PortRSet * x)163 portRSetUnpack(uchar *a, uchar *ea, uchar **pa, PortRSet *x)
164 {
165 	if(sunUint1Unpack(a, ea, &a, &x->b) < 0) goto Err;
166 	*pa = a;
167 	return 0;
168 Err:
169 	*pa = ea;
170 	return -1;
171 }
172 static void
portTUnsetPrint(Fmt * fmt,PortTUnset * x)173 portTUnsetPrint(Fmt *fmt, PortTUnset *x)
174 {
175 	fmtprint(fmt, "PortTUnset ");
176 	portMapPrint(fmt, &x->map);
177 }
178 static uint
portTUnsetSize(PortTUnset * x)179 portTUnsetSize(PortTUnset *x)
180 {
181 	uint a;
182 	USED(x);
183 	a = 0 + portMapSize(&x->map);
184 	return a;
185 }
186 static int
portTUnsetPack(uchar * a,uchar * ea,uchar ** pa,PortTUnset * x)187 portTUnsetPack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x)
188 {
189 	if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;
190 	*pa = a;
191 	return 0;
192 Err:
193 	*pa = ea;
194 	return -1;
195 }
196 static int
portTUnsetUnpack(uchar * a,uchar * ea,uchar ** pa,PortTUnset * x)197 portTUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x)
198 {
199 	if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;
200 	*pa = a;
201 	return 0;
202 Err:
203 	*pa = ea;
204 	return -1;
205 }
206 static void
portRUnsetPrint(Fmt * fmt,PortRUnset * x)207 portRUnsetPrint(Fmt *fmt, PortRUnset *x)
208 {
209 	fmtprint(fmt, "PortRUnset %ud", x->b);
210 }
211 static uint
portRUnsetSize(PortRUnset * x)212 portRUnsetSize(PortRUnset *x)
213 {
214 	uint a;
215 	USED(x);
216 	a = 0 + 4;
217 	return a;
218 }
219 static int
portRUnsetPack(uchar * a,uchar * ea,uchar ** pa,PortRUnset * x)220 portRUnsetPack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x)
221 {
222 	if(sunUint1Pack(a, ea, &a, &x->b) < 0) goto Err;
223 	*pa = a;
224 	return 0;
225 Err:
226 	*pa = ea;
227 	return -1;
228 }
229 static int
portRUnsetUnpack(uchar * a,uchar * ea,uchar ** pa,PortRUnset * x)230 portRUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x)
231 {
232 	if(sunUint1Unpack(a, ea, &a, &x->b) < 0) goto Err;
233 	*pa = a;
234 	return 0;
235 Err:
236 	*pa = ea;
237 	return -1;
238 }
239 static void
portTGetportPrint(Fmt * fmt,PortTGetport * x)240 portTGetportPrint(Fmt *fmt, PortTGetport *x)
241 {
242 	fmtprint(fmt, "PortTGetport ");
243 	portMapPrint(fmt, &x->map);
244 }
245 static uint
portTGetportSize(PortTGetport * x)246 portTGetportSize(PortTGetport *x)
247 {
248 	uint a;
249 	USED(x);
250 	a = 0 + portMapSize(&x->map);
251 	return a;
252 }
253 static int
portTGetportPack(uchar * a,uchar * ea,uchar ** pa,PortTGetport * x)254 portTGetportPack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x)
255 {
256 	if(portMapPack(a, ea, &a, &x->map) < 0) goto Err;
257 	*pa = a;
258 	return 0;
259 Err:
260 	*pa = ea;
261 	return -1;
262 }
263 static int
portTGetportUnpack(uchar * a,uchar * ea,uchar ** pa,PortTGetport * x)264 portTGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x)
265 {
266 	if(portMapUnpack(a, ea, &a, &x->map) < 0) goto Err;
267 	*pa = a;
268 	return 0;
269 Err:
270 	*pa = ea;
271 	return -1;
272 }
273 static void
portRGetportPrint(Fmt * fmt,PortRGetport * x)274 portRGetportPrint(Fmt *fmt, PortRGetport *x)
275 {
276 	fmtprint(fmt, "PortRGetport %ud", x->port);
277 }
278 static uint
portRGetportSize(PortRGetport * x)279 portRGetportSize(PortRGetport *x)
280 {
281 	uint a;
282 	USED(x);
283 	a = 0 + 4;
284 	return a;
285 }
286 static int
portRGetportPack(uchar * a,uchar * ea,uchar ** pa,PortRGetport * x)287 portRGetportPack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x)
288 {
289 	if(sunUint32Pack(a, ea, &a, &x->port) < 0) goto Err;
290 	*pa = a;
291 	return 0;
292 Err:
293 	*pa = ea;
294 	return -1;
295 }
296 static int
portRGetportUnpack(uchar * a,uchar * ea,uchar ** pa,PortRGetport * x)297 portRGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x)
298 {
299 	if(sunUint32Unpack(a, ea, &a, &x->port) < 0) goto Err;
300 	*pa = a;
301 	return 0;
302 Err:
303 	*pa = ea;
304 	return -1;
305 }
306 static void
portTDumpPrint(Fmt * fmt,PortTDump * x)307 portTDumpPrint(Fmt *fmt, PortTDump *x)
308 {
309 	USED(x);
310 	fmtprint(fmt, "PortTDump");
311 }
312 static uint
portTDumpSize(PortTDump * x)313 portTDumpSize(PortTDump *x)
314 {
315 	uint a;
316 	USED(x);
317 	a = 0;
318 	return a;
319 }
320 static int
portTDumpPack(uchar * a,uchar * ea,uchar ** pa,PortTDump * x)321 portTDumpPack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
322 {
323 	USED(ea);
324 	USED(x);
325 	*pa = a;
326 	return 0;
327 }
328 static int
portTDumpUnpack(uchar * a,uchar * ea,uchar ** pa,PortTDump * x)329 portTDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
330 {
331 	USED(ea);
332 	USED(x);
333 	*pa = a;
334 	return 0;
335 }
336 static void
portRDumpPrint(Fmt * fmt,PortRDump * x)337 portRDumpPrint(Fmt *fmt, PortRDump *x)
338 {
339 	int i;
340 
341 	fmtprint(fmt, "PortRDump");
342 	for(i=0; i<x->nmap; i++){
343 		fmtprint(fmt, " ");
344 		portMapPrint(fmt, &x->map[i]);
345 	}
346 }
347 static uint
portRDumpSize(PortRDump * x)348 portRDumpSize(PortRDump *x)
349 {
350 	return (5*4*x->nmap) + 4;
351 }
352 static int
portRDumpPack(uchar * a,uchar * ea,uchar ** pa,PortRDump * x)353 portRDumpPack(uchar *a, uchar *ea, uchar **pa, PortRDump *x)
354 {
355 	int i;
356 	u32int zero, one;
357 
358 	zero = 0;
359 	one = 1;
360 	for(i=0; i<x->nmap; i++){
361 		if(sunUint32Pack(a, ea, &a, &one) < 0
362 		|| portMapPack(a, ea, &a, &x->map[i]) < 0)
363 			goto Err;
364 	}
365 	if(sunUint32Pack(a, ea, &a, &zero) < 0)
366 		goto Err;
367 	*pa = a;
368 	return 0;
369 Err:
370 	*pa = ea;
371 	return -1;
372 }
373 static int
portRDumpUnpack(uchar * a,uchar * ea,uchar ** pa,PortRDump * x)374 portRDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortRDump *x)
375 {
376 	int i;
377 	u1int u1;
378 	PortMap *m;
379 
380 	m = (PortMap*)a;
381 	for(i=0;; i++){
382 		if(sunUint1Unpack(a, ea, &a, &u1) < 0)
383 			goto Err;
384 		if(u1 == 0)
385 			break;
386 		if(portMapUnpack(a, ea, &a, &m[i]) < 0)
387 			goto Err;
388 	}
389 	x->nmap = i;
390 	x->map = m;
391 	*pa = a;
392 	return 0;
393 
394 Err:
395 	*pa = ea;
396 	return -1;
397 }
398 static void
portTCallitPrint(Fmt * fmt,PortTCallit * x)399 portTCallitPrint(Fmt *fmt, PortTCallit *x)
400 {
401 	fmtprint(fmt, "PortTCallit [%ud,%ud,%ud] %ud", x->prog, x->vers, x->proc, x->count);
402 }
403 static uint
portTCallitSize(PortTCallit * x)404 portTCallitSize(PortTCallit *x)
405 {
406 	uint a;
407 	USED(x);
408 	a = 0 + 4 + 4 + 4 + sunVarOpaqueSize(x->count);
409 	return a;
410 }
411 static int
portTCallitPack(uchar * a,uchar * ea,uchar ** pa,PortTCallit * x)412 portTCallitPack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x)
413 {
414 	if(sunUint32Pack(a, ea, &a, &x->prog) < 0) goto Err;
415 	if(sunUint32Pack(a, ea, &a, &x->vers) < 0) goto Err;
416 	if(sunUint32Pack(a, ea, &a, &x->proc) < 0) goto Err;
417 	if(sunVarOpaquePack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
418 	*pa = a;
419 	return 0;
420 Err:
421 	*pa = ea;
422 	return -1;
423 }
424 static int
portTCallitUnpack(uchar * a,uchar * ea,uchar ** pa,PortTCallit * x)425 portTCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x)
426 {
427 	if(sunUint32Unpack(a, ea, &a, &x->prog) < 0) goto Err;
428 	if(sunUint32Unpack(a, ea, &a, &x->vers) < 0) goto Err;
429 	if(sunUint32Unpack(a, ea, &a, &x->proc) < 0) goto Err;
430 	if(sunVarOpaqueUnpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
431 	*pa = a;
432 	return 0;
433 Err:
434 	*pa = ea;
435 	return -1;
436 }
437 static void
portRCallitPrint(Fmt * fmt,PortRCallit * x)438 portRCallitPrint(Fmt *fmt, PortRCallit *x)
439 {
440 	fmtprint(fmt, "PortRCallit %ud %ud", x->port, x->count);
441 }
442 static uint
portRCallitSize(PortRCallit * x)443 portRCallitSize(PortRCallit *x)
444 {
445 	uint a;
446 	USED(x);
447 	a = 0 + 4 + sunVarOpaqueSize(x->count);
448 	return a;
449 }
450 static int
portRCallitPack(uchar * a,uchar * ea,uchar ** pa,PortRCallit * x)451 portRCallitPack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x)
452 {
453 	if(sunUint32Pack(a, ea, &a, &x->port) < 0) goto Err;
454 	if(sunVarOpaquePack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
455 	*pa = a;
456 	return 0;
457 Err:
458 	*pa = ea;
459 	return -1;
460 }
461 static int
portRCallitUnpack(uchar * a,uchar * ea,uchar ** pa,PortRCallit * x)462 portRCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x)
463 {
464 	if(sunUint32Unpack(a, ea, &a, &x->port) < 0) goto Err;
465 	if(sunVarOpaqueUnpack(a, ea, &a, &x->data, &x->count, -1) < 0) goto Err;
466 	*pa = a;
467 	return 0;
468 Err:
469 	*pa = ea;
470 	return -1;
471 }
472 
473 typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);
474 typedef void (*F)(Fmt*, SunCall*);
475 typedef uint (*S)(SunCall*);
476 
477 static SunProc proc[] = {
478 	(P)portTNullPack, (P)portTNullUnpack, (S)portTNullSize, (F)portTNullPrint, sizeof(PortTNull),
479 	(P)portRNullPack, (P)portRNullUnpack, (S)portRNullSize, (F)portRNullPrint, sizeof(PortRNull),
480 	(P)portTSetPack, (P)portTSetUnpack, (S)portTSetSize, (F)portTSetPrint, sizeof(PortTSet),
481 	(P)portRSetPack, (P)portRSetUnpack, (S)portRSetSize, (F)portRSetPrint, sizeof(PortRSet),
482 	(P)portTUnsetPack, (P)portTUnsetUnpack, (S)portTUnsetSize, (F)portTUnsetPrint, sizeof(PortTUnset),
483 	(P)portRUnsetPack, (P)portRUnsetUnpack, (S)portRUnsetSize, (F)portRUnsetPrint, sizeof(PortRUnset),
484 	(P)portTGetportPack, (P)portTGetportUnpack, (S)portTGetportSize, (F)portTGetportPrint, sizeof(PortTGetport),
485 	(P)portRGetportPack, (P)portRGetportUnpack, (S)portRGetportSize, (F)portRGetportPrint, sizeof(PortRGetport),
486 	(P)portTDumpPack, (P)portTDumpUnpack, (S)portTDumpSize, (F)portTDumpPrint, sizeof(PortTDump),
487 	(P)portRDumpPack, (P)portRDumpUnpack, (S)portRDumpSize, (F)portRDumpPrint, sizeof(PortRDump),
488 	(P)portTCallitPack, (P)portTCallitUnpack, (S)portTCallitSize, (F)portTCallitPrint, sizeof(PortTCallit),
489 	(P)portRCallitPack, (P)portRCallitUnpack, (S)portRCallitSize, (F)portRCallitPrint, sizeof(PortRCallit),
490 };
491 
492 SunProg portProg =
493 {
494 	PortProgram,
495 	PortVersion,
496 	proc,
497 	nelem(proc),
498 };
499