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