xdr.c revision 1.2.2.3 1 1.2.2.3 martin /* $NetBSD: xdr.c,v 1.2.2.3 2020/04/13 07:45:08 martin Exp $ */
2 1.2.2.2 christos
3 1.2.2.2 christos /*
4 1.2.2.2 christos * Copyright (c) 2010, Oracle America, Inc.
5 1.2.2.2 christos *
6 1.2.2.2 christos * Redistribution and use in source and binary forms, with or without
7 1.2.2.2 christos * modification, are permitted provided that the following conditions are
8 1.2.2.2 christos * met:
9 1.2.2.2 christos *
10 1.2.2.2 christos * * Redistributions of source code must retain the above copyright
11 1.2.2.2 christos * notice, this list of conditions and the following disclaimer.
12 1.2.2.2 christos * * Redistributions in binary form must reproduce the above
13 1.2.2.2 christos * copyright notice, this list of conditions and the following
14 1.2.2.2 christos * disclaimer in the documentation and/or other materials
15 1.2.2.2 christos * provided with the distribution.
16 1.2.2.2 christos * * Neither the name of the "Oracle America, Inc." nor the names of its
17 1.2.2.2 christos * contributors may be used to endorse or promote products derived
18 1.2.2.2 christos * from this software without specific prior written permission.
19 1.2.2.2 christos *
20 1.2.2.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 1.2.2.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 1.2.2.2 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 1.2.2.2 christos * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 1.2.2.2 christos * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25 1.2.2.2 christos * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 1.2.2.2 christos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27 1.2.2.2 christos * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 1.2.2.2 christos * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 1.2.2.2 christos * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 1.2.2.2 christos * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 1.2.2.2 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 1.2.2.2 christos */
33 1.2.2.2 christos
34 1.2.2.2 christos #include <sys/cdefs.h>
35 1.2.2.2 christos #if defined(LIBC_SCCS) && !defined(lint)
36 1.2.2.2 christos #if 0
37 1.2.2.2 christos static char *sccsid = "@(#)xdr.c 1.35 87/08/12";
38 1.2.2.2 christos static char *sccsid = "@(#)xdr.c 2.1 88/07/29 4.0 RPCSRC";
39 1.2.2.2 christos #else
40 1.2.2.3 martin __RCSID("$NetBSD: xdr.c,v 1.2.2.3 2020/04/13 07:45:08 martin Exp $");
41 1.2.2.2 christos #endif
42 1.2.2.2 christos #endif
43 1.2.2.2 christos
44 1.2.2.2 christos /*
45 1.2.2.2 christos * xdr.c, Generic XDR routines implementation.
46 1.2.2.2 christos *
47 1.2.2.2 christos * Copyright (C) 1986, Sun Microsystems, Inc.
48 1.2.2.2 christos *
49 1.2.2.2 christos * These are the "generic" xdr routines used to serialize and de-serialize
50 1.2.2.2 christos * most common data items. See xdr.h for more info on the interface to
51 1.2.2.2 christos * xdr.
52 1.2.2.2 christos */
53 1.2.2.2 christos
54 1.2.2.2 christos #if defined(_KERNEL) || defined(_STANDALONE)
55 1.2.2.2 christos
56 1.2.2.2 christos #include <lib/libkern/libkern.h>
57 1.2.2.2 christos #include <rpc/types.h>
58 1.2.2.2 christos #include <rpc/xdr.h>
59 1.2.2.2 christos
60 1.2.2.2 christos #else /* _KERNEL || _STANDALONE */
61 1.2.2.2 christos
62 1.2.2.2 christos #include "namespace.h"
63 1.2.2.2 christos
64 1.2.2.2 christos #include <assert.h>
65 1.2.2.2 christos #include <err.h>
66 1.2.2.2 christos #include <stdio.h>
67 1.2.2.2 christos #include <stdlib.h>
68 1.2.2.2 christos #include <string.h>
69 1.2.2.2 christos
70 1.2.2.2 christos #include <rpc/rpc.h>
71 1.2.2.2 christos #include <rpc/types.h>
72 1.2.2.2 christos #include <rpc/xdr.h>
73 1.2.2.2 christos #include <rpc/rpc_com.h>
74 1.2.2.2 christos
75 1.2.2.2 christos #ifdef __weak_alias
76 1.2.2.2 christos __weak_alias(xdr_bool,_xdr_bool)
77 1.2.2.2 christos __weak_alias(xdr_bytes,_xdr_bytes)
78 1.2.2.2 christos __weak_alias(xdr_char,_xdr_char)
79 1.2.2.2 christos __weak_alias(xdr_enum,_xdr_enum)
80 1.2.2.2 christos __weak_alias(xdr_free,_xdr_free)
81 1.2.2.2 christos __weak_alias(xdr_hyper,_xdr_hyper)
82 1.2.2.2 christos __weak_alias(xdr_int,_xdr_int)
83 1.2.2.2 christos __weak_alias(xdr_int16_t,_xdr_int16_t)
84 1.2.2.2 christos __weak_alias(xdr_int32_t,_xdr_int32_t)
85 1.2.2.2 christos __weak_alias(xdr_int64_t,_xdr_int64_t)
86 1.2.2.2 christos __weak_alias(xdr_long,_xdr_long)
87 1.2.2.2 christos __weak_alias(xdr_longlong_t,_xdr_longlong_t)
88 1.2.2.2 christos __weak_alias(xdr_netobj,_xdr_netobj)
89 1.2.2.2 christos __weak_alias(xdr_opaque,_xdr_opaque)
90 1.2.2.2 christos __weak_alias(xdr_short,_xdr_short)
91 1.2.2.2 christos __weak_alias(xdr_string,_xdr_string)
92 1.2.2.2 christos __weak_alias(xdr_u_char,_xdr_u_char)
93 1.2.2.2 christos __weak_alias(xdr_u_hyper,_xdr_u_hyper)
94 1.2.2.2 christos __weak_alias(xdr_u_int,_xdr_u_int)
95 1.2.2.2 christos __weak_alias(xdr_u_int16_t,_xdr_u_int16_t)
96 1.2.2.2 christos __weak_alias(xdr_u_int32_t,_xdr_u_int32_t)
97 1.2.2.2 christos __weak_alias(xdr_u_int64_t,_xdr_u_int64_t)
98 1.2.2.2 christos __weak_alias(xdr_u_long,_xdr_u_long)
99 1.2.2.2 christos __weak_alias(xdr_u_longlong_t,_xdr_u_longlong_t)
100 1.2.2.2 christos __weak_alias(xdr_u_short,_xdr_u_short)
101 1.2.2.2 christos __weak_alias(xdr_union,_xdr_union)
102 1.2.2.2 christos __weak_alias(xdr_void,_xdr_void)
103 1.2.2.2 christos __weak_alias(xdr_wrapstring,_xdr_wrapstring)
104 1.2.2.2 christos #endif
105 1.2.2.2 christos
106 1.2.2.2 christos #endif /* _KERNEL || _STANDALONE */
107 1.2.2.2 christos
108 1.2.2.2 christos /*
109 1.2.2.2 christos * constants specific to the xdr "protocol"
110 1.2.2.2 christos */
111 1.2.2.2 christos #define XDR_FALSE ((long) 0)
112 1.2.2.2 christos #define XDR_TRUE ((long) 1)
113 1.2.2.2 christos
114 1.2.2.2 christos /*
115 1.2.2.2 christos * for unit alignment
116 1.2.2.2 christos */
117 1.2.2.2 christos static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
118 1.2.2.2 christos
119 1.2.2.2 christos /*
120 1.2.2.2 christos * Free a data structure using XDR
121 1.2.2.2 christos * Not a filter, but a convenient utility nonetheless
122 1.2.2.2 christos */
123 1.2.2.2 christos void
124 1.2.2.2 christos xdr_free(xdrproc_t proc, char *objp)
125 1.2.2.2 christos {
126 1.2.2.2 christos XDR x;
127 1.2.2.2 christos
128 1.2.2.2 christos x.x_op = XDR_FREE;
129 1.2.2.2 christos (*proc)(&x, objp);
130 1.2.2.2 christos }
131 1.2.2.2 christos
132 1.2.2.2 christos /*
133 1.2.2.2 christos * XDR nothing
134 1.2.2.2 christos */
135 1.2.2.2 christos bool_t
136 1.2.2.2 christos xdr_void(void) {
137 1.2.2.2 christos
138 1.2.2.2 christos return (TRUE);
139 1.2.2.2 christos }
140 1.2.2.2 christos
141 1.2.2.2 christos
142 1.2.2.2 christos /*
143 1.2.2.2 christos * XDR integers
144 1.2.2.2 christos */
145 1.2.2.2 christos bool_t
146 1.2.2.2 christos xdr_int(XDR *xdrs, int *ip)
147 1.2.2.2 christos {
148 1.2.2.2 christos long l;
149 1.2.2.2 christos
150 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
151 1.2.2.2 christos _DIAGASSERT(ip != NULL);
152 1.2.2.2 christos
153 1.2.2.2 christos switch (xdrs->x_op) {
154 1.2.2.2 christos
155 1.2.2.2 christos case XDR_ENCODE:
156 1.2.2.2 christos l = (long) *ip;
157 1.2.2.2 christos return (XDR_PUTLONG(xdrs, &l));
158 1.2.2.2 christos
159 1.2.2.2 christos case XDR_DECODE:
160 1.2.2.2 christos if (!XDR_GETLONG(xdrs, &l)) {
161 1.2.2.2 christos return (FALSE);
162 1.2.2.2 christos }
163 1.2.2.2 christos *ip = (int) l;
164 1.2.2.2 christos return (TRUE);
165 1.2.2.2 christos
166 1.2.2.2 christos case XDR_FREE:
167 1.2.2.2 christos return (TRUE);
168 1.2.2.2 christos }
169 1.2.2.2 christos /* NOTREACHED */
170 1.2.2.2 christos return (FALSE);
171 1.2.2.2 christos }
172 1.2.2.2 christos
173 1.2.2.2 christos /*
174 1.2.2.2 christos * XDR unsigned integers
175 1.2.2.2 christos */
176 1.2.2.2 christos bool_t
177 1.2.2.2 christos xdr_u_int(XDR *xdrs, u_int *up)
178 1.2.2.2 christos {
179 1.2.2.2 christos u_long l;
180 1.2.2.2 christos
181 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
182 1.2.2.2 christos _DIAGASSERT(up != NULL);
183 1.2.2.2 christos
184 1.2.2.2 christos switch (xdrs->x_op) {
185 1.2.2.2 christos
186 1.2.2.2 christos case XDR_ENCODE:
187 1.2.2.2 christos l = (u_long) *up;
188 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)&l));
189 1.2.2.2 christos
190 1.2.2.2 christos case XDR_DECODE:
191 1.2.2.2 christos if (!XDR_GETLONG(xdrs, (long *)&l)) {
192 1.2.2.2 christos return (FALSE);
193 1.2.2.2 christos }
194 1.2.2.2 christos *up = (u_int) l;
195 1.2.2.2 christos return (TRUE);
196 1.2.2.2 christos
197 1.2.2.2 christos case XDR_FREE:
198 1.2.2.2 christos return (TRUE);
199 1.2.2.2 christos }
200 1.2.2.2 christos /* NOTREACHED */
201 1.2.2.2 christos return (FALSE);
202 1.2.2.2 christos }
203 1.2.2.2 christos
204 1.2.2.2 christos
205 1.2.2.2 christos /*
206 1.2.2.2 christos * XDR long integers
207 1.2.2.2 christos * same as xdr_u_long - open coded to save a proc call!
208 1.2.2.2 christos */
209 1.2.2.2 christos bool_t
210 1.2.2.2 christos xdr_long(XDR *xdrs, long *lp)
211 1.2.2.2 christos {
212 1.2.2.2 christos
213 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
214 1.2.2.2 christos _DIAGASSERT(lp != NULL);
215 1.2.2.2 christos
216 1.2.2.2 christos switch (xdrs->x_op) {
217 1.2.2.2 christos case XDR_ENCODE:
218 1.2.2.2 christos return (XDR_PUTLONG(xdrs, lp));
219 1.2.2.2 christos case XDR_DECODE:
220 1.2.2.2 christos return (XDR_GETLONG(xdrs, lp));
221 1.2.2.2 christos case XDR_FREE:
222 1.2.2.2 christos return (TRUE);
223 1.2.2.2 christos }
224 1.2.2.2 christos /* NOTREACHED */
225 1.2.2.2 christos return (FALSE);
226 1.2.2.2 christos }
227 1.2.2.2 christos
228 1.2.2.2 christos /*
229 1.2.2.2 christos * XDR unsigned long integers
230 1.2.2.2 christos * same as xdr_long - open coded to save a proc call!
231 1.2.2.2 christos */
232 1.2.2.2 christos bool_t
233 1.2.2.2 christos xdr_u_long(XDR *xdrs, u_long *ulp)
234 1.2.2.2 christos {
235 1.2.2.2 christos
236 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
237 1.2.2.2 christos _DIAGASSERT(ulp != NULL);
238 1.2.2.2 christos
239 1.2.2.2 christos switch (xdrs->x_op) {
240 1.2.2.2 christos case XDR_ENCODE:
241 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)ulp));
242 1.2.2.2 christos case XDR_DECODE:
243 1.2.2.2 christos return (XDR_GETLONG(xdrs, (long *)ulp));
244 1.2.2.2 christos case XDR_FREE:
245 1.2.2.2 christos return (TRUE);
246 1.2.2.2 christos }
247 1.2.2.2 christos /* NOTREACHED */
248 1.2.2.2 christos return (FALSE);
249 1.2.2.2 christos }
250 1.2.2.2 christos
251 1.2.2.2 christos
252 1.2.2.2 christos /*
253 1.2.2.2 christos * XDR 32-bit integers
254 1.2.2.2 christos * same as xdr_u_int32_t - open coded to save a proc call!
255 1.2.2.2 christos */
256 1.2.2.2 christos bool_t
257 1.2.2.2 christos xdr_int32_t(XDR *xdrs, int32_t *int32_p)
258 1.2.2.2 christos {
259 1.2.2.2 christos long l;
260 1.2.2.2 christos
261 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
262 1.2.2.2 christos _DIAGASSERT(int32_p != NULL);
263 1.2.2.2 christos
264 1.2.2.2 christos switch (xdrs->x_op) {
265 1.2.2.2 christos
266 1.2.2.2 christos case XDR_ENCODE:
267 1.2.2.2 christos l = (long) *int32_p;
268 1.2.2.2 christos return (XDR_PUTLONG(xdrs, &l));
269 1.2.2.2 christos
270 1.2.2.2 christos case XDR_DECODE:
271 1.2.2.2 christos if (!XDR_GETLONG(xdrs, &l)) {
272 1.2.2.2 christos return (FALSE);
273 1.2.2.2 christos }
274 1.2.2.2 christos *int32_p = (int32_t) l;
275 1.2.2.2 christos return (TRUE);
276 1.2.2.2 christos
277 1.2.2.2 christos case XDR_FREE:
278 1.2.2.2 christos return (TRUE);
279 1.2.2.2 christos }
280 1.2.2.2 christos /* NOTREACHED */
281 1.2.2.2 christos return (FALSE);
282 1.2.2.2 christos }
283 1.2.2.2 christos
284 1.2.2.2 christos /*
285 1.2.2.2 christos * XDR unsigned 32-bit integers
286 1.2.2.2 christos * same as xdr_int32_t - open coded to save a proc call!
287 1.2.2.2 christos */
288 1.2.2.2 christos bool_t
289 1.2.2.2 christos xdr_u_int32_t(XDR *xdrs, u_int32_t *u_int32_p)
290 1.2.2.2 christos {
291 1.2.2.2 christos u_long l;
292 1.2.2.2 christos
293 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
294 1.2.2.2 christos _DIAGASSERT(u_int32_p != NULL);
295 1.2.2.2 christos
296 1.2.2.2 christos switch (xdrs->x_op) {
297 1.2.2.2 christos
298 1.2.2.2 christos case XDR_ENCODE:
299 1.2.2.2 christos l = (u_long) *u_int32_p;
300 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)&l));
301 1.2.2.2 christos
302 1.2.2.2 christos case XDR_DECODE:
303 1.2.2.2 christos if (!XDR_GETLONG(xdrs, (long *)&l)) {
304 1.2.2.2 christos return (FALSE);
305 1.2.2.2 christos }
306 1.2.2.2 christos *u_int32_p = (u_int32_t) l;
307 1.2.2.2 christos return (TRUE);
308 1.2.2.2 christos
309 1.2.2.2 christos case XDR_FREE:
310 1.2.2.2 christos return (TRUE);
311 1.2.2.2 christos }
312 1.2.2.2 christos /* NOTREACHED */
313 1.2.2.2 christos return (FALSE);
314 1.2.2.2 christos }
315 1.2.2.2 christos
316 1.2.2.2 christos
317 1.2.2.2 christos /*
318 1.2.2.2 christos * XDR short integers
319 1.2.2.2 christos */
320 1.2.2.2 christos bool_t
321 1.2.2.2 christos xdr_short(XDR *xdrs, short *sp)
322 1.2.2.2 christos {
323 1.2.2.2 christos long l;
324 1.2.2.2 christos
325 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
326 1.2.2.2 christos _DIAGASSERT(sp != NULL);
327 1.2.2.2 christos
328 1.2.2.2 christos switch (xdrs->x_op) {
329 1.2.2.2 christos
330 1.2.2.2 christos case XDR_ENCODE:
331 1.2.2.2 christos l = (long) *sp;
332 1.2.2.2 christos return (XDR_PUTLONG(xdrs, &l));
333 1.2.2.2 christos
334 1.2.2.2 christos case XDR_DECODE:
335 1.2.2.2 christos if (!XDR_GETLONG(xdrs, &l)) {
336 1.2.2.2 christos return (FALSE);
337 1.2.2.2 christos }
338 1.2.2.2 christos *sp = (short) l;
339 1.2.2.2 christos return (TRUE);
340 1.2.2.2 christos
341 1.2.2.2 christos case XDR_FREE:
342 1.2.2.2 christos return (TRUE);
343 1.2.2.2 christos }
344 1.2.2.2 christos /* NOTREACHED */
345 1.2.2.2 christos return (FALSE);
346 1.2.2.2 christos }
347 1.2.2.2 christos
348 1.2.2.2 christos /*
349 1.2.2.2 christos * XDR unsigned short integers
350 1.2.2.2 christos */
351 1.2.2.2 christos bool_t
352 1.2.2.2 christos xdr_u_short(XDR *xdrs, u_short *usp)
353 1.2.2.2 christos {
354 1.2.2.2 christos u_long l;
355 1.2.2.2 christos
356 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
357 1.2.2.2 christos _DIAGASSERT(usp != NULL);
358 1.2.2.2 christos
359 1.2.2.2 christos switch (xdrs->x_op) {
360 1.2.2.2 christos
361 1.2.2.2 christos case XDR_ENCODE:
362 1.2.2.2 christos l = (u_long) *usp;
363 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)&l));
364 1.2.2.2 christos
365 1.2.2.2 christos case XDR_DECODE:
366 1.2.2.2 christos if (!XDR_GETLONG(xdrs, (long *)&l)) {
367 1.2.2.2 christos return (FALSE);
368 1.2.2.2 christos }
369 1.2.2.2 christos *usp = (u_short) l;
370 1.2.2.2 christos return (TRUE);
371 1.2.2.2 christos
372 1.2.2.2 christos case XDR_FREE:
373 1.2.2.2 christos return (TRUE);
374 1.2.2.2 christos }
375 1.2.2.2 christos /* NOTREACHED */
376 1.2.2.2 christos return (FALSE);
377 1.2.2.2 christos }
378 1.2.2.2 christos
379 1.2.2.2 christos
380 1.2.2.2 christos /*
381 1.2.2.2 christos * XDR 16-bit integers
382 1.2.2.2 christos */
383 1.2.2.2 christos bool_t
384 1.2.2.2 christos xdr_int16_t(XDR *xdrs, int16_t *int16_p)
385 1.2.2.2 christos {
386 1.2.2.2 christos long l;
387 1.2.2.2 christos
388 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
389 1.2.2.2 christos _DIAGASSERT(int16_p != NULL);
390 1.2.2.2 christos
391 1.2.2.2 christos switch (xdrs->x_op) {
392 1.2.2.2 christos
393 1.2.2.2 christos case XDR_ENCODE:
394 1.2.2.2 christos l = (long) *int16_p;
395 1.2.2.2 christos return (XDR_PUTLONG(xdrs, &l));
396 1.2.2.2 christos
397 1.2.2.2 christos case XDR_DECODE:
398 1.2.2.2 christos if (!XDR_GETLONG(xdrs, &l)) {
399 1.2.2.2 christos return (FALSE);
400 1.2.2.2 christos }
401 1.2.2.2 christos *int16_p = (int16_t) l;
402 1.2.2.2 christos return (TRUE);
403 1.2.2.2 christos
404 1.2.2.2 christos case XDR_FREE:
405 1.2.2.2 christos return (TRUE);
406 1.2.2.2 christos }
407 1.2.2.2 christos /* NOTREACHED */
408 1.2.2.2 christos return (FALSE);
409 1.2.2.2 christos }
410 1.2.2.2 christos
411 1.2.2.2 christos /*
412 1.2.2.2 christos * XDR unsigned 16-bit integers
413 1.2.2.2 christos */
414 1.2.2.2 christos bool_t
415 1.2.2.2 christos xdr_u_int16_t(XDR *xdrs, u_int16_t *u_int16_p)
416 1.2.2.2 christos {
417 1.2.2.2 christos u_long l;
418 1.2.2.2 christos
419 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
420 1.2.2.2 christos _DIAGASSERT(u_int16_p != NULL);
421 1.2.2.2 christos
422 1.2.2.2 christos switch (xdrs->x_op) {
423 1.2.2.2 christos
424 1.2.2.2 christos case XDR_ENCODE:
425 1.2.2.2 christos l = (u_long) *u_int16_p;
426 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)&l));
427 1.2.2.2 christos
428 1.2.2.2 christos case XDR_DECODE:
429 1.2.2.2 christos if (!XDR_GETLONG(xdrs, (long *)&l)) {
430 1.2.2.2 christos return (FALSE);
431 1.2.2.2 christos }
432 1.2.2.2 christos *u_int16_p = (u_int16_t) l;
433 1.2.2.2 christos return (TRUE);
434 1.2.2.2 christos
435 1.2.2.2 christos case XDR_FREE:
436 1.2.2.2 christos return (TRUE);
437 1.2.2.2 christos }
438 1.2.2.2 christos /* NOTREACHED */
439 1.2.2.2 christos return (FALSE);
440 1.2.2.2 christos }
441 1.2.2.2 christos
442 1.2.2.2 christos
443 1.2.2.2 christos /*
444 1.2.2.2 christos * XDR a char
445 1.2.2.2 christos */
446 1.2.2.2 christos bool_t
447 1.2.2.2 christos xdr_char(XDR *xdrs, char *cp)
448 1.2.2.2 christos {
449 1.2.2.2 christos int i;
450 1.2.2.2 christos
451 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
452 1.2.2.2 christos _DIAGASSERT(cp != NULL);
453 1.2.2.2 christos
454 1.2.2.2 christos i = (*cp);
455 1.2.2.2 christos if (!xdr_int(xdrs, &i)) {
456 1.2.2.2 christos return (FALSE);
457 1.2.2.2 christos }
458 1.2.2.2 christos *cp = i;
459 1.2.2.2 christos return (TRUE);
460 1.2.2.2 christos }
461 1.2.2.2 christos
462 1.2.2.2 christos /*
463 1.2.2.2 christos * XDR an unsigned char
464 1.2.2.2 christos */
465 1.2.2.2 christos bool_t
466 1.2.2.2 christos xdr_u_char(XDR *xdrs, u_char *cp)
467 1.2.2.2 christos {
468 1.2.2.2 christos u_int u;
469 1.2.2.2 christos
470 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
471 1.2.2.2 christos _DIAGASSERT(cp != NULL);
472 1.2.2.2 christos
473 1.2.2.2 christos u = (*cp);
474 1.2.2.2 christos if (!xdr_u_int(xdrs, &u)) {
475 1.2.2.2 christos return (FALSE);
476 1.2.2.2 christos }
477 1.2.2.2 christos *cp = u;
478 1.2.2.2 christos return (TRUE);
479 1.2.2.2 christos }
480 1.2.2.2 christos
481 1.2.2.2 christos /*
482 1.2.2.2 christos * XDR booleans
483 1.2.2.2 christos */
484 1.2.2.2 christos bool_t
485 1.2.2.2 christos xdr_bool(XDR *xdrs, bool_t *bp)
486 1.2.2.2 christos {
487 1.2.2.2 christos long lb;
488 1.2.2.2 christos
489 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
490 1.2.2.2 christos _DIAGASSERT(bp != NULL);
491 1.2.2.2 christos
492 1.2.2.2 christos switch (xdrs->x_op) {
493 1.2.2.2 christos
494 1.2.2.2 christos case XDR_ENCODE:
495 1.2.2.2 christos lb = *bp ? XDR_TRUE : XDR_FALSE;
496 1.2.2.2 christos return (XDR_PUTLONG(xdrs, &lb));
497 1.2.2.2 christos
498 1.2.2.2 christos case XDR_DECODE:
499 1.2.2.2 christos if (!XDR_GETLONG(xdrs, &lb)) {
500 1.2.2.2 christos return (FALSE);
501 1.2.2.2 christos }
502 1.2.2.2 christos *bp = (lb == XDR_FALSE) ? FALSE : TRUE;
503 1.2.2.2 christos return (TRUE);
504 1.2.2.2 christos
505 1.2.2.2 christos case XDR_FREE:
506 1.2.2.2 christos return (TRUE);
507 1.2.2.2 christos }
508 1.2.2.2 christos /* NOTREACHED */
509 1.2.2.2 christos return (FALSE);
510 1.2.2.2 christos }
511 1.2.2.2 christos
512 1.2.2.2 christos /*
513 1.2.2.2 christos * XDR enumerations
514 1.2.2.2 christos */
515 1.2.2.2 christos bool_t
516 1.2.2.2 christos xdr_enum(XDR *xdrs, enum_t *ep)
517 1.2.2.2 christos {
518 1.2.2.2 christos long l;
519 1.2.2.2 christos
520 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
521 1.2.2.2 christos _DIAGASSERT(ep != NULL);
522 1.2.2.2 christos
523 1.2.2.2 christos switch (xdrs->x_op) {
524 1.2.2.2 christos
525 1.2.2.2 christos case XDR_ENCODE:
526 1.2.2.2 christos l = (long) *ep;
527 1.2.2.2 christos return (XDR_PUTLONG(xdrs, &l));
528 1.2.2.2 christos
529 1.2.2.2 christos case XDR_DECODE:
530 1.2.2.2 christos if (!XDR_GETLONG(xdrs, &l)) {
531 1.2.2.2 christos return (FALSE);
532 1.2.2.2 christos }
533 1.2.2.2 christos *ep = (enum_t) l;
534 1.2.2.2 christos return (TRUE);
535 1.2.2.2 christos
536 1.2.2.2 christos case XDR_FREE:
537 1.2.2.2 christos return (TRUE);
538 1.2.2.2 christos }
539 1.2.2.2 christos /* NOTREACHED */
540 1.2.2.2 christos return (FALSE);
541 1.2.2.2 christos }
542 1.2.2.2 christos
543 1.2.2.2 christos /*
544 1.2.2.2 christos * XDR opaque data
545 1.2.2.2 christos * Allows the specification of a fixed size sequence of opaque bytes.
546 1.2.2.2 christos * cp points to the opaque object and cnt gives the byte length.
547 1.2.2.2 christos */
548 1.2.2.2 christos bool_t
549 1.2.2.3 martin xdr_opaque(XDR *xdrs, char *cp, u_int cnt)
550 1.2.2.2 christos {
551 1.2.2.2 christos u_int rndup;
552 1.2.2.2 christos static int crud[BYTES_PER_XDR_UNIT];
553 1.2.2.2 christos
554 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
555 1.2.2.2 christos /*
556 1.2.2.2 christos * if no data we are done
557 1.2.2.2 christos */
558 1.2.2.2 christos if (cnt == 0)
559 1.2.2.2 christos return (TRUE);
560 1.2.2.2 christos _DIAGASSERT(cp != NULL);
561 1.2.2.2 christos
562 1.2.2.2 christos /*
563 1.2.2.2 christos * round byte count to full xdr units
564 1.2.2.2 christos */
565 1.2.2.2 christos rndup = cnt % BYTES_PER_XDR_UNIT;
566 1.2.2.2 christos if (rndup > 0)
567 1.2.2.2 christos rndup = BYTES_PER_XDR_UNIT - rndup;
568 1.2.2.2 christos
569 1.2.2.2 christos if (xdrs->x_op == XDR_DECODE) {
570 1.2.2.2 christos if (!XDR_GETBYTES(xdrs, cp, cnt)) {
571 1.2.2.2 christos return (FALSE);
572 1.2.2.2 christos }
573 1.2.2.2 christos if (rndup == 0)
574 1.2.2.2 christos return (TRUE);
575 1.2.2.3 martin return (XDR_GETBYTES(xdrs, (void *)crud, rndup));
576 1.2.2.2 christos }
577 1.2.2.2 christos
578 1.2.2.2 christos if (xdrs->x_op == XDR_ENCODE) {
579 1.2.2.2 christos if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
580 1.2.2.2 christos return (FALSE);
581 1.2.2.2 christos }
582 1.2.2.2 christos if (rndup == 0)
583 1.2.2.2 christos return (TRUE);
584 1.2.2.2 christos return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
585 1.2.2.2 christos }
586 1.2.2.2 christos
587 1.2.2.2 christos if (xdrs->x_op == XDR_FREE) {
588 1.2.2.2 christos return (TRUE);
589 1.2.2.2 christos }
590 1.2.2.2 christos
591 1.2.2.2 christos return (FALSE);
592 1.2.2.2 christos }
593 1.2.2.2 christos
594 1.2.2.2 christos /*
595 1.2.2.2 christos * XDR counted bytes
596 1.2.2.2 christos * *cpp is a pointer to the bytes, *sizep is the count.
597 1.2.2.2 christos * If *cpp is NULL maxsize bytes are allocated
598 1.2.2.2 christos */
599 1.2.2.2 christos bool_t
600 1.2.2.2 christos xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
601 1.2.2.2 christos {
602 1.2.2.2 christos char *sp; /* sp is the actual string pointer */
603 1.2.2.2 christos u_int nodesize;
604 1.2.2.2 christos bool_t ret, allocated = FALSE;
605 1.2.2.2 christos
606 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
607 1.2.2.2 christos _DIAGASSERT(cpp != NULL);
608 1.2.2.2 christos _DIAGASSERT(sizep != NULL);
609 1.2.2.2 christos
610 1.2.2.2 christos sp = *cpp;
611 1.2.2.2 christos
612 1.2.2.2 christos /*
613 1.2.2.2 christos * first deal with the length since xdr bytes are counted
614 1.2.2.2 christos */
615 1.2.2.2 christos if (! xdr_u_int(xdrs, sizep)) {
616 1.2.2.2 christos return (FALSE);
617 1.2.2.2 christos }
618 1.2.2.2 christos nodesize = *sizep;
619 1.2.2.2 christos if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
620 1.2.2.2 christos return (FALSE);
621 1.2.2.2 christos }
622 1.2.2.2 christos
623 1.2.2.2 christos /*
624 1.2.2.2 christos * now deal with the actual bytes
625 1.2.2.2 christos */
626 1.2.2.2 christos switch (xdrs->x_op) {
627 1.2.2.2 christos
628 1.2.2.2 christos case XDR_DECODE:
629 1.2.2.2 christos if (nodesize == 0) {
630 1.2.2.2 christos return (TRUE);
631 1.2.2.2 christos }
632 1.2.2.2 christos if (sp == NULL) {
633 1.2.2.2 christos *cpp = sp = mem_alloc(nodesize);
634 1.2.2.2 christos allocated = TRUE;
635 1.2.2.2 christos }
636 1.2.2.2 christos if (sp == NULL) {
637 1.2.2.2 christos warn("%s: out of memory", __func__);
638 1.2.2.2 christos return (FALSE);
639 1.2.2.2 christos }
640 1.2.2.2 christos /* FALLTHROUGH */
641 1.2.2.2 christos
642 1.2.2.2 christos case XDR_ENCODE:
643 1.2.2.2 christos ret = xdr_opaque(xdrs, sp, nodesize);
644 1.2.2.2 christos if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
645 1.2.2.2 christos if (allocated == TRUE) {
646 1.2.2.2 christos mem_free(sp, nodesize);
647 1.2.2.2 christos *cpp = NULL;
648 1.2.2.2 christos }
649 1.2.2.2 christos }
650 1.2.2.2 christos return (ret);
651 1.2.2.2 christos
652 1.2.2.2 christos case XDR_FREE:
653 1.2.2.2 christos if (sp != NULL) {
654 1.2.2.2 christos mem_free(sp, nodesize);
655 1.2.2.2 christos *cpp = NULL;
656 1.2.2.2 christos }
657 1.2.2.2 christos return (TRUE);
658 1.2.2.2 christos }
659 1.2.2.2 christos /* NOTREACHED */
660 1.2.2.2 christos return (FALSE);
661 1.2.2.2 christos }
662 1.2.2.2 christos
663 1.2.2.2 christos /*
664 1.2.2.2 christos * Implemented here due to commonality of the object.
665 1.2.2.2 christos */
666 1.2.2.2 christos bool_t
667 1.2.2.2 christos xdr_netobj(XDR *xdrs, struct netobj *np)
668 1.2.2.2 christos {
669 1.2.2.2 christos
670 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
671 1.2.2.2 christos _DIAGASSERT(np != NULL);
672 1.2.2.2 christos
673 1.2.2.2 christos return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
674 1.2.2.2 christos }
675 1.2.2.2 christos
676 1.2.2.2 christos /*
677 1.2.2.2 christos * XDR a descriminated union
678 1.2.2.2 christos * Support routine for discriminated unions.
679 1.2.2.2 christos * You create an array of xdrdiscrim structures, terminated with
680 1.2.2.2 christos * an entry with a null procedure pointer. The routine gets
681 1.2.2.2 christos * the discriminant value and then searches the array of xdrdiscrims
682 1.2.2.2 christos * looking for that value. It calls the procedure given in the xdrdiscrim
683 1.2.2.2 christos * to handle the discriminant. If there is no specific routine a default
684 1.2.2.2 christos * routine may be called.
685 1.2.2.2 christos * If there is no specific or default routine an error is returned.
686 1.2.2.2 christos */
687 1.2.2.2 christos bool_t
688 1.2.2.2 christos xdr_union(
689 1.2.2.2 christos XDR *xdrs,
690 1.2.2.2 christos enum_t *dscmp, /* enum to decide which arm to work on */
691 1.2.2.2 christos char *unp, /* the union itself */
692 1.2.2.2 christos const struct xdr_discrim *choices, /* [value, xdr proc] for each arm */
693 1.2.2.2 christos xdrproc_t dfault /* default xdr routine */
694 1.2.2.2 christos )
695 1.2.2.2 christos {
696 1.2.2.2 christos enum_t dscm;
697 1.2.2.2 christos
698 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
699 1.2.2.2 christos _DIAGASSERT(dscmp != NULL);
700 1.2.2.2 christos _DIAGASSERT(unp != NULL);
701 1.2.2.2 christos _DIAGASSERT(choices != NULL);
702 1.2.2.2 christos /* dfault may be NULL */
703 1.2.2.2 christos
704 1.2.2.2 christos /*
705 1.2.2.2 christos * we deal with the discriminator; it's an enum
706 1.2.2.2 christos */
707 1.2.2.2 christos if (! xdr_enum(xdrs, dscmp)) {
708 1.2.2.2 christos return (FALSE);
709 1.2.2.2 christos }
710 1.2.2.2 christos dscm = *dscmp;
711 1.2.2.2 christos
712 1.2.2.2 christos /*
713 1.2.2.2 christos * search choices for a value that matches the discriminator.
714 1.2.2.2 christos * if we find one, execute the xdr routine for that value.
715 1.2.2.2 christos */
716 1.2.2.2 christos for (; choices->proc != NULL_xdrproc_t; choices++) {
717 1.2.2.2 christos if (choices->value == dscm)
718 1.2.2.2 christos return ((*(choices->proc))(xdrs, unp));
719 1.2.2.2 christos }
720 1.2.2.2 christos
721 1.2.2.2 christos /*
722 1.2.2.2 christos * no match - execute the default xdr routine if there is one
723 1.2.2.2 christos */
724 1.2.2.2 christos return ((dfault == NULL_xdrproc_t) ? FALSE :
725 1.2.2.2 christos (*dfault)(xdrs, unp));
726 1.2.2.2 christos }
727 1.2.2.2 christos
728 1.2.2.2 christos
729 1.2.2.2 christos /*
730 1.2.2.2 christos * Non-portable xdr primitives.
731 1.2.2.2 christos * Care should be taken when moving these routines to new architectures.
732 1.2.2.2 christos */
733 1.2.2.2 christos
734 1.2.2.2 christos
735 1.2.2.2 christos /*
736 1.2.2.2 christos * XDR null terminated ASCII strings
737 1.2.2.2 christos * xdr_string deals with "C strings" - arrays of bytes that are
738 1.2.2.2 christos * terminated by a NULL character. The parameter cpp references a
739 1.2.2.2 christos * pointer to storage; If the pointer is null, then the necessary
740 1.2.2.2 christos * storage is allocated. The last parameter is the max allowed length
741 1.2.2.2 christos * of the string as specified by a protocol.
742 1.2.2.2 christos */
743 1.2.2.2 christos bool_t
744 1.2.2.2 christos xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
745 1.2.2.2 christos {
746 1.2.2.2 christos char *sp; /* sp is the actual string pointer */
747 1.2.2.2 christos u_int size = 0; /* XXX: GCC */
748 1.2.2.2 christos u_int nodesize;
749 1.2.2.2 christos size_t len;
750 1.2.2.2 christos bool_t ret, allocated = FALSE;
751 1.2.2.2 christos
752 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
753 1.2.2.2 christos _DIAGASSERT(cpp != NULL);
754 1.2.2.2 christos
755 1.2.2.2 christos sp = *cpp;
756 1.2.2.2 christos
757 1.2.2.2 christos /*
758 1.2.2.2 christos * first deal with the length since xdr strings are counted-strings
759 1.2.2.2 christos */
760 1.2.2.2 christos switch (xdrs->x_op) {
761 1.2.2.2 christos case XDR_FREE:
762 1.2.2.2 christos if (sp == NULL) {
763 1.2.2.2 christos return(TRUE); /* already free */
764 1.2.2.2 christos }
765 1.2.2.2 christos /* FALLTHROUGH */
766 1.2.2.2 christos case XDR_ENCODE:
767 1.2.2.2 christos len = strlen(sp);
768 1.2.2.2 christos _DIAGASSERT(__type_fit(u_int, len));
769 1.2.2.2 christos size = (u_int)len;
770 1.2.2.2 christos break;
771 1.2.2.2 christos case XDR_DECODE:
772 1.2.2.2 christos break;
773 1.2.2.2 christos }
774 1.2.2.2 christos if (! xdr_u_int(xdrs, &size)) {
775 1.2.2.2 christos return (FALSE);
776 1.2.2.2 christos }
777 1.2.2.2 christos if (size > maxsize) {
778 1.2.2.2 christos return (FALSE);
779 1.2.2.2 christos }
780 1.2.2.2 christos nodesize = size + 1;
781 1.2.2.2 christos
782 1.2.2.2 christos /*
783 1.2.2.2 christos * now deal with the actual bytes
784 1.2.2.2 christos */
785 1.2.2.2 christos switch (xdrs->x_op) {
786 1.2.2.2 christos
787 1.2.2.2 christos case XDR_DECODE:
788 1.2.2.2 christos if (nodesize == 0) {
789 1.2.2.2 christos return (TRUE);
790 1.2.2.2 christos }
791 1.2.2.2 christos if (sp == NULL) {
792 1.2.2.2 christos *cpp = sp = mem_alloc(nodesize);
793 1.2.2.2 christos allocated = TRUE;
794 1.2.2.2 christos }
795 1.2.2.2 christos if (sp == NULL) {
796 1.2.2.2 christos warn("%s: out of memory", __func__);
797 1.2.2.2 christos return (FALSE);
798 1.2.2.2 christos }
799 1.2.2.2 christos sp[size] = 0;
800 1.2.2.2 christos /* FALLTHROUGH */
801 1.2.2.2 christos
802 1.2.2.2 christos case XDR_ENCODE:
803 1.2.2.2 christos ret = xdr_opaque(xdrs, sp, size);
804 1.2.2.2 christos if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
805 1.2.2.2 christos if (allocated == TRUE) {
806 1.2.2.2 christos mem_free(sp, nodesize);
807 1.2.2.2 christos *cpp = NULL;
808 1.2.2.2 christos }
809 1.2.2.2 christos }
810 1.2.2.2 christos return (ret);
811 1.2.2.2 christos
812 1.2.2.2 christos case XDR_FREE:
813 1.2.2.2 christos mem_free(sp, nodesize);
814 1.2.2.2 christos *cpp = NULL;
815 1.2.2.2 christos return (TRUE);
816 1.2.2.2 christos }
817 1.2.2.2 christos /* NOTREACHED */
818 1.2.2.2 christos return (FALSE);
819 1.2.2.2 christos }
820 1.2.2.2 christos
821 1.2.2.2 christos #if !defined(_KERNEL) && !defined(_STANDALONE)
822 1.2.2.2 christos
823 1.2.2.2 christos /*
824 1.2.2.2 christos * Wrapper for xdr_string that can be called directly from
825 1.2.2.2 christos * routines like clnt_call
826 1.2.2.2 christos */
827 1.2.2.2 christos bool_t
828 1.2.2.2 christos xdr_wrapstring(XDR *xdrs, char **cpp)
829 1.2.2.2 christos {
830 1.2.2.2 christos
831 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
832 1.2.2.2 christos _DIAGASSERT(cpp != NULL);
833 1.2.2.2 christos
834 1.2.2.2 christos return xdr_string(xdrs, cpp, RPC_MAXDATASIZE);
835 1.2.2.2 christos }
836 1.2.2.2 christos
837 1.2.2.2 christos #endif /* !_KERNEL && !_STANDALONE */
838 1.2.2.2 christos
839 1.2.2.2 christos /*
840 1.2.2.2 christos * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t()
841 1.2.2.2 christos * are in the "non-portable" section because they require that a `long long'
842 1.2.2.2 christos * be a 64-bit type.
843 1.2.2.2 christos *
844 1.2.2.2 christos * --thorpej (at) NetBSD.org, November 30, 1999
845 1.2.2.2 christos */
846 1.2.2.2 christos
847 1.2.2.2 christos /*
848 1.2.2.2 christos * XDR 64-bit integers
849 1.2.2.2 christos */
850 1.2.2.2 christos bool_t
851 1.2.2.2 christos xdr_int64_t(XDR *xdrs, int64_t *llp)
852 1.2.2.2 christos {
853 1.2.2.2 christos u_long ul[2];
854 1.2.2.2 christos
855 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
856 1.2.2.2 christos _DIAGASSERT(llp != NULL);
857 1.2.2.2 christos
858 1.2.2.2 christos switch (xdrs->x_op) {
859 1.2.2.2 christos case XDR_ENCODE:
860 1.2.2.2 christos ul[0] = (u_long)(((uint64_t)*llp >> 32) &
861 1.2.2.2 christos (uint64_t)0xffffffffULL);
862 1.2.2.2 christos ul[1] = (u_long)(((uint64_t)*llp) &
863 1.2.2.2 christos (uint64_t)0xffffffffULL);
864 1.2.2.2 christos if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
865 1.2.2.2 christos return (FALSE);
866 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
867 1.2.2.2 christos case XDR_DECODE:
868 1.2.2.2 christos if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
869 1.2.2.2 christos return (FALSE);
870 1.2.2.2 christos if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
871 1.2.2.2 christos return (FALSE);
872 1.2.2.2 christos *llp = (int64_t)
873 1.2.2.2 christos (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
874 1.2.2.2 christos return (TRUE);
875 1.2.2.2 christos case XDR_FREE:
876 1.2.2.2 christos return (TRUE);
877 1.2.2.2 christos }
878 1.2.2.2 christos /* NOTREACHED */
879 1.2.2.2 christos return (FALSE);
880 1.2.2.2 christos }
881 1.2.2.2 christos
882 1.2.2.2 christos
883 1.2.2.2 christos /*
884 1.2.2.2 christos * XDR unsigned 64-bit integers
885 1.2.2.2 christos */
886 1.2.2.2 christos bool_t
887 1.2.2.2 christos xdr_u_int64_t(XDR *xdrs, u_int64_t *ullp)
888 1.2.2.2 christos {
889 1.2.2.2 christos u_long ul[2];
890 1.2.2.2 christos
891 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
892 1.2.2.2 christos _DIAGASSERT(ullp != NULL);
893 1.2.2.2 christos
894 1.2.2.2 christos switch (xdrs->x_op) {
895 1.2.2.2 christos case XDR_ENCODE:
896 1.2.2.2 christos ul[0] = (u_long)(*ullp >> 32) & 0xffffffffUL;
897 1.2.2.2 christos ul[1] = (u_long)(*ullp) & 0xffffffffUL;
898 1.2.2.2 christos if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
899 1.2.2.2 christos return (FALSE);
900 1.2.2.2 christos return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
901 1.2.2.2 christos case XDR_DECODE:
902 1.2.2.2 christos if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
903 1.2.2.2 christos return (FALSE);
904 1.2.2.2 christos if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
905 1.2.2.2 christos return (FALSE);
906 1.2.2.2 christos *ullp = (u_int64_t)
907 1.2.2.2 christos (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
908 1.2.2.2 christos return (TRUE);
909 1.2.2.2 christos case XDR_FREE:
910 1.2.2.2 christos return (TRUE);
911 1.2.2.2 christos }
912 1.2.2.2 christos /* NOTREACHED */
913 1.2.2.2 christos return (FALSE);
914 1.2.2.2 christos }
915 1.2.2.2 christos
916 1.2.2.2 christos
917 1.2.2.2 christos /*
918 1.2.2.2 christos * XDR hypers
919 1.2.2.2 christos */
920 1.2.2.2 christos bool_t
921 1.2.2.2 christos xdr_hyper(XDR *xdrs, longlong_t *llp)
922 1.2.2.2 christos {
923 1.2.2.2 christos
924 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
925 1.2.2.2 christos _DIAGASSERT(llp != NULL);
926 1.2.2.2 christos
927 1.2.2.2 christos /*
928 1.2.2.2 christos * Don't bother open-coding this; it's a fair amount of code. Just
929 1.2.2.2 christos * call xdr_int64_t().
930 1.2.2.2 christos */
931 1.2.2.2 christos return (xdr_int64_t(xdrs, (int64_t *)llp));
932 1.2.2.2 christos }
933 1.2.2.2 christos
934 1.2.2.2 christos
935 1.2.2.2 christos /*
936 1.2.2.2 christos * XDR unsigned hypers
937 1.2.2.2 christos */
938 1.2.2.2 christos bool_t
939 1.2.2.2 christos xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp)
940 1.2.2.2 christos {
941 1.2.2.2 christos
942 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
943 1.2.2.2 christos _DIAGASSERT(ullp != NULL);
944 1.2.2.2 christos
945 1.2.2.2 christos /*
946 1.2.2.2 christos * Don't bother open-coding this; it's a fair amount of code. Just
947 1.2.2.2 christos * call xdr_u_int64_t().
948 1.2.2.2 christos */
949 1.2.2.2 christos return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
950 1.2.2.2 christos }
951 1.2.2.2 christos
952 1.2.2.2 christos
953 1.2.2.2 christos /*
954 1.2.2.2 christos * XDR longlong_t's
955 1.2.2.2 christos */
956 1.2.2.2 christos bool_t
957 1.2.2.2 christos xdr_longlong_t(XDR *xdrs, longlong_t *llp)
958 1.2.2.2 christos {
959 1.2.2.2 christos
960 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
961 1.2.2.2 christos _DIAGASSERT(llp != NULL);
962 1.2.2.2 christos
963 1.2.2.2 christos /*
964 1.2.2.2 christos * Don't bother open-coding this; it's a fair amount of code. Just
965 1.2.2.2 christos * call xdr_int64_t().
966 1.2.2.2 christos */
967 1.2.2.2 christos return (xdr_int64_t(xdrs, (int64_t *)llp));
968 1.2.2.2 christos }
969 1.2.2.2 christos
970 1.2.2.2 christos
971 1.2.2.2 christos /*
972 1.2.2.2 christos * XDR u_longlong_t's
973 1.2.2.2 christos */
974 1.2.2.2 christos bool_t
975 1.2.2.2 christos xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp)
976 1.2.2.2 christos {
977 1.2.2.2 christos
978 1.2.2.2 christos _DIAGASSERT(xdrs != NULL);
979 1.2.2.2 christos _DIAGASSERT(ullp != NULL);
980 1.2.2.2 christos
981 1.2.2.2 christos /*
982 1.2.2.2 christos * Don't bother open-coding this; it's a fair amount of code. Just
983 1.2.2.2 christos * call xdr_u_int64_t().
984 1.2.2.2 christos */
985 1.2.2.2 christos return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
986 1.2.2.2 christos }
987