Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <sunrpc.h>
6 static void
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
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
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
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
46 portTNullPrint(Fmt *fmt, PortTNull *x)
47 {
48 USED(x);
49 fmtprint(fmt, "%s", "PortTNull");
50 }
51 static uint
52 portTNullSize(PortTNull *x)
53 {
54 uint a;
55 USED(x);
56 a = 0;
57 return a;
58 }
59 static int
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
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
76 portRNullPrint(Fmt *fmt, PortRNull *x)
77 {
78 USED(x);
79 fmtprint(fmt, "%s", "PortRNull");
80 }
81 static uint
82 portRNullSize(PortRNull *x)
83 {
84 uint a;
85 USED(x);
86 a = 0;
87 return a;
88 }
89 static int
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
98 portRNullUnpack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
99 {
100 USED(ea);
101 USED(x);
102 *pa = a;
103 return 0;
105 static void
106 portTSetPrint(Fmt *fmt, PortTSet *x)
108 fmtprint(fmt, "PortTSet ");
109 portMapPrint(fmt, &x->map);
111 static uint
112 portTSetSize(PortTSet *x)
114 uint a;
115 USED(x);
116 a = 0 + portMapSize(&x->map);
117 return a;
119 static int
120 portTSetPack(uchar *a, uchar *ea, uchar **pa, PortTSet *x)
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;
129 static int
130 portTSetUnpack(uchar *a, uchar *ea, uchar **pa, PortTSet *x)
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;
139 static void
140 portRSetPrint(Fmt *fmt, PortRSet *x)
142 fmtprint(fmt, "PortRSet %ud", x->b);
144 static uint
145 portRSetSize(PortRSet *x)
147 uint a;
148 USED(x);
149 a = 0 + 4;
150 return a;
152 static int
153 portRSetPack(uchar *a, uchar *ea, uchar **pa, PortRSet *x)
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;
162 static int
163 portRSetUnpack(uchar *a, uchar *ea, uchar **pa, PortRSet *x)
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;
172 static void
173 portTUnsetPrint(Fmt *fmt, PortTUnset *x)
175 fmtprint(fmt, "PortTUnset ");
176 portMapPrint(fmt, &x->map);
178 static uint
179 portTUnsetSize(PortTUnset *x)
181 uint a;
182 USED(x);
183 a = 0 + portMapSize(&x->map);
184 return a;
186 static int
187 portTUnsetPack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x)
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;
196 static int
197 portTUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortTUnset *x)
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;
206 static void
207 portRUnsetPrint(Fmt *fmt, PortRUnset *x)
209 fmtprint(fmt, "PortRUnset %ud", x->b);
211 static uint
212 portRUnsetSize(PortRUnset *x)
214 uint a;
215 USED(x);
216 a = 0 + 4;
217 return a;
219 static int
220 portRUnsetPack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x)
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;
229 static int
230 portRUnsetUnpack(uchar *a, uchar *ea, uchar **pa, PortRUnset *x)
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;
239 static void
240 portTGetportPrint(Fmt *fmt, PortTGetport *x)
242 fmtprint(fmt, "PortTGetport ");
243 portMapPrint(fmt, &x->map);
245 static uint
246 portTGetportSize(PortTGetport *x)
248 uint a;
249 USED(x);
250 a = 0 + portMapSize(&x->map);
251 return a;
253 static int
254 portTGetportPack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x)
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;
263 static int
264 portTGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortTGetport *x)
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;
273 static void
274 portRGetportPrint(Fmt *fmt, PortRGetport *x)
276 fmtprint(fmt, "PortRGetport %ud", x->port);
278 static uint
279 portRGetportSize(PortRGetport *x)
281 uint a;
282 USED(x);
283 a = 0 + 4;
284 return a;
286 static int
287 portRGetportPack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x)
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;
296 static int
297 portRGetportUnpack(uchar *a, uchar *ea, uchar **pa, PortRGetport *x)
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;
306 static void
307 portTDumpPrint(Fmt *fmt, PortTDump *x)
309 USED(x);
310 fmtprint(fmt, "PortTDump");
312 static uint
313 portTDumpSize(PortTDump *x)
315 uint a;
316 USED(x);
317 a = 0;
318 return a;
320 static int
321 portTDumpPack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
323 USED(ea);
324 USED(x);
325 *pa = a;
326 return 0;
328 static int
329 portTDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
331 USED(ea);
332 USED(x);
333 *pa = a;
334 return 0;
336 static void
337 portRDumpPrint(Fmt *fmt, PortRDump *x)
339 int i;
341 fmtprint(fmt, "PortRDump");
342 for(i=0; i<x->nmap; i++){
343 fmtprint(fmt, " ");
344 portMapPrint(fmt, &x->map[i]);
347 static uint
348 portRDumpSize(PortRDump *x)
350 return (5*4*x->nmap) + 4;
352 static int
353 portRDumpPack(uchar *a, uchar *ea, uchar **pa, PortRDump *x)
355 int i;
356 u32int zero, one;
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;
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;
373 static int
374 portRDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortRDump *x)
376 int i;
377 u1int u1;
378 PortMap *m;
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;
389 x->nmap = i;
390 x->map = m;
391 *pa = a;
392 return 0;
394 Err:
395 *pa = ea;
396 return -1;
398 static void
399 portTCallitPrint(Fmt *fmt, PortTCallit *x)
401 fmtprint(fmt, "PortTCallit [%ud,%ud,%ud] %ud", x->prog, x->vers, x->proc, x->count);
403 static uint
404 portTCallitSize(PortTCallit *x)
406 uint a;
407 USED(x);
408 a = 0 + 4 + 4 + 4 + sunvaropaquesize(x->count);
409 return a;
411 static int
412 portTCallitPack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x)
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;
424 static int
425 portTCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortTCallit *x)
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;
437 static void
438 portRCallitPrint(Fmt *fmt, PortRCallit *x)
440 fmtprint(fmt, "PortRCallit %ud %ud", x->port, x->count);
442 static uint
443 portRCallitSize(PortRCallit *x)
445 uint a;
446 USED(x);
447 a = 0 + 4 + sunvaropaquesize(x->count);
448 return a;
450 static int
451 portRCallitPack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x)
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;
461 static int
462 portRCallitUnpack(uchar *a, uchar *ea, uchar **pa, PortRCallit *x)
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;
473 typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);
474 typedef void (*F)(Fmt*, SunCall*);
475 typedef uint (*S)(SunCall*);
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 };
492 SunProg portprog =
494 PortProgram,
495 PortVersion,
496 proc,
497 nelem(proc),
498 };