xref: /freebsd/lib/libc/xdr/xdr.c (revision a5d1cf5e362a2e3c3ebdf6d8f2b86658a6d0b9d6)
18360efbdSAlfred Perlstein /*	$NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $	*/
28360efbdSAlfred Perlstein 
3a204967aSHiroki Sato /*-
48a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
58a16b7a1SPedro F. Giffuni  *
6a204967aSHiroki Sato  * Copyright (c) 2010, Oracle America, Inc.
7eae561b3SGarrett Wollman  *
8a204967aSHiroki Sato  * Redistribution and use in source and binary forms, with or without
9a204967aSHiroki Sato  * modification, are permitted provided that the following conditions are
10a204967aSHiroki Sato  * met:
11eae561b3SGarrett Wollman  *
12a204967aSHiroki Sato  *     * Redistributions of source code must retain the above copyright
13a204967aSHiroki Sato  *       notice, this list of conditions and the following disclaimer.
14a204967aSHiroki Sato  *     * Redistributions in binary form must reproduce the above
15a204967aSHiroki Sato  *       copyright notice, this list of conditions and the following
16a204967aSHiroki Sato  *       disclaimer in the documentation and/or other materials
17a204967aSHiroki Sato  *       provided with the distribution.
18a204967aSHiroki Sato  *     * Neither the name of the "Oracle America, Inc." nor the names of its
19a204967aSHiroki Sato  *       contributors may be used to endorse or promote products derived
20a204967aSHiroki Sato  *       from this software without specific prior written permission.
21eae561b3SGarrett Wollman  *
22a204967aSHiroki Sato  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23a204967aSHiroki Sato  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24a204967aSHiroki Sato  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25a204967aSHiroki Sato  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26a204967aSHiroki Sato  *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27a204967aSHiroki Sato  *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28a204967aSHiroki Sato  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29a204967aSHiroki Sato  *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30a204967aSHiroki Sato  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31a204967aSHiroki Sato  *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32a204967aSHiroki Sato  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33a204967aSHiroki Sato  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34eae561b3SGarrett Wollman  */
35eae561b3SGarrett Wollman 
36eae561b3SGarrett Wollman /*
37eae561b3SGarrett Wollman  * xdr.c, Generic XDR routines implementation.
38eae561b3SGarrett Wollman  *
39eae561b3SGarrett Wollman  * These are the "generic" xdr routines used to serialize and de-serialize
40eae561b3SGarrett Wollman  * most common data items.  See xdr.h for more info on the interface to
41eae561b3SGarrett Wollman  * xdr.
42eae561b3SGarrett Wollman  */
43eae561b3SGarrett Wollman 
448360efbdSAlfred Perlstein #include "namespace.h"
458360efbdSAlfred Perlstein #include <err.h>
46eae561b3SGarrett Wollman #include <stdio.h>
4729285d6cSPoul-Henning Kamp #include <stdlib.h>
481ad08a09SPeter Wemm #include <string.h>
49eae561b3SGarrett Wollman 
506448ec89SXin LI #include <rpc/rpc.h>
516448ec89SXin LI #include <rpc/rpc_com.h>
52eae561b3SGarrett Wollman #include <rpc/types.h>
53eae561b3SGarrett Wollman #include <rpc/xdr.h>
548360efbdSAlfred Perlstein #include "un-namespace.h"
558360efbdSAlfred Perlstein 
568360efbdSAlfred Perlstein typedef quad_t          longlong_t;     /* ANSI long long type */
578360efbdSAlfred Perlstein typedef u_quad_t        u_longlong_t;   /* ANSI unsigned long long type */
58eae561b3SGarrett Wollman 
59eae561b3SGarrett Wollman /*
60eae561b3SGarrett Wollman  * constants specific to the xdr "protocol"
61eae561b3SGarrett Wollman  */
62eae561b3SGarrett Wollman #define XDR_FALSE	((long) 0)
63eae561b3SGarrett Wollman #define XDR_TRUE	((long) 1)
64eae561b3SGarrett Wollman 
65eae561b3SGarrett Wollman /*
66eae561b3SGarrett Wollman  * for unit alignment
67eae561b3SGarrett Wollman  */
688360efbdSAlfred Perlstein static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
69eae561b3SGarrett Wollman 
70eae561b3SGarrett Wollman /*
71eae561b3SGarrett Wollman  * Free a data structure using XDR
72eae561b3SGarrett Wollman  * Not a filter, but a convenient utility nonetheless
73eae561b3SGarrett Wollman  */
74eae561b3SGarrett Wollman void
xdr_free(xdrproc_t proc,void * objp)75d660d38dSCraig Rodrigues xdr_free(xdrproc_t proc, void *objp)
76eae561b3SGarrett Wollman {
77eae561b3SGarrett Wollman 	XDR x;
78eae561b3SGarrett Wollman 
79eae561b3SGarrett Wollman 	x.x_op = XDR_FREE;
80eae561b3SGarrett Wollman 	(*proc)(&x, objp);
81eae561b3SGarrett Wollman }
82eae561b3SGarrett Wollman 
83eae561b3SGarrett Wollman /*
84eae561b3SGarrett Wollman  * XDR nothing
85eae561b3SGarrett Wollman  */
86eae561b3SGarrett Wollman bool_t
xdr_void(XDR * xdrs __unused,void * ptr __unused)87*a5d1cf5eSMark Johnston xdr_void(XDR *xdrs __unused, void *ptr __unused)
88eae561b3SGarrett Wollman {
89eae561b3SGarrett Wollman 	return (TRUE);
90eae561b3SGarrett Wollman }
91eae561b3SGarrett Wollman 
92eae561b3SGarrett Wollman /*
93eae561b3SGarrett Wollman  * XDR integers
94eae561b3SGarrett Wollman  */
95eae561b3SGarrett Wollman bool_t
xdr_int(XDR * xdrs,int * ip)96d660d38dSCraig Rodrigues xdr_int(XDR *xdrs, int *ip)
97eae561b3SGarrett Wollman {
981ad08a09SPeter Wemm 	long l;
99eae561b3SGarrett Wollman 
1001ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1011ad08a09SPeter Wemm 
1021ad08a09SPeter Wemm 	case XDR_ENCODE:
1031ad08a09SPeter Wemm 		l = (long) *ip;
1041ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, &l));
1051ad08a09SPeter Wemm 
1061ad08a09SPeter Wemm 	case XDR_DECODE:
1071ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, &l)) {
1081ad08a09SPeter Wemm 			return (FALSE);
109eae561b3SGarrett Wollman 		}
1101ad08a09SPeter Wemm 		*ip = (int) l;
1111ad08a09SPeter Wemm 		return (TRUE);
1121ad08a09SPeter Wemm 
1131ad08a09SPeter Wemm 	case XDR_FREE:
1141ad08a09SPeter Wemm 		return (TRUE);
1151ad08a09SPeter Wemm 	}
1168360efbdSAlfred Perlstein 	/* NOTREACHED */
1171ad08a09SPeter Wemm 	return (FALSE);
118eae561b3SGarrett Wollman }
119eae561b3SGarrett Wollman 
120eae561b3SGarrett Wollman /*
121eae561b3SGarrett Wollman  * XDR unsigned integers
122eae561b3SGarrett Wollman  */
123eae561b3SGarrett Wollman bool_t
xdr_u_int(XDR * xdrs,u_int * up)124d660d38dSCraig Rodrigues xdr_u_int(XDR *xdrs, u_int *up)
125eae561b3SGarrett Wollman {
1261ad08a09SPeter Wemm 	u_long l;
127eae561b3SGarrett Wollman 
1281ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1291ad08a09SPeter Wemm 
1301ad08a09SPeter Wemm 	case XDR_ENCODE:
1311ad08a09SPeter Wemm 		l = (u_long) *up;
1321ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
1331ad08a09SPeter Wemm 
1341ad08a09SPeter Wemm 	case XDR_DECODE:
1351ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
1361ad08a09SPeter Wemm 			return (FALSE);
137eae561b3SGarrett Wollman 		}
1381ad08a09SPeter Wemm 		*up = (u_int) l;
1391ad08a09SPeter Wemm 		return (TRUE);
1401ad08a09SPeter Wemm 
1411ad08a09SPeter Wemm 	case XDR_FREE:
1421ad08a09SPeter Wemm 		return (TRUE);
143eae561b3SGarrett Wollman 	}
1448360efbdSAlfred Perlstein 	/* NOTREACHED */
1451ad08a09SPeter Wemm 	return (FALSE);
1461ad08a09SPeter Wemm }
1471ad08a09SPeter Wemm 
148eae561b3SGarrett Wollman 
149eae561b3SGarrett Wollman /*
150eae561b3SGarrett Wollman  * XDR long integers
151eae561b3SGarrett Wollman  * same as xdr_u_long - open coded to save a proc call!
152eae561b3SGarrett Wollman  */
153eae561b3SGarrett Wollman bool_t
xdr_long(XDR * xdrs,long * lp)154d660d38dSCraig Rodrigues xdr_long(XDR *xdrs, long *lp)
155eae561b3SGarrett Wollman {
1561ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1571ad08a09SPeter Wemm 	case XDR_ENCODE:
158eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, lp));
1591ad08a09SPeter Wemm 	case XDR_DECODE:
160eae561b3SGarrett Wollman 		return (XDR_GETLONG(xdrs, lp));
1611ad08a09SPeter Wemm 	case XDR_FREE:
162eae561b3SGarrett Wollman 		return (TRUE);
1631ad08a09SPeter Wemm 	}
1648360efbdSAlfred Perlstein 	/* NOTREACHED */
165eae561b3SGarrett Wollman 	return (FALSE);
166eae561b3SGarrett Wollman }
167eae561b3SGarrett Wollman 
168eae561b3SGarrett Wollman /*
169eae561b3SGarrett Wollman  * XDR unsigned long integers
170eae561b3SGarrett Wollman  * same as xdr_long - open coded to save a proc call!
171eae561b3SGarrett Wollman  */
172eae561b3SGarrett Wollman bool_t
xdr_u_long(XDR * xdrs,u_long * ulp)173d660d38dSCraig Rodrigues xdr_u_long(XDR *xdrs, u_long *ulp)
174eae561b3SGarrett Wollman {
1751ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1761ad08a09SPeter Wemm 	case XDR_ENCODE:
177eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, (long *)ulp));
1781ad08a09SPeter Wemm 	case XDR_DECODE:
1791ad08a09SPeter Wemm 		return (XDR_GETLONG(xdrs, (long *)ulp));
1801ad08a09SPeter Wemm 	case XDR_FREE:
181eae561b3SGarrett Wollman 		return (TRUE);
1821ad08a09SPeter Wemm 	}
1838360efbdSAlfred Perlstein 	/* NOTREACHED */
184eae561b3SGarrett Wollman 	return (FALSE);
185eae561b3SGarrett Wollman }
186eae561b3SGarrett Wollman 
1871ad08a09SPeter Wemm 
1881ad08a09SPeter Wemm /*
1891ad08a09SPeter Wemm  * XDR 32-bit integers
1901ad08a09SPeter Wemm  * same as xdr_u_int32_t - open coded to save a proc call!
1911ad08a09SPeter Wemm  */
1921ad08a09SPeter Wemm bool_t
xdr_int32_t(XDR * xdrs,int32_t * int32_p)193d660d38dSCraig Rodrigues xdr_int32_t(XDR *xdrs, int32_t *int32_p)
1941ad08a09SPeter Wemm {
1951ad08a09SPeter Wemm 	long l;
1961ad08a09SPeter Wemm 
1971ad08a09SPeter Wemm 	switch (xdrs->x_op) {
1981ad08a09SPeter Wemm 
1991ad08a09SPeter Wemm 	case XDR_ENCODE:
2001ad08a09SPeter Wemm 		l = (long) *int32_p;
2011ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, &l));
2021ad08a09SPeter Wemm 
2031ad08a09SPeter Wemm 	case XDR_DECODE:
2041ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, &l)) {
2051ad08a09SPeter Wemm 			return (FALSE);
2061ad08a09SPeter Wemm 		}
2071ad08a09SPeter Wemm 		*int32_p = (int32_t) l;
2081ad08a09SPeter Wemm 		return (TRUE);
2091ad08a09SPeter Wemm 
2101ad08a09SPeter Wemm 	case XDR_FREE:
2111ad08a09SPeter Wemm 		return (TRUE);
2121ad08a09SPeter Wemm 	}
2138360efbdSAlfred Perlstein 	/* NOTREACHED */
2141ad08a09SPeter Wemm 	return (FALSE);
2151ad08a09SPeter Wemm }
2161ad08a09SPeter Wemm 
2171ad08a09SPeter Wemm /*
2181ad08a09SPeter Wemm  * XDR unsigned 32-bit integers
2191ad08a09SPeter Wemm  * same as xdr_int32_t - open coded to save a proc call!
2201ad08a09SPeter Wemm  */
2211ad08a09SPeter Wemm bool_t
xdr_u_int32_t(XDR * xdrs,u_int32_t * u_int32_p)222d660d38dSCraig Rodrigues xdr_u_int32_t(XDR *xdrs, u_int32_t *u_int32_p)
2231ad08a09SPeter Wemm {
2241ad08a09SPeter Wemm 	u_long l;
2251ad08a09SPeter Wemm 
2261ad08a09SPeter Wemm 	switch (xdrs->x_op) {
2271ad08a09SPeter Wemm 
2281ad08a09SPeter Wemm 	case XDR_ENCODE:
2291ad08a09SPeter Wemm 		l = (u_long) *u_int32_p;
2301ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
2311ad08a09SPeter Wemm 
2321ad08a09SPeter Wemm 	case XDR_DECODE:
2331ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
2341ad08a09SPeter Wemm 			return (FALSE);
2351ad08a09SPeter Wemm 		}
2361ad08a09SPeter Wemm 		*u_int32_p = (u_int32_t) l;
2371ad08a09SPeter Wemm 		return (TRUE);
2381ad08a09SPeter Wemm 
2391ad08a09SPeter Wemm 	case XDR_FREE:
2401ad08a09SPeter Wemm 		return (TRUE);
2411ad08a09SPeter Wemm 	}
2428360efbdSAlfred Perlstein 	/* NOTREACHED */
243c304ad8aSDavid E. O'Brien 	return (FALSE);
244c304ad8aSDavid E. O'Brien }
245c304ad8aSDavid E. O'Brien 
246a9148abdSDoug Rabson /*
247a9148abdSDoug Rabson  * XDR unsigned 32-bit integers
248a9148abdSDoug Rabson  * same as xdr_int32_t - open coded to save a proc call!
249a9148abdSDoug Rabson  */
250a9148abdSDoug Rabson bool_t
xdr_uint32_t(XDR * xdrs,uint32_t * u_int32_p)251d660d38dSCraig Rodrigues xdr_uint32_t(XDR *xdrs, uint32_t *u_int32_p)
252a9148abdSDoug Rabson {
253a9148abdSDoug Rabson 	u_long l;
254a9148abdSDoug Rabson 
255a9148abdSDoug Rabson 	switch (xdrs->x_op) {
256a9148abdSDoug Rabson 
257a9148abdSDoug Rabson 	case XDR_ENCODE:
258a9148abdSDoug Rabson 		l = (u_long) *u_int32_p;
259a9148abdSDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
260a9148abdSDoug Rabson 
261a9148abdSDoug Rabson 	case XDR_DECODE:
262a9148abdSDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
263a9148abdSDoug Rabson 			return (FALSE);
264a9148abdSDoug Rabson 		}
265a9148abdSDoug Rabson 		*u_int32_p = (u_int32_t) l;
266a9148abdSDoug Rabson 		return (TRUE);
267a9148abdSDoug Rabson 
268a9148abdSDoug Rabson 	case XDR_FREE:
269a9148abdSDoug Rabson 		return (TRUE);
270a9148abdSDoug Rabson 	}
271a9148abdSDoug Rabson 	/* NOTREACHED */
272a9148abdSDoug Rabson 	return (FALSE);
273a9148abdSDoug Rabson }
2741ad08a09SPeter Wemm 
275eae561b3SGarrett Wollman /*
276eae561b3SGarrett Wollman  * XDR short integers
277eae561b3SGarrett Wollman  */
278eae561b3SGarrett Wollman bool_t
xdr_short(XDR * xdrs,short * sp)279d660d38dSCraig Rodrigues xdr_short(XDR *xdrs, short *sp)
280eae561b3SGarrett Wollman {
281eae561b3SGarrett Wollman 	long l;
282eae561b3SGarrett Wollman 
283eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
284eae561b3SGarrett Wollman 
285eae561b3SGarrett Wollman 	case XDR_ENCODE:
286eae561b3SGarrett Wollman 		l = (long) *sp;
287eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &l));
288eae561b3SGarrett Wollman 
289eae561b3SGarrett Wollman 	case XDR_DECODE:
290eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &l)) {
291eae561b3SGarrett Wollman 			return (FALSE);
292eae561b3SGarrett Wollman 		}
293eae561b3SGarrett Wollman 		*sp = (short) l;
294eae561b3SGarrett Wollman 		return (TRUE);
295eae561b3SGarrett Wollman 
296eae561b3SGarrett Wollman 	case XDR_FREE:
297eae561b3SGarrett Wollman 		return (TRUE);
298eae561b3SGarrett Wollman 	}
2998360efbdSAlfred Perlstein 	/* NOTREACHED */
300eae561b3SGarrett Wollman 	return (FALSE);
301eae561b3SGarrett Wollman }
302eae561b3SGarrett Wollman 
303eae561b3SGarrett Wollman /*
304eae561b3SGarrett Wollman  * XDR unsigned short integers
305eae561b3SGarrett Wollman  */
306eae561b3SGarrett Wollman bool_t
xdr_u_short(XDR * xdrs,u_short * usp)307d660d38dSCraig Rodrigues xdr_u_short(XDR *xdrs, u_short *usp)
308eae561b3SGarrett Wollman {
309eae561b3SGarrett Wollman 	u_long l;
310eae561b3SGarrett Wollman 
311eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
312eae561b3SGarrett Wollman 
313eae561b3SGarrett Wollman 	case XDR_ENCODE:
314eae561b3SGarrett Wollman 		l = (u_long) *usp;
3151ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
3161ad08a09SPeter Wemm 
3171ad08a09SPeter Wemm 	case XDR_DECODE:
3181ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
3191ad08a09SPeter Wemm 			return (FALSE);
3201ad08a09SPeter Wemm 		}
3211ad08a09SPeter Wemm 		*usp = (u_short) l;
3221ad08a09SPeter Wemm 		return (TRUE);
3231ad08a09SPeter Wemm 
3241ad08a09SPeter Wemm 	case XDR_FREE:
3251ad08a09SPeter Wemm 		return (TRUE);
3261ad08a09SPeter Wemm 	}
3278360efbdSAlfred Perlstein 	/* NOTREACHED */
3281ad08a09SPeter Wemm 	return (FALSE);
3291ad08a09SPeter Wemm }
3301ad08a09SPeter Wemm 
3311ad08a09SPeter Wemm 
3321ad08a09SPeter Wemm /*
3331ad08a09SPeter Wemm  * XDR 16-bit integers
3341ad08a09SPeter Wemm  */
3351ad08a09SPeter Wemm bool_t
xdr_int16_t(XDR * xdrs,int16_t * int16_p)336d660d38dSCraig Rodrigues xdr_int16_t(XDR *xdrs, int16_t *int16_p)
3371ad08a09SPeter Wemm {
3381ad08a09SPeter Wemm 	long l;
3391ad08a09SPeter Wemm 
3401ad08a09SPeter Wemm 	switch (xdrs->x_op) {
3411ad08a09SPeter Wemm 
3421ad08a09SPeter Wemm 	case XDR_ENCODE:
3431ad08a09SPeter Wemm 		l = (long) *int16_p;
344eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &l));
345eae561b3SGarrett Wollman 
346eae561b3SGarrett Wollman 	case XDR_DECODE:
347eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &l)) {
348eae561b3SGarrett Wollman 			return (FALSE);
349eae561b3SGarrett Wollman 		}
3501ad08a09SPeter Wemm 		*int16_p = (int16_t) l;
3511ad08a09SPeter Wemm 		return (TRUE);
3521ad08a09SPeter Wemm 
3531ad08a09SPeter Wemm 	case XDR_FREE:
3541ad08a09SPeter Wemm 		return (TRUE);
3551ad08a09SPeter Wemm 	}
3568360efbdSAlfred Perlstein 	/* NOTREACHED */
3571ad08a09SPeter Wemm 	return (FALSE);
3581ad08a09SPeter Wemm }
3591ad08a09SPeter Wemm 
3601ad08a09SPeter Wemm /*
3611ad08a09SPeter Wemm  * XDR unsigned 16-bit integers
3621ad08a09SPeter Wemm  */
3631ad08a09SPeter Wemm bool_t
xdr_u_int16_t(XDR * xdrs,u_int16_t * u_int16_p)364d660d38dSCraig Rodrigues xdr_u_int16_t(XDR *xdrs, u_int16_t *u_int16_p)
3651ad08a09SPeter Wemm {
3661ad08a09SPeter Wemm 	u_long l;
3671ad08a09SPeter Wemm 
3681ad08a09SPeter Wemm 	switch (xdrs->x_op) {
3691ad08a09SPeter Wemm 
3701ad08a09SPeter Wemm 	case XDR_ENCODE:
3711ad08a09SPeter Wemm 		l = (u_long) *u_int16_p;
3721ad08a09SPeter Wemm 		return (XDR_PUTLONG(xdrs, (long *)&l));
3731ad08a09SPeter Wemm 
3741ad08a09SPeter Wemm 	case XDR_DECODE:
3751ad08a09SPeter Wemm 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
3761ad08a09SPeter Wemm 			return (FALSE);
3771ad08a09SPeter Wemm 		}
3781ad08a09SPeter Wemm 		*u_int16_p = (u_int16_t) l;
379eae561b3SGarrett Wollman 		return (TRUE);
380eae561b3SGarrett Wollman 
381eae561b3SGarrett Wollman 	case XDR_FREE:
382eae561b3SGarrett Wollman 		return (TRUE);
383eae561b3SGarrett Wollman 	}
3848360efbdSAlfred Perlstein 	/* NOTREACHED */
385eae561b3SGarrett Wollman 	return (FALSE);
386eae561b3SGarrett Wollman }
387eae561b3SGarrett Wollman 
388a9148abdSDoug Rabson /*
389a9148abdSDoug Rabson  * XDR unsigned 16-bit integers
390a9148abdSDoug Rabson  */
391a9148abdSDoug Rabson bool_t
xdr_uint16_t(XDR * xdrs,uint16_t * u_int16_p)392d660d38dSCraig Rodrigues xdr_uint16_t(XDR *xdrs, uint16_t *u_int16_p)
393a9148abdSDoug Rabson {
394a9148abdSDoug Rabson 	u_long l;
395a9148abdSDoug Rabson 
396a9148abdSDoug Rabson 	switch (xdrs->x_op) {
397a9148abdSDoug Rabson 
398a9148abdSDoug Rabson 	case XDR_ENCODE:
399a9148abdSDoug Rabson 		l = (u_long) *u_int16_p;
400a9148abdSDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&l));
401a9148abdSDoug Rabson 
402a9148abdSDoug Rabson 	case XDR_DECODE:
403a9148abdSDoug Rabson 		if (!XDR_GETLONG(xdrs, (long *)&l)) {
404a9148abdSDoug Rabson 			return (FALSE);
405a9148abdSDoug Rabson 		}
406a9148abdSDoug Rabson 		*u_int16_p = (u_int16_t) l;
407a9148abdSDoug Rabson 		return (TRUE);
408a9148abdSDoug Rabson 
409a9148abdSDoug Rabson 	case XDR_FREE:
410a9148abdSDoug Rabson 		return (TRUE);
411a9148abdSDoug Rabson 	}
412a9148abdSDoug Rabson 	/* NOTREACHED */
413a9148abdSDoug Rabson 	return (FALSE);
414a9148abdSDoug Rabson }
415a9148abdSDoug Rabson 
416eae561b3SGarrett Wollman 
417eae561b3SGarrett Wollman /*
418eae561b3SGarrett Wollman  * XDR a char
419eae561b3SGarrett Wollman  */
420eae561b3SGarrett Wollman bool_t
xdr_char(XDR * xdrs,char * cp)421d660d38dSCraig Rodrigues xdr_char(XDR *xdrs, char *cp)
422eae561b3SGarrett Wollman {
423a872c370SBrooks Davis 	u_int i;
424eae561b3SGarrett Wollman 
425a872c370SBrooks Davis 	i = *((unsigned char *)cp);
426a872c370SBrooks Davis 	if (!xdr_u_int(xdrs, &i)) {
427eae561b3SGarrett Wollman 		return (FALSE);
428eae561b3SGarrett Wollman 	}
429a872c370SBrooks Davis 	*((unsigned char *)cp) = i;
430eae561b3SGarrett Wollman 	return (TRUE);
431eae561b3SGarrett Wollman }
432eae561b3SGarrett Wollman 
433eae561b3SGarrett Wollman /*
434eae561b3SGarrett Wollman  * XDR an unsigned char
435eae561b3SGarrett Wollman  */
436eae561b3SGarrett Wollman bool_t
xdr_u_char(XDR * xdrs,u_char * cp)437d660d38dSCraig Rodrigues xdr_u_char(XDR *xdrs, u_char *cp)
438eae561b3SGarrett Wollman {
439eae561b3SGarrett Wollman 	u_int u;
440eae561b3SGarrett Wollman 
441eae561b3SGarrett Wollman 	u = (*cp);
442eae561b3SGarrett Wollman 	if (!xdr_u_int(xdrs, &u)) {
443eae561b3SGarrett Wollman 		return (FALSE);
444eae561b3SGarrett Wollman 	}
445eae561b3SGarrett Wollman 	*cp = u;
446eae561b3SGarrett Wollman 	return (TRUE);
447eae561b3SGarrett Wollman }
448eae561b3SGarrett Wollman 
449eae561b3SGarrett Wollman /*
450eae561b3SGarrett Wollman  * XDR booleans
451eae561b3SGarrett Wollman  */
452eae561b3SGarrett Wollman bool_t
xdr_bool(XDR * xdrs,bool_t * bp)453d660d38dSCraig Rodrigues xdr_bool(XDR *xdrs, bool_t *bp)
454eae561b3SGarrett Wollman {
455eae561b3SGarrett Wollman 	long lb;
456eae561b3SGarrett Wollman 
457eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
458eae561b3SGarrett Wollman 
459eae561b3SGarrett Wollman 	case XDR_ENCODE:
460eae561b3SGarrett Wollman 		lb = *bp ? XDR_TRUE : XDR_FALSE;
461eae561b3SGarrett Wollman 		return (XDR_PUTLONG(xdrs, &lb));
462eae561b3SGarrett Wollman 
463eae561b3SGarrett Wollman 	case XDR_DECODE:
464eae561b3SGarrett Wollman 		if (!XDR_GETLONG(xdrs, &lb)) {
465eae561b3SGarrett Wollman 			return (FALSE);
466eae561b3SGarrett Wollman 		}
467eae561b3SGarrett Wollman 		*bp = (lb == XDR_FALSE) ? FALSE : TRUE;
468eae561b3SGarrett Wollman 		return (TRUE);
469eae561b3SGarrett Wollman 
470eae561b3SGarrett Wollman 	case XDR_FREE:
471eae561b3SGarrett Wollman 		return (TRUE);
472eae561b3SGarrett Wollman 	}
4738360efbdSAlfred Perlstein 	/* NOTREACHED */
474eae561b3SGarrett Wollman 	return (FALSE);
475eae561b3SGarrett Wollman }
476eae561b3SGarrett Wollman 
477eae561b3SGarrett Wollman /*
478eae561b3SGarrett Wollman  * XDR enumerations
479eae561b3SGarrett Wollman  */
480eae561b3SGarrett Wollman bool_t
xdr_enum(XDR * xdrs,enum_t * ep)481d660d38dSCraig Rodrigues xdr_enum(XDR *xdrs, enum_t *ep)
482eae561b3SGarrett Wollman {
483eae561b3SGarrett Wollman 	enum sizecheck { SIZEVAL };	/* used to find the size of an enum */
484eae561b3SGarrett Wollman 
485eae561b3SGarrett Wollman 	/*
486eae561b3SGarrett Wollman 	 * enums are treated as ints
487eae561b3SGarrett Wollman 	 */
4888360efbdSAlfred Perlstein 	/* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) {
4898360efbdSAlfred Perlstein 		return (xdr_long(xdrs, (long *)(void *)ep));
4908360efbdSAlfred Perlstein 	} else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) {
4918360efbdSAlfred Perlstein 		return (xdr_int(xdrs, (int *)(void *)ep));
4928360efbdSAlfred Perlstein 	} else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) {
4938360efbdSAlfred Perlstein 		return (xdr_short(xdrs, (short *)(void *)ep));
494eae561b3SGarrett Wollman 	} else {
495eae561b3SGarrett Wollman 		return (FALSE);
496eae561b3SGarrett Wollman 	}
497eae561b3SGarrett Wollman }
498eae561b3SGarrett Wollman 
499eae561b3SGarrett Wollman /*
500eae561b3SGarrett Wollman  * XDR opaque data
501eae561b3SGarrett Wollman  * Allows the specification of a fixed size sequence of opaque bytes.
502eae561b3SGarrett Wollman  * cp points to the opaque object and cnt gives the byte length.
503eae561b3SGarrett Wollman  */
504eae561b3SGarrett Wollman bool_t
xdr_opaque(XDR * xdrs,caddr_t cp,u_int cnt)505d660d38dSCraig Rodrigues xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt)
506eae561b3SGarrett Wollman {
5078360efbdSAlfred Perlstein 	u_int rndup;
5088360efbdSAlfred Perlstein 	static int crud[BYTES_PER_XDR_UNIT];
509eae561b3SGarrett Wollman 
510eae561b3SGarrett Wollman 	/*
511eae561b3SGarrett Wollman 	 * if no data we are done
512eae561b3SGarrett Wollman 	 */
513eae561b3SGarrett Wollman 	if (cnt == 0)
514eae561b3SGarrett Wollman 		return (TRUE);
515eae561b3SGarrett Wollman 
516eae561b3SGarrett Wollman 	/*
517eae561b3SGarrett Wollman 	 * round byte count to full xdr units
518eae561b3SGarrett Wollman 	 */
519eae561b3SGarrett Wollman 	rndup = cnt % BYTES_PER_XDR_UNIT;
520eae561b3SGarrett Wollman 	if (rndup > 0)
521eae561b3SGarrett Wollman 		rndup = BYTES_PER_XDR_UNIT - rndup;
522eae561b3SGarrett Wollman 
523eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_DECODE) {
524eae561b3SGarrett Wollman 		if (!XDR_GETBYTES(xdrs, cp, cnt)) {
525eae561b3SGarrett Wollman 			return (FALSE);
526eae561b3SGarrett Wollman 		}
527eae561b3SGarrett Wollman 		if (rndup == 0)
528eae561b3SGarrett Wollman 			return (TRUE);
5298360efbdSAlfred Perlstein 		return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup));
530eae561b3SGarrett Wollman 	}
531eae561b3SGarrett Wollman 
532eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_ENCODE) {
533eae561b3SGarrett Wollman 		if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
534eae561b3SGarrett Wollman 			return (FALSE);
535eae561b3SGarrett Wollman 		}
536eae561b3SGarrett Wollman 		if (rndup == 0)
537eae561b3SGarrett Wollman 			return (TRUE);
538eae561b3SGarrett Wollman 		return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
539eae561b3SGarrett Wollman 	}
540eae561b3SGarrett Wollman 
541eae561b3SGarrett Wollman 	if (xdrs->x_op == XDR_FREE) {
542eae561b3SGarrett Wollman 		return (TRUE);
543eae561b3SGarrett Wollman 	}
544eae561b3SGarrett Wollman 
545eae561b3SGarrett Wollman 	return (FALSE);
546eae561b3SGarrett Wollman }
547eae561b3SGarrett Wollman 
548eae561b3SGarrett Wollman /*
549eae561b3SGarrett Wollman  * XDR counted bytes
550eae561b3SGarrett Wollman  * *cpp is a pointer to the bytes, *sizep is the count.
551eae561b3SGarrett Wollman  * If *cpp is NULL maxsize bytes are allocated
552eae561b3SGarrett Wollman  */
553eae561b3SGarrett Wollman bool_t
xdr_bytes(XDR * xdrs,char ** cpp,u_int * sizep,u_int maxsize)554d660d38dSCraig Rodrigues xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
555eae561b3SGarrett Wollman {
5568360efbdSAlfred Perlstein 	char *sp = *cpp;  /* sp is the actual string pointer */
5578360efbdSAlfred Perlstein 	u_int nodesize;
5586448ec89SXin LI 	bool_t ret, allocated = FALSE;
559eae561b3SGarrett Wollman 
560eae561b3SGarrett Wollman 	/*
561eae561b3SGarrett Wollman 	 * first deal with the length since xdr bytes are counted
562eae561b3SGarrett Wollman 	 */
563eae561b3SGarrett Wollman 	if (! xdr_u_int(xdrs, sizep)) {
564eae561b3SGarrett Wollman 		return (FALSE);
565eae561b3SGarrett Wollman 	}
566eae561b3SGarrett Wollman 	nodesize = *sizep;
567eae561b3SGarrett Wollman 	if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
568eae561b3SGarrett Wollman 		return (FALSE);
569eae561b3SGarrett Wollman 	}
570eae561b3SGarrett Wollman 
571eae561b3SGarrett Wollman 	/*
572eae561b3SGarrett Wollman 	 * now deal with the actual bytes
573eae561b3SGarrett Wollman 	 */
574eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
575eae561b3SGarrett Wollman 
576eae561b3SGarrett Wollman 	case XDR_DECODE:
577eae561b3SGarrett Wollman 		if (nodesize == 0) {
578eae561b3SGarrett Wollman 			return (TRUE);
579eae561b3SGarrett Wollman 		}
580eae561b3SGarrett Wollman 		if (sp == NULL) {
5818360efbdSAlfred Perlstein 			*cpp = sp = mem_alloc(nodesize);
5826448ec89SXin LI 			allocated = TRUE;
583eae561b3SGarrett Wollman 		}
584eae561b3SGarrett Wollman 		if (sp == NULL) {
5858360efbdSAlfred Perlstein 			warnx("xdr_bytes: out of memory");
586eae561b3SGarrett Wollman 			return (FALSE);
587eae561b3SGarrett Wollman 		}
5888360efbdSAlfred Perlstein 		/* FALLTHROUGH */
589eae561b3SGarrett Wollman 
590eae561b3SGarrett Wollman 	case XDR_ENCODE:
5916448ec89SXin LI 		ret = xdr_opaque(xdrs, sp, nodesize);
5926448ec89SXin LI 		if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
5936448ec89SXin LI 			if (allocated == TRUE) {
5946448ec89SXin LI 				free(sp);
5956448ec89SXin LI 				*cpp = NULL;
5966448ec89SXin LI 			}
5976448ec89SXin LI 		}
5986448ec89SXin LI 		return (ret);
599eae561b3SGarrett Wollman 
600eae561b3SGarrett Wollman 	case XDR_FREE:
601eae561b3SGarrett Wollman 		if (sp != NULL) {
602eae561b3SGarrett Wollman 			mem_free(sp, nodesize);
603eae561b3SGarrett Wollman 			*cpp = NULL;
604eae561b3SGarrett Wollman 		}
605eae561b3SGarrett Wollman 		return (TRUE);
606eae561b3SGarrett Wollman 	}
6078360efbdSAlfred Perlstein 	/* NOTREACHED */
608eae561b3SGarrett Wollman 	return (FALSE);
609eae561b3SGarrett Wollman }
610eae561b3SGarrett Wollman 
611eae561b3SGarrett Wollman /*
612eae561b3SGarrett Wollman  * Implemented here due to commonality of the object.
613eae561b3SGarrett Wollman  */
614eae561b3SGarrett Wollman bool_t
xdr_netobj(XDR * xdrs,struct netobj * np)615d660d38dSCraig Rodrigues xdr_netobj(XDR *xdrs, struct netobj *np)
616eae561b3SGarrett Wollman {
617eae561b3SGarrett Wollman 
618eae561b3SGarrett Wollman 	return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
619eae561b3SGarrett Wollman }
620eae561b3SGarrett Wollman 
621eae561b3SGarrett Wollman /*
62284970eabSrilysh  * XDR a discriminated union
623eae561b3SGarrett Wollman  * Support routine for discriminated unions.
624eae561b3SGarrett Wollman  * You create an array of xdrdiscrim structures, terminated with
625eae561b3SGarrett Wollman  * an entry with a null procedure pointer.  The routine gets
626eae561b3SGarrett Wollman  * the discriminant value and then searches the array of xdrdiscrims
627eae561b3SGarrett Wollman  * looking for that value.  It calls the procedure given in the xdrdiscrim
628eae561b3SGarrett Wollman  * to handle the discriminant.  If there is no specific routine a default
629eae561b3SGarrett Wollman  * routine may be called.
630eae561b3SGarrett Wollman  * If there is no specific or default routine an error is returned.
631eae561b3SGarrett Wollman  */
632eae561b3SGarrett Wollman bool_t
xdr_union(XDR * xdrs,enum_t * dscmp,char * unp,const struct xdr_discrim * choices,xdrproc_t dfault)633d660d38dSCraig Rodrigues xdr_union(XDR *xdrs, enum_t *dscmp, char *unp, const struct xdr_discrim *choices, xdrproc_t dfault)
634d660d38dSCraig Rodrigues /*
635d660d38dSCraig Rodrigues  *	XDR *xdrs;
636d660d38dSCraig Rodrigues  *	enum_t *dscmp;		// enum to decide which arm to work on
637d660d38dSCraig Rodrigues  *	char *unp;		// the union itself
638d660d38dSCraig Rodrigues  *	const struct xdr_discrim *choices;	// [value, xdr proc] for each arm
639d660d38dSCraig Rodrigues  *	xdrproc_t dfault;	// default xdr routine
640d660d38dSCraig Rodrigues  */
641eae561b3SGarrett Wollman {
6428360efbdSAlfred Perlstein 	enum_t dscm;
643eae561b3SGarrett Wollman 
644eae561b3SGarrett Wollman 	/*
645eae561b3SGarrett Wollman 	 * we deal with the discriminator;  it's an enum
646eae561b3SGarrett Wollman 	 */
647eae561b3SGarrett Wollman 	if (! xdr_enum(xdrs, dscmp)) {
648eae561b3SGarrett Wollman 		return (FALSE);
649eae561b3SGarrett Wollman 	}
650eae561b3SGarrett Wollman 	dscm = *dscmp;
651eae561b3SGarrett Wollman 
652eae561b3SGarrett Wollman 	/*
653eae561b3SGarrett Wollman 	 * search choices for a value that matches the discriminator.
654eae561b3SGarrett Wollman 	 * if we find one, execute the xdr routine for that value.
655eae561b3SGarrett Wollman 	 */
656eae561b3SGarrett Wollman 	for (; choices->proc != NULL_xdrproc_t; choices++) {
657eae561b3SGarrett Wollman 		if (choices->value == dscm)
6588360efbdSAlfred Perlstein 			return ((*(choices->proc))(xdrs, unp));
659eae561b3SGarrett Wollman 	}
660eae561b3SGarrett Wollman 
661eae561b3SGarrett Wollman 	/*
662eae561b3SGarrett Wollman 	 * no match - execute the default xdr routine if there is one
663eae561b3SGarrett Wollman 	 */
664eae561b3SGarrett Wollman 	return ((dfault == NULL_xdrproc_t) ? FALSE :
6658360efbdSAlfred Perlstein 	    (*dfault)(xdrs, unp));
666eae561b3SGarrett Wollman }
667eae561b3SGarrett Wollman 
668eae561b3SGarrett Wollman 
669eae561b3SGarrett Wollman /*
670eae561b3SGarrett Wollman  * Non-portable xdr primitives.
671eae561b3SGarrett Wollman  * Care should be taken when moving these routines to new architectures.
672eae561b3SGarrett Wollman  */
673eae561b3SGarrett Wollman 
674eae561b3SGarrett Wollman 
675eae561b3SGarrett Wollman /*
676eae561b3SGarrett Wollman  * XDR null terminated ASCII strings
677eae561b3SGarrett Wollman  * xdr_string deals with "C strings" - arrays of bytes that are
678eae561b3SGarrett Wollman  * terminated by a NULL character.  The parameter cpp references a
679eae561b3SGarrett Wollman  * pointer to storage; If the pointer is null, then the necessary
680eae561b3SGarrett Wollman  * storage is allocated.  The last parameter is the max allowed length
681eae561b3SGarrett Wollman  * of the string as specified by a protocol.
682eae561b3SGarrett Wollman  */
683eae561b3SGarrett Wollman bool_t
xdr_string(XDR * xdrs,char ** cpp,u_int maxsize)684d660d38dSCraig Rodrigues xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
685eae561b3SGarrett Wollman {
6868360efbdSAlfred Perlstein 	char *sp = *cpp;  /* sp is the actual string pointer */
687eae561b3SGarrett Wollman 	u_int size;
688eae561b3SGarrett Wollman 	u_int nodesize;
6896448ec89SXin LI 	bool_t ret, allocated = FALSE;
690eae561b3SGarrett Wollman 
691eae561b3SGarrett Wollman 	/*
692eae561b3SGarrett Wollman 	 * first deal with the length since xdr strings are counted-strings
693eae561b3SGarrett Wollman 	 */
694eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
695eae561b3SGarrett Wollman 	case XDR_FREE:
696eae561b3SGarrett Wollman 		if (sp == NULL) {
697eae561b3SGarrett Wollman 			return(TRUE);	/* already free */
698eae561b3SGarrett Wollman 		}
6998360efbdSAlfred Perlstein 		/* FALLTHROUGH */
700eae561b3SGarrett Wollman 	case XDR_ENCODE:
701eae561b3SGarrett Wollman 		size = strlen(sp);
702eae561b3SGarrett Wollman 		break;
7038360efbdSAlfred Perlstein 	case XDR_DECODE:
7048360efbdSAlfred Perlstein 		break;
705eae561b3SGarrett Wollman 	}
706eae561b3SGarrett Wollman 	if (! xdr_u_int(xdrs, &size)) {
707eae561b3SGarrett Wollman 		return (FALSE);
708eae561b3SGarrett Wollman 	}
709eae561b3SGarrett Wollman 	if (size > maxsize) {
710eae561b3SGarrett Wollman 		return (FALSE);
711eae561b3SGarrett Wollman 	}
712eae561b3SGarrett Wollman 	nodesize = size + 1;
713eae561b3SGarrett Wollman 
714eae561b3SGarrett Wollman 	/*
715eae561b3SGarrett Wollman 	 * now deal with the actual bytes
716eae561b3SGarrett Wollman 	 */
717eae561b3SGarrett Wollman 	switch (xdrs->x_op) {
718eae561b3SGarrett Wollman 
719eae561b3SGarrett Wollman 	case XDR_DECODE:
720eae561b3SGarrett Wollman 		if (nodesize == 0) {
721eae561b3SGarrett Wollman 			return (TRUE);
722eae561b3SGarrett Wollman 		}
7236448ec89SXin LI 		if (sp == NULL) {
7248360efbdSAlfred Perlstein 			*cpp = sp = mem_alloc(nodesize);
7256448ec89SXin LI 			allocated = TRUE;
7266448ec89SXin LI 		}
727eae561b3SGarrett Wollman 		if (sp == NULL) {
7288360efbdSAlfred Perlstein 			warnx("xdr_string: out of memory");
729eae561b3SGarrett Wollman 			return (FALSE);
730eae561b3SGarrett Wollman 		}
731eae561b3SGarrett Wollman 		sp[size] = 0;
7328360efbdSAlfred Perlstein 		/* FALLTHROUGH */
733eae561b3SGarrett Wollman 
734eae561b3SGarrett Wollman 	case XDR_ENCODE:
7356448ec89SXin LI 		ret = xdr_opaque(xdrs, sp, size);
7366448ec89SXin LI 		if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) {
7376448ec89SXin LI 			if (allocated == TRUE) {
7386448ec89SXin LI 				free(sp);
7396448ec89SXin LI 				*cpp = NULL;
7406448ec89SXin LI 			}
7416448ec89SXin LI 		}
7426448ec89SXin LI 		return (ret);
743eae561b3SGarrett Wollman 
744eae561b3SGarrett Wollman 	case XDR_FREE:
745eae561b3SGarrett Wollman 		mem_free(sp, nodesize);
746eae561b3SGarrett Wollman 		*cpp = NULL;
747eae561b3SGarrett Wollman 		return (TRUE);
748eae561b3SGarrett Wollman 	}
7498360efbdSAlfred Perlstein 	/* NOTREACHED */
750eae561b3SGarrett Wollman 	return (FALSE);
751eae561b3SGarrett Wollman }
752eae561b3SGarrett Wollman 
753eae561b3SGarrett Wollman /*
754eae561b3SGarrett Wollman  * Wrapper for xdr_string that can be called directly from
755eae561b3SGarrett Wollman  * routines like clnt_call
756eae561b3SGarrett Wollman  */
757eae561b3SGarrett Wollman bool_t
xdr_wrapstring(XDR * xdrs,char ** cpp)758d660d38dSCraig Rodrigues xdr_wrapstring(XDR *xdrs, char **cpp)
759eae561b3SGarrett Wollman {
7606448ec89SXin LI 	return xdr_string(xdrs, cpp, RPC_MAXDATASIZE);
761eae561b3SGarrett Wollman }
7628360efbdSAlfred Perlstein 
7638360efbdSAlfred Perlstein /*
7648360efbdSAlfred Perlstein  * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t()
7658360efbdSAlfred Perlstein  * are in the "non-portable" section because they require that a `long long'
7668360efbdSAlfred Perlstein  * be a 64-bit type.
7678360efbdSAlfred Perlstein  *
7688360efbdSAlfred Perlstein  *	--thorpej@netbsd.org, November 30, 1999
7698360efbdSAlfred Perlstein  */
7708360efbdSAlfred Perlstein 
7718360efbdSAlfred Perlstein /*
7728360efbdSAlfred Perlstein  * XDR 64-bit integers
7738360efbdSAlfred Perlstein  */
7748360efbdSAlfred Perlstein bool_t
xdr_int64_t(XDR * xdrs,int64_t * llp)775d660d38dSCraig Rodrigues xdr_int64_t(XDR *xdrs, int64_t *llp)
7768360efbdSAlfred Perlstein {
7778360efbdSAlfred Perlstein 	u_long ul[2];
7788360efbdSAlfred Perlstein 
7798360efbdSAlfred Perlstein 	switch (xdrs->x_op) {
7808360efbdSAlfred Perlstein 	case XDR_ENCODE:
7818360efbdSAlfred Perlstein 		ul[0] = (u_long)((u_int64_t)*llp >> 32) & 0xffffffff;
7828360efbdSAlfred Perlstein 		ul[1] = (u_long)((u_int64_t)*llp) & 0xffffffff;
7838360efbdSAlfred Perlstein 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
7848360efbdSAlfred Perlstein 			return (FALSE);
7858360efbdSAlfred Perlstein 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
7868360efbdSAlfred Perlstein 	case XDR_DECODE:
7878360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
7888360efbdSAlfred Perlstein 			return (FALSE);
7898360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
7908360efbdSAlfred Perlstein 			return (FALSE);
7918360efbdSAlfred Perlstein 		*llp = (int64_t)
7928360efbdSAlfred Perlstein 		    (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
7938360efbdSAlfred Perlstein 		return (TRUE);
7948360efbdSAlfred Perlstein 	case XDR_FREE:
7958360efbdSAlfred Perlstein 		return (TRUE);
7968360efbdSAlfred Perlstein 	}
7978360efbdSAlfred Perlstein 	/* NOTREACHED */
7988360efbdSAlfred Perlstein 	return (FALSE);
7998360efbdSAlfred Perlstein }
8008360efbdSAlfred Perlstein 
8018360efbdSAlfred Perlstein 
8028360efbdSAlfred Perlstein /*
8038360efbdSAlfred Perlstein  * XDR unsigned 64-bit integers
8048360efbdSAlfred Perlstein  */
8058360efbdSAlfred Perlstein bool_t
xdr_u_int64_t(XDR * xdrs,u_int64_t * ullp)806d660d38dSCraig Rodrigues xdr_u_int64_t(XDR *xdrs, u_int64_t *ullp)
8078360efbdSAlfred Perlstein {
8088360efbdSAlfred Perlstein 	u_long ul[2];
8098360efbdSAlfred Perlstein 
8108360efbdSAlfred Perlstein 	switch (xdrs->x_op) {
8118360efbdSAlfred Perlstein 	case XDR_ENCODE:
8128360efbdSAlfred Perlstein 		ul[0] = (u_long)(*ullp >> 32) & 0xffffffff;
8138360efbdSAlfred Perlstein 		ul[1] = (u_long)(*ullp) & 0xffffffff;
8148360efbdSAlfred Perlstein 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
8158360efbdSAlfred Perlstein 			return (FALSE);
8168360efbdSAlfred Perlstein 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
8178360efbdSAlfred Perlstein 	case XDR_DECODE:
8188360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
8198360efbdSAlfred Perlstein 			return (FALSE);
8208360efbdSAlfred Perlstein 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
8218360efbdSAlfred Perlstein 			return (FALSE);
8228360efbdSAlfred Perlstein 		*ullp = (u_int64_t)
8238360efbdSAlfred Perlstein 		    (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
8248360efbdSAlfred Perlstein 		return (TRUE);
8258360efbdSAlfred Perlstein 	case XDR_FREE:
8268360efbdSAlfred Perlstein 		return (TRUE);
8278360efbdSAlfred Perlstein 	}
8288360efbdSAlfred Perlstein 	/* NOTREACHED */
8298360efbdSAlfred Perlstein 	return (FALSE);
8308360efbdSAlfred Perlstein }
8318360efbdSAlfred Perlstein 
832a9148abdSDoug Rabson /*
833a9148abdSDoug Rabson  * XDR unsigned 64-bit integers
834a9148abdSDoug Rabson  */
835a9148abdSDoug Rabson bool_t
xdr_uint64_t(XDR * xdrs,uint64_t * ullp)836d660d38dSCraig Rodrigues xdr_uint64_t(XDR *xdrs, uint64_t *ullp)
837a9148abdSDoug Rabson {
838a9148abdSDoug Rabson 	u_long ul[2];
839a9148abdSDoug Rabson 
840a9148abdSDoug Rabson 	switch (xdrs->x_op) {
841a9148abdSDoug Rabson 	case XDR_ENCODE:
842a9148abdSDoug Rabson 		ul[0] = (u_long)(*ullp >> 32) & 0xffffffff;
843a9148abdSDoug Rabson 		ul[1] = (u_long)(*ullp) & 0xffffffff;
844a9148abdSDoug Rabson 		if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
845a9148abdSDoug Rabson 			return (FALSE);
846a9148abdSDoug Rabson 		return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
847a9148abdSDoug Rabson 	case XDR_DECODE:
848a9148abdSDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
849a9148abdSDoug Rabson 			return (FALSE);
850a9148abdSDoug Rabson 		if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
851a9148abdSDoug Rabson 			return (FALSE);
852a9148abdSDoug Rabson 		*ullp = (u_int64_t)
853a9148abdSDoug Rabson 		    (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
854a9148abdSDoug Rabson 		return (TRUE);
855a9148abdSDoug Rabson 	case XDR_FREE:
856a9148abdSDoug Rabson 		return (TRUE);
857a9148abdSDoug Rabson 	}
858a9148abdSDoug Rabson 	/* NOTREACHED */
859a9148abdSDoug Rabson 	return (FALSE);
860a9148abdSDoug Rabson }
861a9148abdSDoug Rabson 
8628360efbdSAlfred Perlstein 
8638360efbdSAlfred Perlstein /*
8648360efbdSAlfred Perlstein  * XDR hypers
8658360efbdSAlfred Perlstein  */
8668360efbdSAlfred Perlstein bool_t
xdr_hyper(XDR * xdrs,longlong_t * llp)867d660d38dSCraig Rodrigues xdr_hyper(XDR *xdrs, longlong_t *llp)
8688360efbdSAlfred Perlstein {
8698360efbdSAlfred Perlstein 
8708360efbdSAlfred Perlstein 	/*
8718360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
8728360efbdSAlfred Perlstein 	 * call xdr_int64_t().
8738360efbdSAlfred Perlstein 	 */
8748360efbdSAlfred Perlstein 	return (xdr_int64_t(xdrs, (int64_t *)llp));
8758360efbdSAlfred Perlstein }
8768360efbdSAlfred Perlstein 
8778360efbdSAlfred Perlstein 
8788360efbdSAlfred Perlstein /*
8798360efbdSAlfred Perlstein  * XDR unsigned hypers
8808360efbdSAlfred Perlstein  */
8818360efbdSAlfred Perlstein bool_t
xdr_u_hyper(XDR * xdrs,u_longlong_t * ullp)882d660d38dSCraig Rodrigues xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp)
8838360efbdSAlfred Perlstein {
8848360efbdSAlfred Perlstein 
8858360efbdSAlfred Perlstein 	/*
8868360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
8878360efbdSAlfred Perlstein 	 * call xdr_u_int64_t().
8888360efbdSAlfred Perlstein 	 */
8898360efbdSAlfred Perlstein 	return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
8908360efbdSAlfred Perlstein }
8918360efbdSAlfred Perlstein 
8928360efbdSAlfred Perlstein 
8938360efbdSAlfred Perlstein /*
8948360efbdSAlfred Perlstein  * XDR longlong_t's
8958360efbdSAlfred Perlstein  */
8968360efbdSAlfred Perlstein bool_t
xdr_longlong_t(XDR * xdrs,longlong_t * llp)897d660d38dSCraig Rodrigues xdr_longlong_t(XDR *xdrs, longlong_t *llp)
8988360efbdSAlfred Perlstein {
8998360efbdSAlfred Perlstein 
9008360efbdSAlfred Perlstein 	/*
9018360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
9028360efbdSAlfred Perlstein 	 * call xdr_int64_t().
9038360efbdSAlfred Perlstein 	 */
9048360efbdSAlfred Perlstein 	return (xdr_int64_t(xdrs, (int64_t *)llp));
9058360efbdSAlfred Perlstein }
9068360efbdSAlfred Perlstein 
9078360efbdSAlfred Perlstein 
9088360efbdSAlfred Perlstein /*
9098360efbdSAlfred Perlstein  * XDR u_longlong_t's
9108360efbdSAlfred Perlstein  */
9118360efbdSAlfred Perlstein bool_t
xdr_u_longlong_t(XDR * xdrs,u_longlong_t * ullp)912d660d38dSCraig Rodrigues xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp)
9138360efbdSAlfred Perlstein {
9148360efbdSAlfred Perlstein 
9158360efbdSAlfred Perlstein 	/*
9168360efbdSAlfred Perlstein 	 * Don't bother open-coding this; it's a fair amount of code.  Just
9178360efbdSAlfred Perlstein 	 * call xdr_u_int64_t().
9188360efbdSAlfred Perlstein 	 */
9198360efbdSAlfred Perlstein 	return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
9208360efbdSAlfred Perlstein }
921