blob: 4a3069dd45fb2783f8ecf4541c40985b9a690a53 [file] [log] [blame]
rsc551445b2004-04-21 03:04:30 +00001#include <u.h>
2#include <libc.h>
3#include <thread.h>
4#include <sunrpc.h>
5
6static void
7portMapPrint(Fmt *fmt, PortMap *x)
8{
9 fmtprint(fmt, "[%ud %ud %ud %ud]", x->prog, x->vers, x->prot, x->port);
10}
11static uint
12portMapSize(PortMap *x)
13{
14 uint a;
15 USED(x);
16 a = 0 + 4 + 4 + 4 + 4;
17 return a;
18}
19static int
20portMapPack(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;
28Err:
29 *pa = ea;
30 return -1;
31}
32static int
33portMapUnpack(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;
41Err:
42 *pa = ea;
43 return -1;
44}
45static void
46portTNullPrint(Fmt *fmt, PortTNull *x)
47{
48 USED(x);
49 fmtprint(fmt, "%s", "PortTNull");
50}
51static uint
52portTNullSize(PortTNull *x)
53{
54 uint a;
55 USED(x);
56 a = 0;
57 return a;
58}
59static int
60portTNullPack(uchar *a, uchar *ea, uchar **pa, PortTNull *x)
61{
62 USED(ea);
63 USED(x);
64 *pa = a;
65 return 0;
66}
67static int
68portTNullUnpack(uchar *a, uchar *ea, uchar **pa, PortTNull *x)
69{
70 USED(ea);
71 USED(x);
72 *pa = a;
73 return 0;
74}
75static void
76portRNullPrint(Fmt *fmt, PortRNull *x)
77{
78 USED(x);
79 fmtprint(fmt, "%s", "PortRNull");
80}
81static uint
82portRNullSize(PortRNull *x)
83{
84 uint a;
85 USED(x);
86 a = 0;
87 return a;
88}
89static int
90portRNullPack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
91{
92 USED(ea);
93 USED(x);
94 *pa = a;
95 return 0;
96}
97static int
98portRNullUnpack(uchar *a, uchar *ea, uchar **pa, PortRNull *x)
99{
100 USED(ea);
101 USED(x);
102 *pa = a;
103 return 0;
104}
105static void
106portTSetPrint(Fmt *fmt, PortTSet *x)
107{
108 fmtprint(fmt, "PortTSet ");
109 portMapPrint(fmt, &x->map);
110}
111static uint
112portTSetSize(PortTSet *x)
113{
114 uint a;
115 USED(x);
116 a = 0 + portMapSize(&x->map);
117 return a;
118}
119static int
120portTSetPack(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;
125Err:
126 *pa = ea;
127 return -1;
128}
129static int
130portTSetUnpack(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;
135Err:
136 *pa = ea;
137 return -1;
138}
139static void
140portRSetPrint(Fmt *fmt, PortRSet *x)
141{
142 fmtprint(fmt, "PortRSet %ud", x->b);
143}
144static uint
145portRSetSize(PortRSet *x)
146{
147 uint a;
148 USED(x);
149 a = 0 + 4;
150 return a;
151}
152static int
153portRSetPack(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;
158Err:
159 *pa = ea;
160 return -1;
161}
162static int
163portRSetUnpack(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;
168Err:
169 *pa = ea;
170 return -1;
171}
172static void
173portTUnsetPrint(Fmt *fmt, PortTUnset *x)
174{
175 fmtprint(fmt, "PortTUnset ");
176 portMapPrint(fmt, &x->map);
177}
178static uint
179portTUnsetSize(PortTUnset *x)
180{
181 uint a;
182 USED(x);
183 a = 0 + portMapSize(&x->map);
184 return a;
185}
186static int
187portTUnsetPack(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;
192Err:
193 *pa = ea;
194 return -1;
195}
196static int
197portTUnsetUnpack(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;
202Err:
203 *pa = ea;
204 return -1;
205}
206static void
207portRUnsetPrint(Fmt *fmt, PortRUnset *x)
208{
209 fmtprint(fmt, "PortRUnset %ud", x->b);
210}
211static uint
212portRUnsetSize(PortRUnset *x)
213{
214 uint a;
215 USED(x);
216 a = 0 + 4;
217 return a;
218}
219static int
220portRUnsetPack(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;
225Err:
226 *pa = ea;
227 return -1;
228}
229static int
230portRUnsetUnpack(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;
235Err:
236 *pa = ea;
237 return -1;
238}
239static void
240portTGetportPrint(Fmt *fmt, PortTGetport *x)
241{
242 fmtprint(fmt, "PortTGetport ");
243 portMapPrint(fmt, &x->map);
244}
245static uint
246portTGetportSize(PortTGetport *x)
247{
248 uint a;
249 USED(x);
250 a = 0 + portMapSize(&x->map);
251 return a;
252}
253static int
254portTGetportPack(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;
259Err:
260 *pa = ea;
261 return -1;
262}
263static int
264portTGetportUnpack(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;
269Err:
270 *pa = ea;
271 return -1;
272}
273static void
274portRGetportPrint(Fmt *fmt, PortRGetport *x)
275{
276 fmtprint(fmt, "PortRGetport %ud", x->port);
277}
278static uint
279portRGetportSize(PortRGetport *x)
280{
281 uint a;
282 USED(x);
283 a = 0 + 4;
284 return a;
285}
286static int
287portRGetportPack(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;
292Err:
293 *pa = ea;
294 return -1;
295}
296static int
297portRGetportUnpack(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;
302Err:
303 *pa = ea;
304 return -1;
305}
306static void
307portTDumpPrint(Fmt *fmt, PortTDump *x)
308{
309 USED(x);
310 fmtprint(fmt, "PortTDump");
311}
312static uint
313portTDumpSize(PortTDump *x)
314{
315 uint a;
316 USED(x);
317 a = 0;
318 return a;
319}
320static int
321portTDumpPack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
322{
323 USED(ea);
324 USED(x);
325 *pa = a;
326 return 0;
327}
328static int
329portTDumpUnpack(uchar *a, uchar *ea, uchar **pa, PortTDump *x)
330{
331 USED(ea);
332 USED(x);
333 *pa = a;
334 return 0;
335}
336static void
337portRDumpPrint(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}
347static uint
348portRDumpSize(PortRDump *x)
349{
350 return (5*4*x->nmap) + 4;
351}
352static int
353portRDumpPack(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;
369Err:
370 *pa = ea;
371 return -1;
372}
373static int
374portRDumpUnpack(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
394Err:
395 *pa = ea;
396 return -1;
397}
398static void
399portTCallitPrint(Fmt *fmt, PortTCallit *x)
400{
401 fmtprint(fmt, "PortTCallit [%ud,%ud,%ud] %ud", x->prog, x->vers, x->proc, x->count);
402}
403static uint
404portTCallitSize(PortTCallit *x)
405{
406 uint a;
407 USED(x);
408 a = 0 + 4 + 4 + 4 + sunvaropaquesize(x->count);
409 return a;
410}
411static int
412portTCallitPack(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;
420Err:
421 *pa = ea;
422 return -1;
423}
424static int
425portTCallitUnpack(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;
433Err:
434 *pa = ea;
435 return -1;
436}
437static void
438portRCallitPrint(Fmt *fmt, PortRCallit *x)
439{
440 fmtprint(fmt, "PortRCallit %ud %ud", x->port, x->count);
441}
442static uint
443portRCallitSize(PortRCallit *x)
444{
445 uint a;
446 USED(x);
447 a = 0 + 4 + sunvaropaquesize(x->count);
448 return a;
449}
450static int
451portRCallitPack(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;
457Err:
458 *pa = ea;
459 return -1;
460}
461static int
462portRCallitUnpack(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;
468Err:
469 *pa = ea;
470 return -1;
471}
472
473typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);
474typedef void (*F)(Fmt*, SunCall*);
475typedef uint (*S)(SunCall*);
476
477static 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
492SunProg portProg =
493{
494 PortProgram,
495 PortVersion,
496 proc,
497 nelem(proc),
498};