xref: /freebsd/lib/libc/xdr/xdr.c (revision d660d38da5187a02403e342d7290ccedfff05d83)
18360efbdSAlfred Perlstein /*	$NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $	*/
28360efbdSAlfred Perlstein 
3a204967aSHiroki Sato /*-
4a204967aSHiroki Sato  * Copyright (c) 2010, Oracle America, Inc.
5eae561b3SGarrett Wollman  *
6a204967aSHiroki Sato  * Redistribution and use in source and binary forms, with or without
7a204967aSHiroki Sato  * modification, are permitted provided that the following conditions are
8a204967aSHiroki Sato  * met:
9eae561b3SGarrett Wollman  *
10a204967aSHiroki Sato  *     * Redistributions of source code must retain the above copyright
11a204967aSHiroki Sato  *       notice, this list of conditions and the following disclaimer.
12a204967aSHiroki Sato  *     * Redistributions in binary form must reproduce the above
13a204967aSHiroki Sato  *       copyright notice, this list of conditions and the following
14a204967aSHiroki Sato  *       disclaimer in the documentation and/or other materials
15a204967aSHiroki Sato  *       provided with the distribution.
16a204967aSHiroki Sato  *     * Neither the name of the "Oracle America, Inc." nor the names of its
17a204967aSHiroki Sato  *       contributors may be used to endorse or promote products derived
18a204967aSHiroki Sato  *       from this software without specific prior written permission.
19eae561b3SGarrett Wollman  *
20a204967aSHiroki Sato  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21a204967aSHiroki Sato  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22a204967aSHiroki Sato  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23a204967aSHiroki Sato  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24a204967aSHiroki Sato  *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25a204967aSHiroki Sato  *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26a204967aSHiroki Sato  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27a204967aSHiroki Sato  *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28a204967aSHiroki Sato  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29a204967aSHiroki Sato  *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30a204967aSHiroki Sato  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31a204967aSHiroki Sato  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32eae561b3SGarrett Wollman  */
33eae561b3SGarrett Wollman 
34eae561b3SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint)
35a9bdcd37SDavid E. O'Brien static char *sccsid2 = "@(#)xdr.c 1.35 87/08/12";
36333fc21eSDavid E. O'Brien static char *sccsid = "@(#)xdr.c	2.1 88/07/29 4.0 RPCSRC";
37eae561b3SGarrett Wollman #endif
38333fc21eSDavid E. O'Brien #include <sys/cdefs.h>
39333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$");
40eae561b3SGarrett Wollman 
41eae561b3SGarrett Wollman /*
42eae561b3SGarrett Wollman  * xdr.c, Generic XDR routines implementation.
43eae561b3SGarrett Wollman  *
44eae561b3SGarrett Wollman  * These are the "generic" xdr routines used to serialize and de-serialize
45eae561b3SGarrett Wollman  * most common data items.  See xdr.h for more info on the interface to
46eae561b3SGarrett Wollman  * xdr.
47eae561b3SGarrett Wollman  */
48eae561b3SGarrett Wollman 
498360efbdSAlfred Perlstein #include "namespace.h"
508360efbdSAlfred Perlstein #include <err.h>
51eae561b3SGarrett Wollman #include <stdio.h>
5229285d6cSPoul-Henning Kamp #include <stdlib.h>
531ad08a09SPeter Wemm #include <string.h>
54eae561b3SGarrett Wollman 
55eae561b3SGarrett Wollman #include <rpc/types.h>
56eae561b3SGarrett Wollman #include <rpc/xdr.h>
578360efbdSAlfred Perlstein #include "un-namespace.h"
588360efbdSAlfred Perlstein 
598360efbdSAlfred Perlstein typedef quad_t          longlong_t;     /* ANSI long long type */
608360efbdSAlfred Perlstein typedef u_quad_t        u_longlong_t;   /* ANSI unsigned long long type */
61eae561b3SGarrett Wollman 
62eae561b3SGarrett Wollman /*
63eae561b3SGarrett Wollman  * constants specific to the xdr "protocol"
64eae561b3SGarrett Wollman  */
65eae561b3SGarrett Wollman #define XDR_FALSE	((long) 0)
66eae561b3SGarrett Wollman #define XDR_TRUE	((long) 1)
67eae561b3SGarrett Wollman #define LASTUNSIGNED	((u_int) 0-1)
68eae561b3SGarrett Wollman 
69eae561b3SGarrett Wollman /*
70eae561b3SGarrett Wollman  * for unit alignment
71eae561b3SGarrett Wollman  */
728360efbdSAlfred Perlstein static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
73eae561b3SGarrett Wollman 
74eae561b3SGarrett Wollman /*
75eae561b3SGarrett Wollman  * Free a data structure using XDR
76eae561b3SGarrett Wollman  * Not a filter, but a convenient utility nonetheless
77eae561b3SGarrett Wollman  */
78eae561b3SGarrett Wollman void
79*d660d38dSCraig Rodrigues xdr_free(xdrproc_t proc, void *objp)
80eae561b3SGarrett Wollman {
81eae561b3SGarrett Wollman 	XDR x;
82eae561b3SGarrett Wollman 
83eae561b3SGarrett Wollman 	x.x_op = XDR_FREE;
84eae561b3SGarrett Wollman 	(*proc)(&x, objp);
85eae561b3SGarrett Wollman }
86eae561b3SGarrett Wollman 
87eae561b3SGarrett Wollman /*
88eae561b3SGarrett Wollman  * XDR nothing
89eae561b3SGarrett Wollman  */
90eae561b3SGarrett Wollman bool_t
91f249dbccSDag-Erling Smørgrav xdr_void(void)
92eae561b3SGarrett Wollman {
93eae561b3SGarrett Wollman 
94eae561b3SGarrett Wollman 	return (TRUE);
95eae561b3SGarrett Wollman }
96eae561b3SGarrett Wollman 
971ad08a09SPeter Wemm 
98eae561b3SGarrett Wollman /*
99eae561b3SGarrett Wollman  * XDR integers
100eae561b3SGarrett Wollman  */
101eae561b3SGarrett Wollman bool_t
102*d660d38dSCraig Rodrigues xdr_int(XDR *xdrs, int *ip)
103eae561b3SGarrett Wollman {
1041ad08a09SPeter Wemm 	long l;
105eae561b3SGarrett Wollman 
1061ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1071ad08a09SPeter Wemm 
1081ad08a09SPeter Wemm 	case XDR_ENCODE:
1091ad08a09SPeter Wemm 		l = (long) *ip;
1101ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, &l));
1111ad08a09SPeter Wemm 
1121ad08a09SPeter Wemm 	case XDR_DECODE:
1131ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, &l)) {
1141ad08a09SPeter Wemm 			return (FALSE);
115eae561b3SGarrett Wollman 		}
1161ad08a09SPeter Wemm 		*ip = (int) l;
1171ad08a09SPeter Wemm 		return (TRUE);
1181ad08a09SPeter Wemm 
1191ad08a09SPeter Wemm 	case XDR_FREE:
1201ad08a09SPeter Wemm 		return (TRUE);
1211ad08a09SPeter Wemm 	}
1228360efbdSAlfred Perlstein 	/* NOTREACHED */
1231ad08a09SPeter Wemm 	return (FALSE);
124eae561b3SGarrett Wollman }
125eae561b3SGarrett Wollman 
126eae561b3SGarrett Wollman /*
127eae561b3SGarrett Wollman  * XDR unsigned integers
128eae561b3SGarrett Wollman  */
129eae561b3SGarrett Wollman bool_t
130*d660d38dSCraig Rodrigues xdr_u_int(XDR *xdrs, u_int *up)
131eae561b3SGarrett Wollman {
1321ad08a09SPeter Wemm 	u_long l;
133eae561b3SGarrett Wollman 
1341ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1351ad08a09SPeter Wemm 
1361ad08a09SPeter Wemm 	case XDR_ENCODE:
1371ad08a09SPeter Wemm 		l = (u_long) *up;
1381ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
1391ad08a09SPeter Wemm 
1401ad08a09SPeter Wemm 	case XDR_DECODE:
1411ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
1421ad08a09SPeter Wemm 			return (FALSE);
143eae561b3SGarrett Wollman 		}
1441ad08a09SPeter Wemm 		*up = (u_int) l;
1451ad08a09SPeter Wemm 		return (TRUE);
1461ad08a09SPeter Wemm 
1471ad08a09SPeter Wemm 	case XDR_FREE:
1481ad08a09SPeter Wemm 		return (TRUE);
149eae561b3SGarrett Wollman 	}
1508360efbdSAlfred Perlstein 	/* NOTREACHED */
1511ad08a09SPeter Wemm 	return (FALSE);
1521ad08a09SPeter Wemm }
1531ad08a09SPeter Wemm 
154eae561b3SGarrett Wollman 
155eae561b3SGarrett Wollman /*
156eae561b3SGarrett Wollman  * XDR long integers
157eae561b3SGarrett Wollman  * same as xdr_u_long - open coded to save a proc call!
158eae561b3SGarrett Wollman  */
159eae561b3SGarrett Wollman bool_t
160*d660d38dSCraig Rodrigues xdr_long(XDR *xdrs, long *lp)
161eae561b3SGarrett Wollman {
1621ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1631ad08a09SPeter Wemm 	case XDR_ENCODE:
164eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, lp));
1651ad08a09SPeter Wemm 	case XDR_DECODE:
166eae561b3SGarrett Wollman 		return (XDR_GETLONG(xdrs, lp));
1671ad08a09SPeter Wemm 	case XDR_FREE:
168eae561b3SGarrett Wollman 		return (TRUE);
1691ad08a09SPeter Wemm 	}
1708360efbdSAlfred Perlstein 	/* NOTREACHED */
171eae561b3SGarrett Wollman 	return (FALSE);
172eae561b3SGarrett Wollman }
173eae561b3SGarrett Wollman 
174eae561b3SGarrett Wollman /*
175eae561b3SGarrett Wollman  * XDR unsigned long integers
176eae561b3SGarrett Wollman  * same as xdr_long - open coded to save a proc call!
177eae561b3SGarrett Wollman  */
178eae561b3SGarrett Wollman bool_t
179*d660d38dSCraig Rodrigues xdr_u_long(XDR *xdrs, u_long *ulp)
180eae561b3SGarrett Wollman {
1811ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1821ad08a09SPeter Wemm 	case XDR_ENCODE:
183eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, (long *)ulp));
1841ad08a09SPeter Wemm 	case XDR_DECODE:
1851ad08a09SPeter Wemm 		return (XDR_GETLONG(xdrs, (long *)ulp));
1861ad08a09SPeter Wemm 	case XDR_FREE:
187eae561b3SGarrett Wollman 		return (TRUE);
1881ad08a09SPeter Wemm 	}
1898360efbdSAlfred Perlstein 	/* NOTREACHED */
190eae561b3SGarrett Wollman 	return (FALSE);
191eae561b3SGarrett Wollman }
192eae561b3SGarrett Wollman 
1931ad08a09SPeter Wemm 
1941ad08a09SPeter Wemm /*
1951ad08a09SPeter Wemm  * XDR 32-bit integers
1961ad08a09SPeter Wemm  * same as xdr_u_int32_t - open coded to save a proc call!
1971ad08a09SPeter Wemm  */
1981ad08a09SPeter Wemm bool_t
199*d660d38dSCraig Rodrigues xdr_int32_t(XDR *xdrs, int32_t *int32_p)
2001ad08a09SPeter Wemm {
2011ad08a09SPeter Wemm 	long l;
2021ad08a09SPeter Wemm 
2031ad08a09SPeter Wemm 	switch (xdrs->x_op) {
2041ad08a09SPeter Wemm 
2051ad08a09SPeter Wemm 	case XDR_ENCODE:
2061ad08a09SPeter Wemm 		l = (long) *int32_p;
2071ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, &l));
2081ad08a09SPeter Wemm 
2091ad08a09SPeter Wemm 	case XDR_DECODE:
2101ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, &l)) {
2111ad08a09SPeter Wemm 			return (FALSE);
2121ad08a09SPeter Wemm 		}
2131ad08a09SPeter Wemm 		*int32_p = (int32_t) l;
2141ad08a09SPeter Wemm 		return (TRUE);
2151ad08a09SPeter Wemm 
2161ad08a09SPeter Wemm 	case XDR_FREE:
2171ad08a09SPeter Wemm 		return (TRUE);
2181ad08a09SPeter Wemm 	}
2198360efbdSAlfred Perlstein 	/* NOTREACHED */
2201ad08a09SPeter Wemm 	return (FALSE);
2211ad08a09SPeter Wemm }
2221ad08a09SPeter Wemm 
2231ad08a09SPeter Wemm /*
2241ad08a09SPeter Wemm  * XDR unsigned 32-bit integers
2251ad08a09SPeter Wemm  * same as xdr_int32_t - open coded to save a proc call!
2261ad08a09SPeter Wemm  */
2271ad08a09SPeter Wemm bool_t
228*d660d38dSCraig Rodrigues xdr_u_int32_t(XDR *xdrs, u_int32_t *u_int32_p)
2291ad08a09SPeter Wemm {
2301ad08a09SPeter Wemm 	u_long l;
2311ad08a09SPeter Wemm 
2321ad08a09SPeter Wemm 	switch (xdrs->x_op) {
2331ad08a09SPeter Wemm 
2341ad08a09SPeter Wemm 	case XDR_ENCODE:
2351ad08a09SPeter Wemm 		l = (u_long) *u_int32_p;
2361ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
2371ad08a09SPeter Wemm 
2381ad08a09SPeter Wemm 	case XDR_DECODE:
2391ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
2401ad08a09SPeter Wemm 			return (FALSE);
2411ad08a09SPeter Wemm 		}
2421ad08a09SPeter Wemm 		*u_int32_p = (u_int32_t) l;
2431ad08a09SPeter Wemm 		return (TRUE);
2441ad08a09SPeter Wemm 
2451ad08a09SPeter Wemm 	case XDR_FREE:
2461ad08a09SPeter Wemm 		return (TRUE);
2471ad08a09SPeter Wemm 	}
2488360efbdSAlfred Perlstein 	/* NOTREACHED */
249c304ad8aSDavid E. O'Brien 	return (FALSE);
250c304ad8aSDavid E. O'Brien }
251c304ad8aSDavid E. O'Brien 
252a9148abdSDoug Rabson /*
253a9148abdSDoug Rabson  * XDR unsigned 32-bit integers
254a9148abdSDoug Rabson  * same as xdr_int32_t - open coded to save a proc call!
255a9148abdSDoug Rabson  */
256a9148abdSDoug Rabson bool_t
257*d660d38dSCraig Rodrigues xdr_uint32_t(XDR *xdrs, uint32_t *u_int32_p)
258a9148abdSDoug Rabson {
259a9148abdSDoug Rabson 	u_long l;
260a9148abdSDoug Rabson 
261a9148abdSDoug Rabson 	switch (xdrs->x_op) {
262a9148abdSDoug Rabson 
263a9148abdSDoug Rabson 	case XDR_ENCODE:
264a9148abdSDoug Rabson 		l = (u_long) *u_int32_p;
265a9148abdSDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
266a9148abdSDoug Rabson 
267a9148abdSDoug Rabson 	case XDR_DECODE:
268a9148abdSDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
269a9148abdSDoug Rabson 			return (FALSE);
270a9148abdSDoug Rabson 		}
271a9148abdSDoug Rabson 		*u_int32_p = (u_int32_t) l;
272a9148abdSDoug Rabson 		return (TRUE);
273a9148abdSDoug Rabson 
274a9148abdSDoug Rabson 	case XDR_FREE:
275a9148abdSDoug Rabson 		return (TRUE);
276a9148abdSDoug Rabson 	}
277a9148abdSDoug Rabson 	/* NOTREACHED */
278a9148abdSDoug Rabson 	return (FALSE);
279a9148abdSDoug Rabson }
2801ad08a09SPeter Wemm 
281eae561b3SGarrett Wollman /*
282eae561b3SGarrett Wollman  * XDR short integers
283eae561b3SGarrett Wollman  */
284eae561b3SGarrett Wollman bool_t
285*d660d38dSCraig Rodrigues xdr_short(XDR *xdrs, short *sp)
286eae561b3SGarrett Wollman {
287eae561b3SGarrett Wollman 	long l;
288eae561b3SGarrett Wollman 
289eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
290eae561b3SGarrett Wollman 
291eae561b3SGarrett Wollman 	case XDR_ENCODE:
292eae561b3SGarrett Wollman 		l = (long) *sp;
293eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &l));
294eae561b3SGarrett Wollman 
295eae561b3SGarrett Wollman 	case XDR_DECODE:
296eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &l)) {
297eae561b3SGarrett Wollman 			return (FALSE);
298eae561b3SGarrett Wollman 		}
299eae561b3SGarrett Wollman 		*sp = (short) l;
300eae561b3SGarrett Wollman 		return (TRUE);
301eae561b3SGarrett Wollman 
302eae561b3SGarrett Wollman 	case XDR_FREE:
303eae561b3SGarrett Wollman 		return (TRUE);
304eae561b3SGarrett Wollman 	}
3058360efbdSAlfred Perlstein 	/* NOTREACHED */
306eae561b3SGarrett Wollman 	return (FALSE);
307eae561b3SGarrett Wollman }
308eae561b3SGarrett Wollman 
309eae561b3SGarrett Wollman /*
310eae561b3SGarrett Wollman  * XDR unsigned short integers
311eae561b3SGarrett Wollman  */
312eae561b3SGarrett Wollman bool_t
313*d660d38dSCraig Rodrigues xdr_u_short(XDR *xdrs, u_short *usp)
314eae561b3SGarrett Wollman {
315eae561b3SGarrett Wollman 	u_long l;
316eae561b3SGarrett Wollman 
317eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
318eae561b3SGarrett Wollman 
319eae561b3SGarrett Wollman 	case XDR_ENCODE:
320eae561b3SGarrett Wollman 		l = (u_long) *usp;
3211ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
3221ad08a09SPeter Wemm 
3231ad08a09SPeter Wemm 	case XDR_DECODE:
3241ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
3251ad08a09SPeter Wemm 			return (FALSE);
3261ad08a09SPeter Wemm 		}
3271ad08a09SPeter Wemm 		*usp = (u_short) l;
3281ad08a09SPeter Wemm 		return (TRUE);
3291ad08a09SPeter Wemm 
3301ad08a09SPeter Wemm 	case XDR_FREE:
3311ad08a09SPeter Wemm 		return (TRUE);
3321ad08a09SPeter Wemm 	}
3338360efbdSAlfred Perlstein 	/* NOTREACHED */
3341ad08a09SPeter Wemm 	return (FALSE);
3351ad08a09SPeter Wemm }
3361ad08a09SPeter Wemm 
3371ad08a09SPeter Wemm 
3381ad08a09SPeter Wemm /*
3391ad08a09SPeter Wemm  * XDR 16-bit integers
3401ad08a09SPeter Wemm  */
3411ad08a09SPeter Wemm bool_t
342*d660d38dSCraig Rodrigues xdr_int16_t(XDR *xdrs, int16_t *int16_p)
3431ad08a09SPeter Wemm {
3441ad08a09SPeter Wemm 	long l;
3451ad08a09SPeter Wemm 
3461ad08a09SPeter Wemm 	switch (xdrs->x_op) {
3471ad08a09SPeter Wemm 
3481ad08a09SPeter Wemm 	case XDR_ENCODE:
3491ad08a09SPeter Wemm 		l = (long) *int16_p;
350eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &l));
351eae561b3SGarrett Wollman 
352eae561b3SGarrett Wollman 	case XDR_DECODE:
353eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &l)) {
354eae561b3SGarrett Wollman 			return (FALSE);
355eae561b3SGarrett Wollman 		}
3561ad08a09SPeter Wemm 		*int16_p = (int16_t) l;
3571ad08a09SPeter Wemm 		return (TRUE);
3581ad08a09SPeter Wemm 
3591ad08a09SPeter Wemm 	case XDR_FREE:
3601ad08a09SPeter Wemm 		return (TRUE);
3611ad08a09SPeter Wemm 	}
3628360efbdSAlfred Perlstein 	/* NOTREACHED */
3631ad08a09SPeter Wemm 	return (FALSE);
3641ad08a09SPeter Wemm }
3651ad08a09SPeter Wemm 
3661ad08a09SPeter Wemm /*
3671ad08a09SPeter Wemm  * XDR unsigned 16-bit integers
3681ad08a09SPeter Wemm  */
3691ad08a09SPeter Wemm bool_t
370*d660d38dSCraig Rodrigues xdr_u_int16_t(XDR *xdrs, u_int16_t *u_int16_p)
3711ad08a09SPeter Wemm {
3721ad08a09SPeter Wemm 	u_long l;
3731ad08a09SPeter Wemm 
3741ad08a09SPeter Wemm 	switch (xdrs->x_op) {
3751ad08a09SPeter Wemm 
3761ad08a09SPeter Wemm 	case XDR_ENCODE:
3771ad08a09SPeter Wemm 		l = (u_long) *u_int16_p;
3781ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
3791ad08a09SPeter Wemm 
3801ad08a09SPeter Wemm 	case XDR_DECODE:
3811ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
3821ad08a09SPeter Wemm 			return (FALSE);
3831ad08a09SPeter Wemm 		}
3841ad08a09SPeter Wemm 		*u_int16_p = (u_int16_t) l;
385eae561b3SGarrett Wollman 		return (TRUE);
386eae561b3SGarrett Wollman 
387eae561b3SGarrett Wollman 	case XDR_FREE:
388eae561b3SGarrett Wollman 		return (TRUE);
389eae561b3SGarrett Wollman 	}
3908360efbdSAlfred Perlstein 	/* NOTREACHED */
391eae561b3SGarrett Wollman 	return (FALSE);
392eae561b3SGarrett Wollman }
393eae561b3SGarrett Wollman 
394a9148abdSDoug Rabson /*
395a9148abdSDoug Rabson  * XDR unsigned 16-bit integers
396a9148abdSDoug Rabson  */
397a9148abdSDoug Rabson bool_t
398*d660d38dSCraig Rodrigues xdr_uint16_t(XDR *xdrs, uint16_t *u_int16_p)
399a9148abdSDoug Rabson {
400a9148abdSDoug Rabson 	u_long l;
401a9148abdSDoug Rabson 
402a9148abdSDoug Rabson 	switch (xdrs->x_op) {
403a9148abdSDoug Rabson 
404a9148abdSDoug Rabson 	case XDR_ENCODE:
405a9148abdSDoug Rabson 		l = (u_long) *u_int16_p;
406a9148abdSDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
407a9148abdSDoug Rabson 
408a9148abdSDoug Rabson 	case XDR_DECODE:
409a9148abdSDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
410a9148abdSDoug Rabson 			return (FALSE);
411a9148abdSDoug Rabson 		}
412a9148abdSDoug Rabson 		*u_int16_p = (u_int16_t) l;
413a9148abdSDoug Rabson 		return (TRUE);
414a9148abdSDoug Rabson 
415a9148abdSDoug Rabson 	case XDR_FREE:
416a9148abdSDoug Rabson 		return (TRUE);
417a9148abdSDoug Rabson 	}
418a9148abdSDoug Rabson 	/* NOTREACHED */
419a9148abdSDoug Rabson 	return (FALSE);
420a9148abdSDoug Rabson }
421a9148abdSDoug Rabson 
422eae561b3SGarrett Wollman 
423eae561b3SGarrett Wollman /*
424eae561b3SGarrett Wollman  * XDR a char
425eae561b3SGarrett Wollman  */
426eae561b3SGarrett Wollman bool_t
427*d660d38dSCraig Rodrigues xdr_char(XDR *xdrs, char *cp)
428eae561b3SGarrett Wollman {
429eae561b3SGarrett Wollman 	int i;
430eae561b3SGarrett Wollman 
431eae561b3SGarrett Wollman 	i = (*cp);
432eae561b3SGarrett Wollman 	if (!xdr_int(xdrs, &i)) {
433eae561b3SGarrett Wollman 		return (FALSE);
434eae561b3SGarrett Wollman 	}
435eae561b3SGarrett Wollman 	*cp = i;
436eae561b3SGarrett Wollman 	return (TRUE);
437eae561b3SGarrett Wollman }
438eae561b3SGarrett Wollman 
439eae561b3SGarrett Wollman /*
440eae561b3SGarrett Wollman  * XDR an unsigned char
441eae561b3SGarrett Wollman  */
442eae561b3SGarrett Wollman bool_t
443*d660d38dSCraig Rodrigues xdr_u_char(XDR *xdrs, u_char *cp)
444eae561b3SGarrett Wollman {
445eae561b3SGarrett Wollman 	u_int u;
446eae561b3SGarrett Wollman 
447eae561b3SGarrett Wollman 	u = (*cp);
448eae561b3SGarrett Wollman 	if (!xdr_u_int(xdrs, &u)) {
449eae561b3SGarrett Wollman 		return (FALSE);
450eae561b3SGarrett Wollman 	}
451eae561b3SGarrett Wollman 	*cp = u;
452eae561b3SGarrett Wollman 	return (TRUE);
453eae561b3SGarrett Wollman }
454eae561b3SGarrett Wollman 
455eae561b3SGarrett Wollman /*
456eae561b3SGarrett Wollman  * XDR booleans
457eae561b3SGarrett Wollman  */
458eae561b3SGarrett Wollman bool_t
459*d660d38dSCraig Rodrigues xdr_bool(XDR *xdrs, bool_t *bp)
460eae561b3SGarrett Wollman {
461eae561b3SGarrett Wollman 	long lb;
462eae561b3SGarrett Wollman 
463eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
464eae561b3SGarrett Wollman 
465eae561b3SGarrett Wollman 	case XDR_ENCODE:
466eae561b3SGarrett Wollman 		lb = *bp ? XDR_TRUE : XDR_FALSE;
467eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &lb));
468eae561b3SGarrett Wollman 
469eae561b3SGarrett Wollman 	case XDR_DECODE:
470eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &lb)) {
471eae561b3SGarrett Wollman 			return (FALSE);
472eae561b3SGarrett Wollman 		}
473eae561b3SGarrett Wollman 		*bp = (lb == XDR_FALSE) ? FALSE : TRUE;
474eae561b3SGarrett Wollman 		return (TRUE);
475eae561b3SGarrett Wollman 
476eae561b3SGarrett Wollman 	case XDR_FREE:
477eae561b3SGarrett Wollman 		return (TRUE);
478eae561b3SGarrett Wollman 	}
4798360efbdSAlfred Perlstein 	/* NOTREACHED */
480eae561b3SGarrett Wollman 	return (FALSE);
481eae561b3SGarrett Wollman }
482eae561b3SGarrett Wollman 
483eae561b3SGarrett Wollman /*
484eae561b3SGarrett Wollman  * XDR enumerations
485eae561b3SGarrett Wollman  */
486eae561b3SGarrett Wollman bool_t
487*d660d38dSCraig Rodrigues xdr_enum(XDR *xdrs, enum_t *ep)
488eae561b3SGarrett Wollman {
489eae561b3SGarrett Wollman 	enum sizecheck { SIZEVAL };	/* used to find the size of an enum */
490eae561b3SGarrett Wollman 
491eae561b3SGarrett Wollman 	/*
492eae561b3SGarrett Wollman 	 * enums are treated as ints
493eae561b3SGarrett Wollman 	 */
4948360efbdSAlfred Perlstein 	/* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) {
4958360efbdSAlfred Perlstein 		return (xdr_long(xdrs, (long *)(void *)ep));
4968360efbdSAlfred Perlstein 	} else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) {
4978360efbdSAlfred Perlstein 		return (xdr_int(xdrs, (int *)(void *)ep));
4988360efbdSAlfred Perlstein 	} else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) {
4998360efbdSAlfred Perlstein 		return (xdr_short(xdrs, (short *)(void *)ep));
500eae561b3SGarrett Wollman 	} else {
501eae561b3SGarrett Wollman 		return (FALSE);
502eae561b3SGarrett Wollman 	}
503eae561b3SGarrett Wollman }
504eae561b3SGarrett Wollman 
505eae561b3SGarrett Wollman /*
506eae561b3SGarrett Wollman  * XDR opaque data
507eae561b3SGarrett Wollman  * Allows the specification of a fixed size sequence of opaque bytes.
508eae561b3SGarrett Wollman  * cp points to the opaque object and cnt gives the byte length.
509eae561b3SGarrett Wollman  */
510eae561b3SGarrett Wollman bool_t
511*d660d38dSCraig Rodrigues xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt)
512eae561b3SGarrett Wollman {
5138360efbdSAlfred Perlstein 	u_int rndup;
5148360efbdSAlfred Perlstein 	static int crud[BYTES_PER_XDR_UNIT];
515eae561b3SGarrett Wollman 
516eae561b3SGarrett Wollman 	/*
517eae561b3SGarrett Wollman 	 * if no data we are done
518eae561b3SGarrett Wollman 	 */
519eae561b3SGarrett Wollman 	if (cnt == 0)
520eae561b3SGarrett Wollman 		return (TRUE);
521eae561b3SGarrett Wollman 
522eae561b3SGarrett Wollman 	/*
523eae561b3SGarrett Wollman 	 * round byte count to full xdr units
524eae561b3SGarrett Wollman 	 */
525eae561b3SGarrett Wollman 	rndup = cnt % BYTES_PER_XDR_UNIT;
526eae561b3SGarrett Wollman 	if (rndup > 0)
527eae561b3SGarrett Wollman 		rndup = BYTES_PER_XDR_UNIT - rndup;
528eae561b3SGarrett Wollman 
529eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_DECODE) {
530eae561b3SGarrett Wollman 		if (!XDR_GETBYTES(xdrs, cp, cnt)) {
531eae561b3SGarrett Wollman 			return (FALSE);
532eae561b3SGarrett Wollman 		}
533eae561b3SGarrett Wollman 		if (rndup == 0)
534eae561b3SGarrett Wollman 			return (TRUE);
5358360efbdSAlfred Perlstein 		return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup));
536eae561b3SGarrett Wollman 	}
537eae561b3SGarrett Wollman 
538eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_ENCODE) {
539eae561b3SGarrett Wollman 		if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
540eae561b3SGarrett Wollman 			return (FALSE);
541eae561b3SGarrett Wollman 		}
542eae561b3SGarrett Wollman 		if (rndup == 0)
543eae561b3SGarrett Wollman 			return (TRUE);
544eae561b3SGarrett Wollman 		return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
545eae561b3SGarrett Wollman 	}
546eae561b3SGarrett Wollman 
547eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_FREE) {
548eae561b3SGarrett Wollman 		return (TRUE);
549eae561b3SGarrett Wollman 	}
550eae561b3SGarrett Wollman 
551eae561b3SGarrett Wollman 	return (FALSE);
552eae561b3SGarrett Wollman }
553eae561b3SGarrett Wollman 
554eae561b3SGarrett Wollman /*
555eae561b3SGarrett Wollman  * XDR counted bytes
556eae561b3SGarrett Wollman  * *cpp is a pointer to the bytes, *sizep is the count.
557eae561b3SGarrett Wollman  * If *cpp is NULL maxsize bytes are allocated
558eae561b3SGarrett Wollman  */
559eae561b3SGarrett Wollman bool_t
560*d660d38dSCraig Rodrigues xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
561eae561b3SGarrett Wollman {
5628360efbdSAlfred Perlstein 	char *sp = *cpp;  /* sp is the actual string pointer */
5638360efbdSAlfred Perlstein 	u_int nodesize;
564eae561b3SGarrett Wollman 
565eae561b3SGarrett Wollman 	/*
566eae561b3SGarrett Wollman 	 * first deal with the length since xdr bytes are counted
567eae561b3SGarrett Wollman 	 */
568eae561b3SGarrett Wollman 	if (! xdr_u_int(xdrs, sizep)) {
569eae561b3SGarrett Wollman 		return (FALSE);
570eae561b3SGarrett Wollman 	}
571eae561b3SGarrett Wollman 	nodesize = *sizep;
572eae561b3SGarrett Wollman 	if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
573eae561b3SGarrett Wollman 		return (FALSE);
574eae561b3SGarrett Wollman 	}
575eae561b3SGarrett Wollman 
576eae561b3SGarrett Wollman 	/*
577eae561b3SGarrett Wollman 	 * now deal with the actual bytes
578eae561b3SGarrett Wollman 	 */
579eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
580eae561b3SGarrett Wollman 
581eae561b3SGarrett Wollman 	case XDR_DECODE:
582eae561b3SGarrett Wollman 		if (nodesize == 0) {
583eae561b3SGarrett Wollman 			return (TRUE);
584eae561b3SGarrett Wollman 		}
585eae561b3SGarrett Wollman 		if (sp == NULL) {
5868360efbdSAlfred Perlstein 			*cpp = sp = mem_alloc(nodesize);
587eae561b3SGarrett Wollman 		}
588eae561b3SGarrett Wollman 		if (sp == NULL) {
5898360efbdSAlfred Perlstein 			warnx("xdr_bytes: out of memory");
590eae561b3SGarrett Wollman 			return (FALSE);
591eae561b3SGarrett Wollman 		}
5928360efbdSAlfred Perlstein 		/* FALLTHROUGH */
593eae561b3SGarrett Wollman 
594eae561b3SGarrett Wollman 	case XDR_ENCODE:
595eae561b3SGarrett Wollman 		return (xdr_opaque(xdrs, sp, nodesize));
596eae561b3SGarrett Wollman 
597eae561b3SGarrett Wollman 	case XDR_FREE:
598eae561b3SGarrett Wollman 		if (sp != NULL) {
599eae561b3SGarrett Wollman 			mem_free(sp, nodesize);
600eae561b3SGarrett Wollman 			*cpp = NULL;
601eae561b3SGarrett Wollman 		}
602eae561b3SGarrett Wollman 		return (TRUE);
603eae561b3SGarrett Wollman 	}
6048360efbdSAlfred Perlstein 	/* NOTREACHED */
605eae561b3SGarrett Wollman 	return (FALSE);
606eae561b3SGarrett Wollman }
607eae561b3SGarrett Wollman 
608eae561b3SGarrett Wollman /*
609eae561b3SGarrett Wollman  * Implemented here due to commonality of the object.
610eae561b3SGarrett Wollman  */
611eae561b3SGarrett Wollman bool_t
612*d660d38dSCraig Rodrigues xdr_netobj(XDR *xdrs, struct netobj *np)
613eae561b3SGarrett Wollman {
614eae561b3SGarrett Wollman 
615eae561b3SGarrett Wollman 	return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
616eae561b3SGarrett Wollman }
617eae561b3SGarrett Wollman 
618eae561b3SGarrett Wollman /*
619eae561b3SGarrett Wollman  * XDR a descriminated union
620eae561b3SGarrett Wollman  * Support routine for discriminated unions.
621eae561b3SGarrett Wollman  * You create an array of xdrdiscrim structures, terminated with
622eae561b3SGarrett Wollman  * an entry with a null procedure pointer.  The routine gets
623eae561b3SGarrett Wollman  * the discriminant value and then searches the array of xdrdiscrims
624eae561b3SGarrett Wollman  * looking for that value.  It calls the procedure given in the xdrdiscrim
625eae561b3SGarrett Wollman  * to handle the discriminant.  If there is no specific routine a default
626eae561b3SGarrett Wollman  * routine may be called.
627eae561b3SGarrett Wollman  * If there is no specific or default routine an error is returned.
628eae561b3SGarrett Wollman  */
629eae561b3SGarrett Wollman bool_t
630*d660d38dSCraig Rodrigues xdr_union(XDR *xdrs, enum_t *dscmp, char *unp, const struct xdr_discrim *choices, xdrproc_t dfault)
631*d660d38dSCraig Rodrigues /*
632*d660d38dSCraig Rodrigues  *	XDR *xdrs;
633*d660d38dSCraig Rodrigues  *	enum_t *dscmp;		// enum to decide which arm to work on
634*d660d38dSCraig Rodrigues  *	char *unp;		// the union itself
635*d660d38dSCraig Rodrigues  *	const struct xdr_discrim *choices;	// [value, xdr proc] for each arm
636*d660d38dSCraig Rodrigues  *	xdrproc_t dfault;	// default xdr routine
637*d660d38dSCraig Rodrigues  */
638eae561b3SGarrett Wollman {
6398360efbdSAlfred Perlstein 	enum_t dscm;
640eae561b3SGarrett Wollman 
641eae561b3SGarrett Wollman 	/*
642eae561b3SGarrett Wollman 	 * we deal with the discriminator;  it's an enum
643eae561b3SGarrett Wollman 	 */
644eae561b3SGarrett Wollman 	if (! xdr_enum(xdrs, dscmp)) {
645eae561b3SGarrett Wollman 		return (FALSE);
646eae561b3SGarrett Wollman 	}
647eae561b3SGarrett Wollman 	dscm = *dscmp;
648eae561b3SGarrett Wollman 
649eae561b3SGarrett Wollman 	/*
650eae561b3SGarrett Wollman 	 * search choices for a value that matches the discriminator.
651eae561b3SGarrett Wollman 	 * if we find one, execute the xdr routine for that value.
652eae561b3SGarrett Wollman 	 */
653eae561b3SGarrett Wollman 	for (; choices->proc != NULL_xdrproc_t; choices++) {
654eae561b3SGarrett Wollman 		if (choices->value == dscm)
6558360efbdSAlfred Perlstein 			return ((*(choices->proc))(xdrs, unp));
656eae561b3SGarrett Wollman 	}
657eae561b3SGarrett Wollman 
658eae561b3SGarrett Wollman 	/*
659eae561b3SGarrett Wollman 	 * no match - execute the default xdr routine if there is one
660eae561b3SGarrett Wollman 	 */
661eae561b3SGarrett Wollman 	return ((dfault == NULL_xdrproc_t) ? FALSE :
6628360efbdSAlfred Perlstein 	    (*dfault)(xdrs, unp));
663eae561b3SGarrett Wollman }
664eae561b3SGarrett Wollman 
665eae561b3SGarrett Wollman 
666eae561b3SGarrett Wollman /*
667eae561b3SGarrett Wollman  * Non-portable xdr primitives.
668eae561b3SGarrett Wollman  * Care should be taken when moving these routines to new architectures.
669eae561b3SGarrett Wollman  */
670eae561b3SGarrett Wollman 
671eae561b3SGarrett Wollman 
672eae561b3SGarrett Wollman /*
673eae561b3SGarrett Wollman  * XDR null terminated ASCII strings
674eae561b3SGarrett Wollman  * xdr_string deals with "C strings" - arrays of bytes that are
675eae561b3SGarrett Wollman  * terminated by a NULL character.  The parameter cpp references a
676eae561b3SGarrett Wollman  * pointer to storage; If the pointer is null, then the necessary
677eae561b3SGarrett Wollman  * storage is allocated.  The last parameter is the max allowed length
678eae561b3SGarrett Wollman  * of the string as specified by a protocol.
679eae561b3SGarrett Wollman  */
680eae561b3SGarrett Wollman bool_t
681*d660d38dSCraig Rodrigues xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
682eae561b3SGarrett Wollman {
6838360efbdSAlfred Perlstein 	char *sp = *cpp;  /* sp is the actual string pointer */
684eae561b3SGarrett Wollman 	u_int size;
685eae561b3SGarrett Wollman 	u_int nodesize;
686eae561b3SGarrett Wollman 
687eae561b3SGarrett Wollman 	/*
688eae561b3SGarrett Wollman 	 * first deal with the length since xdr strings are counted-strings
689eae561b3SGarrett Wollman 	 */
690eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
691eae561b3SGarrett Wollman 	case XDR_FREE:
692eae561b3SGarrett Wollman 		if (sp == NULL) {
693eae561b3SGarrett Wollman 			return(TRUE);	/* already free */
694eae561b3SGarrett Wollman 		}
6958360efbdSAlfred Perlstein 		/* FALLTHROUGH */
696eae561b3SGarrett Wollman 	case XDR_ENCODE:
697eae561b3SGarrett Wollman 		size = strlen(sp);
698eae561b3SGarrett Wollman 		break;
6998360efbdSAlfred Perlstein 	case XDR_DECODE:
7008360efbdSAlfred Perlstein 		break;
701eae561b3SGarrett Wollman 	}
702eae561b3SGarrett Wollman 	if (! xdr_u_int(xdrs, &size)) {
703eae561b3SGarrett Wollman 		return (FALSE);
704eae561b3SGarrett Wollman 	}
705eae561b3SGarrett Wollman 	if (size > maxsize) {
706eae561b3SGarrett Wollman 		return (FALSE);
707eae561b3SGarrett Wollman 	}
708eae561b3SGarrett Wollman 	nodesize = size + 1;
709eae561b3SGarrett Wollman 
710eae561b3SGarrett Wollman 	/*
711eae561b3SGarrett Wollman 	 * now deal with the actual bytes
712eae561b3SGarrett Wollman 	 */
713eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
714eae561b3SGarrett Wollman 
715eae561b3SGarrett Wollman 	case XDR_DECODE:
716eae561b3SGarrett Wollman 		if (nodesize == 0) {
717eae561b3SGarrett Wollman 			return (TRUE);
718eae561b3SGarrett Wollman 		}
719eae561b3SGarrett Wollman 		if (sp == NULL)
7208360efbdSAlfred Perlstein 			*cpp = sp = mem_alloc(nodesize);
721eae561b3SGarrett Wollman 		if (sp == NULL) {
7228360efbdSAlfred Perlstein 			warnx("xdr_string: out of memory");
723eae561b3SGarrett Wollman 			return (FALSE);
724eae561b3SGarrett Wollman 		}
725eae561b3SGarrett Wollman 		sp[size] = 0;
7268360efbdSAlfred Perlstein 		/* FALLTHROUGH */
727eae561b3SGarrett Wollman 
728eae561b3SGarrett Wollman 	case XDR_ENCODE:
729eae561b3SGarrett Wollman 		return (xdr_opaque(xdrs, sp, size));
730eae561b3SGarrett Wollman 
731eae561b3SGarrett Wollman 	case XDR_FREE:
732eae561b3SGarrett Wollman 		mem_free(sp, nodesize);
733eae561b3SGarrett Wollman 		*cpp = NULL;
734eae561b3SGarrett Wollman 		return (TRUE);
735eae561b3SGarrett Wollman 	}
7368360efbdSAlfred Perlstein 	/* NOTREACHED */
737eae561b3SGarrett Wollman 	return (FALSE);
738eae561b3SGarrett Wollman }
739eae561b3SGarrett Wollman 
740eae561b3SGarrett Wollman /*
741eae561b3SGarrett Wollman  * Wrapper for xdr_string that can be called directly from
742eae561b3SGarrett Wollman  * routines like clnt_call
743eae561b3SGarrett Wollman  */
744eae561b3SGarrett Wollman bool_t
745*d660d38dSCraig Rodrigues xdr_wrapstring(XDR *xdrs, char **cpp)
746eae561b3SGarrett Wollman {
7471ad08a09SPeter Wemm 	return xdr_string(xdrs, cpp, LASTUNSIGNED);
748eae561b3SGarrett Wollman }
7498360efbdSAlfred Perlstein 
7508360efbdSAlfred Perlstein /*
7518360efbdSAlfred Perlstein  * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t()
7528360efbdSAlfred Perlstein  * are in the "non-portable" section because they require that a `long long'
7538360efbdSAlfred Perlstein  * be a 64-bit type.
7548360efbdSAlfred Perlstein  *
7558360efbdSAlfred Perlstein  *	--thorpej@netbsd.org, November 30, 1999
7568360efbdSAlfred Perlstein  */
7578360efbdSAlfred Perlstein 
7588360efbdSAlfred Perlstein /*
7598360efbdSAlfred Perlstein  * XDR 64-bit integers
7608360efbdSAlfred Perlstein  */
7618360efbdSAlfred Perlstein bool_t
762*d660d38dSCraig Rodrigues xdr_int64_t(XDR *xdrs, int64_t *llp)
7638360efbdSAlfred Perlstein {
7648360efbdSAlfred Perlstein 	u_long ul[2];
7658360efbdSAlfred Perlstein 
7668360efbdSAlfred Perlstein 	switch (xdrs->x_op) {
7678360efbdSAlfred Perlstein 	case XDR_ENCODE:
7688360efbdSAlfred Perlstein 		ul[0] = (u_long)((u_int64_t)*llp >> 32) & 0xffffffff;
7698360efbdSAlfred Perlstein 		ul[1] = (u_long)((u_int64_t)*llp) & 0xffffffff;
7708360efbdSAlfred Perlstein 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
7718360efbdSAlfred Perlstein 			return (FALSE);
7728360efbdSAlfred Perlstein 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
7738360efbdSAlfred Perlstein 	case XDR_DECODE:
7748360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
7758360efbdSAlfred Perlstein 			return (FALSE);
7768360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
7778360efbdSAlfred Perlstein 			return (FALSE);
7788360efbdSAlfred Perlstein 		*llp = (int64_t)
7798360efbdSAlfred Perlstein 		    (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
7808360efbdSAlfred Perlstein 		return (TRUE);
7818360efbdSAlfred Perlstein 	case XDR_FREE:
7828360efbdSAlfred Perlstein 		return (TRUE);
7838360efbdSAlfred Perlstein 	}
7848360efbdSAlfred Perlstein 	/* NOTREACHED */
7858360efbdSAlfred Perlstein 	return (FALSE);
7868360efbdSAlfred Perlstein }
7878360efbdSAlfred Perlstein 
7888360efbdSAlfred Perlstein 
7898360efbdSAlfred Perlstein /*
7908360efbdSAlfred Perlstein  * XDR unsigned 64-bit integers
7918360efbdSAlfred Perlstein  */
7928360efbdSAlfred Perlstein bool_t
793*d660d38dSCraig Rodrigues xdr_u_int64_t(XDR *xdrs, u_int64_t *ullp)
7948360efbdSAlfred Perlstein {
7958360efbdSAlfred Perlstein 	u_long ul[2];
7968360efbdSAlfred Perlstein 
7978360efbdSAlfred Perlstein 	switch (xdrs->x_op) {
7988360efbdSAlfred Perlstein 	case XDR_ENCODE:
7998360efbdSAlfred Perlstein 		ul[0] = (u_long)(*ullp >> 32) & 0xffffffff;
8008360efbdSAlfred Perlstein 		ul[1] = (u_long)(*ullp) & 0xffffffff;
8018360efbdSAlfred Perlstein 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
8028360efbdSAlfred Perlstein 			return (FALSE);
8038360efbdSAlfred Perlstein 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
8048360efbdSAlfred Perlstein 	case XDR_DECODE:
8058360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
8068360efbdSAlfred Perlstein 			return (FALSE);
8078360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
8088360efbdSAlfred Perlstein 			return (FALSE);
8098360efbdSAlfred Perlstein 		*ullp = (u_int64_t)
8108360efbdSAlfred Perlstein 		    (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
8118360efbdSAlfred Perlstein 		return (TRUE);
8128360efbdSAlfred Perlstein 	case XDR_FREE:
8138360efbdSAlfred Perlstein 		return (TRUE);
8148360efbdSAlfred Perlstein 	}
8158360efbdSAlfred Perlstein 	/* NOTREACHED */
8168360efbdSAlfred Perlstein 	return (FALSE);
8178360efbdSAlfred Perlstein }
8188360efbdSAlfred Perlstein 
819a9148abdSDoug Rabson /*
820a9148abdSDoug Rabson  * XDR unsigned 64-bit integers
821a9148abdSDoug Rabson  */
822a9148abdSDoug Rabson bool_t
823*d660d38dSCraig Rodrigues xdr_uint64_t(XDR *xdrs, uint64_t *ullp)
824a9148abdSDoug Rabson {
825a9148abdSDoug Rabson 	u_long ul[2];
826a9148abdSDoug Rabson 
827a9148abdSDoug Rabson 	switch (xdrs->x_op) {
828a9148abdSDoug Rabson 	case XDR_ENCODE:
829a9148abdSDoug Rabson 		ul[0] = (u_long)(*ullp >> 32) & 0xffffffff;
830a9148abdSDoug Rabson 		ul[1] = (u_long)(*ullp) & 0xffffffff;
831a9148abdSDoug Rabson 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
832a9148abdSDoug Rabson 			return (FALSE);
833a9148abdSDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
834a9148abdSDoug Rabson 	case XDR_DECODE:
835a9148abdSDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
836a9148abdSDoug Rabson 			return (FALSE);
837a9148abdSDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
838a9148abdSDoug Rabson 			return (FALSE);
839a9148abdSDoug Rabson 		*ullp = (u_int64_t)
840a9148abdSDoug Rabson 		    (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
841a9148abdSDoug Rabson 		return (TRUE);
842a9148abdSDoug Rabson 	case XDR_FREE:
843a9148abdSDoug Rabson 		return (TRUE);
844a9148abdSDoug Rabson 	}
845a9148abdSDoug Rabson 	/* NOTREACHED */
846a9148abdSDoug Rabson 	return (FALSE);
847a9148abdSDoug Rabson }
848a9148abdSDoug Rabson 
8498360efbdSAlfred Perlstein 
8508360efbdSAlfred Perlstein /*
8518360efbdSAlfred Perlstein  * XDR hypers
8528360efbdSAlfred Perlstein  */
8538360efbdSAlfred Perlstein bool_t
854*d660d38dSCraig Rodrigues xdr_hyper(XDR *xdrs, longlong_t *llp)
8558360efbdSAlfred Perlstein {
8568360efbdSAlfred Perlstein 
8578360efbdSAlfred Perlstein 	/*
8588360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
8598360efbdSAlfred Perlstein 	 * call xdr_int64_t().
8608360efbdSAlfred Perlstein 	 */
8618360efbdSAlfred Perlstein 	return (xdr_int64_t(xdrs, (int64_t *)llp));
8628360efbdSAlfred Perlstein }
8638360efbdSAlfred Perlstein 
8648360efbdSAlfred Perlstein 
8658360efbdSAlfred Perlstein /*
8668360efbdSAlfred Perlstein  * XDR unsigned hypers
8678360efbdSAlfred Perlstein  */
8688360efbdSAlfred Perlstein bool_t
869*d660d38dSCraig Rodrigues xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp)
8708360efbdSAlfred Perlstein {
8718360efbdSAlfred Perlstein 
8728360efbdSAlfred Perlstein 	/*
8738360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
8748360efbdSAlfred Perlstein 	 * call xdr_u_int64_t().
8758360efbdSAlfred Perlstein 	 */
8768360efbdSAlfred Perlstein 	return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
8778360efbdSAlfred Perlstein }
8788360efbdSAlfred Perlstein 
8798360efbdSAlfred Perlstein 
8808360efbdSAlfred Perlstein /*
8818360efbdSAlfred Perlstein  * XDR longlong_t's
8828360efbdSAlfred Perlstein  */
8838360efbdSAlfred Perlstein bool_t
884*d660d38dSCraig Rodrigues xdr_longlong_t(XDR *xdrs, longlong_t *llp)
8858360efbdSAlfred Perlstein {
8868360efbdSAlfred Perlstein 
8878360efbdSAlfred Perlstein 	/*
8888360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
8898360efbdSAlfred Perlstein 	 * call xdr_int64_t().
8908360efbdSAlfred Perlstein 	 */
8918360efbdSAlfred Perlstein 	return (xdr_int64_t(xdrs, (int64_t *)llp));
8928360efbdSAlfred Perlstein }
8938360efbdSAlfred Perlstein 
8948360efbdSAlfred Perlstein 
8958360efbdSAlfred Perlstein /*
8968360efbdSAlfred Perlstein  * XDR u_longlong_t's
8978360efbdSAlfred Perlstein  */
8988360efbdSAlfred Perlstein bool_t
899*d660d38dSCraig Rodrigues xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp)
9008360efbdSAlfred Perlstein {
9018360efbdSAlfred Perlstein 
9028360efbdSAlfred Perlstein 	/*
9038360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
9048360efbdSAlfred Perlstein 	 * call xdr_u_int64_t().
9058360efbdSAlfred Perlstein 	 */
9068360efbdSAlfred Perlstein 	return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
9078360efbdSAlfred Perlstein }
908