1*84d9c625SLionel Sambuc /* $NetBSD: xdr.c,v 1.33 2013/03/11 20:19:29 tron Exp $ */
22fe8fb19SBen Gras
32fe8fb19SBen Gras /*
4*84d9c625SLionel Sambuc * Copyright (c) 2010, Oracle America, Inc.
52fe8fb19SBen Gras *
6*84d9c625SLionel Sambuc * Redistribution and use in source and binary forms, with or without
7*84d9c625SLionel Sambuc * modification, are permitted provided that the following conditions are
8*84d9c625SLionel Sambuc * met:
92fe8fb19SBen Gras *
10*84d9c625SLionel Sambuc * * Redistributions of source code must retain the above copyright
11*84d9c625SLionel Sambuc * notice, this list of conditions and the following disclaimer.
12*84d9c625SLionel Sambuc * * Redistributions in binary form must reproduce the above
13*84d9c625SLionel Sambuc * copyright notice, this list of conditions and the following
14*84d9c625SLionel Sambuc * disclaimer in the documentation and/or other materials
15*84d9c625SLionel Sambuc * provided with the distribution.
16*84d9c625SLionel Sambuc * * Neither the name of the "Oracle America, Inc." nor the names of its
17*84d9c625SLionel Sambuc * contributors may be used to endorse or promote products derived
18*84d9c625SLionel Sambuc * from this software without specific prior written permission.
192fe8fb19SBen Gras *
20*84d9c625SLionel Sambuc * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*84d9c625SLionel Sambuc * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*84d9c625SLionel Sambuc * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*84d9c625SLionel Sambuc * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24*84d9c625SLionel Sambuc * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25*84d9c625SLionel Sambuc * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26*84d9c625SLionel Sambuc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27*84d9c625SLionel Sambuc * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28*84d9c625SLionel Sambuc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29*84d9c625SLionel Sambuc * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30*84d9c625SLionel Sambuc * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31*84d9c625SLionel Sambuc * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
322fe8fb19SBen Gras */
332fe8fb19SBen Gras
342fe8fb19SBen Gras #include <sys/cdefs.h>
352fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
362fe8fb19SBen Gras #if 0
372fe8fb19SBen Gras static char *sccsid = "@(#)xdr.c 1.35 87/08/12";
382fe8fb19SBen Gras static char *sccsid = "@(#)xdr.c 2.1 88/07/29 4.0 RPCSRC";
392fe8fb19SBen Gras #else
40*84d9c625SLionel Sambuc __RCSID("$NetBSD: xdr.c,v 1.33 2013/03/11 20:19:29 tron Exp $");
412fe8fb19SBen Gras #endif
422fe8fb19SBen Gras #endif
432fe8fb19SBen Gras
442fe8fb19SBen Gras /*
452fe8fb19SBen Gras * xdr.c, Generic XDR routines implementation.
462fe8fb19SBen Gras *
472fe8fb19SBen Gras * Copyright (C) 1986, Sun Microsystems, Inc.
482fe8fb19SBen Gras *
492fe8fb19SBen Gras * These are the "generic" xdr routines used to serialize and de-serialize
502fe8fb19SBen Gras * most common data items. See xdr.h for more info on the interface to
512fe8fb19SBen Gras * xdr.
522fe8fb19SBen Gras */
532fe8fb19SBen Gras
542fe8fb19SBen Gras #include "namespace.h"
552fe8fb19SBen Gras
562fe8fb19SBen Gras #include <assert.h>
572fe8fb19SBen Gras #include <err.h>
582fe8fb19SBen Gras #include <stdio.h>
592fe8fb19SBen Gras #include <stdlib.h>
602fe8fb19SBen Gras #include <string.h>
612fe8fb19SBen Gras
622fe8fb19SBen Gras #include <rpc/types.h>
632fe8fb19SBen Gras #include <rpc/xdr.h>
642fe8fb19SBen Gras
652fe8fb19SBen Gras #ifdef __weak_alias
662fe8fb19SBen Gras __weak_alias(xdr_bool,_xdr_bool)
672fe8fb19SBen Gras __weak_alias(xdr_bytes,_xdr_bytes)
682fe8fb19SBen Gras __weak_alias(xdr_char,_xdr_char)
692fe8fb19SBen Gras __weak_alias(xdr_enum,_xdr_enum)
702fe8fb19SBen Gras __weak_alias(xdr_free,_xdr_free)
712fe8fb19SBen Gras __weak_alias(xdr_hyper,_xdr_hyper)
722fe8fb19SBen Gras __weak_alias(xdr_int,_xdr_int)
732fe8fb19SBen Gras __weak_alias(xdr_int16_t,_xdr_int16_t)
742fe8fb19SBen Gras __weak_alias(xdr_int32_t,_xdr_int32_t)
752fe8fb19SBen Gras __weak_alias(xdr_int64_t,_xdr_int64_t)
762fe8fb19SBen Gras __weak_alias(xdr_long,_xdr_long)
772fe8fb19SBen Gras __weak_alias(xdr_longlong_t,_xdr_longlong_t)
782fe8fb19SBen Gras __weak_alias(xdr_netobj,_xdr_netobj)
792fe8fb19SBen Gras __weak_alias(xdr_opaque,_xdr_opaque)
802fe8fb19SBen Gras __weak_alias(xdr_short,_xdr_short)
812fe8fb19SBen Gras __weak_alias(xdr_string,_xdr_string)
822fe8fb19SBen Gras __weak_alias(xdr_u_char,_xdr_u_char)
832fe8fb19SBen Gras __weak_alias(xdr_u_hyper,_xdr_u_hyper)
842fe8fb19SBen Gras __weak_alias(xdr_u_int,_xdr_u_int)
852fe8fb19SBen Gras __weak_alias(xdr_u_int16_t,_xdr_u_int16_t)
862fe8fb19SBen Gras __weak_alias(xdr_u_int32_t,_xdr_u_int32_t)
872fe8fb19SBen Gras __weak_alias(xdr_u_int64_t,_xdr_u_int64_t)
882fe8fb19SBen Gras __weak_alias(xdr_u_long,_xdr_u_long)
892fe8fb19SBen Gras __weak_alias(xdr_u_longlong_t,_xdr_u_longlong_t)
902fe8fb19SBen Gras __weak_alias(xdr_u_short,_xdr_u_short)
912fe8fb19SBen Gras __weak_alias(xdr_union,_xdr_union)
922fe8fb19SBen Gras __weak_alias(xdr_void,_xdr_void)
932fe8fb19SBen Gras __weak_alias(xdr_wrapstring,_xdr_wrapstring)
942fe8fb19SBen Gras #endif
952fe8fb19SBen Gras
962fe8fb19SBen Gras /*
972fe8fb19SBen Gras * constants specific to the xdr "protocol"
982fe8fb19SBen Gras */
992fe8fb19SBen Gras #define XDR_FALSE ((long) 0)
1002fe8fb19SBen Gras #define XDR_TRUE ((long) 1)
1012fe8fb19SBen Gras #define LASTUNSIGNED ((u_int) 0-1)
1022fe8fb19SBen Gras
1032fe8fb19SBen Gras /*
1042fe8fb19SBen Gras * for unit alignment
1052fe8fb19SBen Gras */
1062fe8fb19SBen Gras static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
1072fe8fb19SBen Gras
1082fe8fb19SBen Gras /*
1092fe8fb19SBen Gras * Free a data structure using XDR
1102fe8fb19SBen Gras * Not a filter, but a convenient utility nonetheless
1112fe8fb19SBen Gras */
1122fe8fb19SBen Gras void
xdr_free(xdrproc_t proc,char * objp)113f14fb602SLionel Sambuc xdr_free(xdrproc_t proc, char *objp)
1142fe8fb19SBen Gras {
1152fe8fb19SBen Gras XDR x;
1162fe8fb19SBen Gras
1172fe8fb19SBen Gras x.x_op = XDR_FREE;
1182fe8fb19SBen Gras (*proc)(&x, objp);
1192fe8fb19SBen Gras }
1202fe8fb19SBen Gras
1212fe8fb19SBen Gras /*
1222fe8fb19SBen Gras * XDR nothing
1232fe8fb19SBen Gras */
1242fe8fb19SBen Gras bool_t
xdr_void(void)125f14fb602SLionel Sambuc xdr_void(void) {
1262fe8fb19SBen Gras
1272fe8fb19SBen Gras return (TRUE);
1282fe8fb19SBen Gras }
1292fe8fb19SBen Gras
1302fe8fb19SBen Gras
1312fe8fb19SBen Gras /*
1322fe8fb19SBen Gras * XDR integers
1332fe8fb19SBen Gras */
1342fe8fb19SBen Gras bool_t
xdr_int(XDR * xdrs,int * ip)135f14fb602SLionel Sambuc xdr_int(XDR *xdrs, int *ip)
1362fe8fb19SBen Gras {
1372fe8fb19SBen Gras long l;
1382fe8fb19SBen Gras
1392fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
1402fe8fb19SBen Gras _DIAGASSERT(ip != NULL);
1412fe8fb19SBen Gras
1422fe8fb19SBen Gras switch (xdrs->x_op) {
1432fe8fb19SBen Gras
1442fe8fb19SBen Gras case XDR_ENCODE:
1452fe8fb19SBen Gras l = (long) *ip;
1462fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, &l));
1472fe8fb19SBen Gras
1482fe8fb19SBen Gras case XDR_DECODE:
1492fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, &l)) {
1502fe8fb19SBen Gras return (FALSE);
1512fe8fb19SBen Gras }
1522fe8fb19SBen Gras *ip = (int) l;
1532fe8fb19SBen Gras return (TRUE);
1542fe8fb19SBen Gras
1552fe8fb19SBen Gras case XDR_FREE:
1562fe8fb19SBen Gras return (TRUE);
1572fe8fb19SBen Gras }
1582fe8fb19SBen Gras /* NOTREACHED */
1592fe8fb19SBen Gras return (FALSE);
1602fe8fb19SBen Gras }
1612fe8fb19SBen Gras
1622fe8fb19SBen Gras /*
1632fe8fb19SBen Gras * XDR unsigned integers
1642fe8fb19SBen Gras */
1652fe8fb19SBen Gras bool_t
xdr_u_int(XDR * xdrs,u_int * up)166f14fb602SLionel Sambuc xdr_u_int(XDR *xdrs, u_int *up)
1672fe8fb19SBen Gras {
1682fe8fb19SBen Gras u_long l;
1692fe8fb19SBen Gras
1702fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
1712fe8fb19SBen Gras _DIAGASSERT(up != NULL);
1722fe8fb19SBen Gras
1732fe8fb19SBen Gras switch (xdrs->x_op) {
1742fe8fb19SBen Gras
1752fe8fb19SBen Gras case XDR_ENCODE:
1762fe8fb19SBen Gras l = (u_long) *up;
1772fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)&l));
1782fe8fb19SBen Gras
1792fe8fb19SBen Gras case XDR_DECODE:
1802fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, (long *)&l)) {
1812fe8fb19SBen Gras return (FALSE);
1822fe8fb19SBen Gras }
1832fe8fb19SBen Gras *up = (u_int) l;
1842fe8fb19SBen Gras return (TRUE);
1852fe8fb19SBen Gras
1862fe8fb19SBen Gras case XDR_FREE:
1872fe8fb19SBen Gras return (TRUE);
1882fe8fb19SBen Gras }
1892fe8fb19SBen Gras /* NOTREACHED */
1902fe8fb19SBen Gras return (FALSE);
1912fe8fb19SBen Gras }
1922fe8fb19SBen Gras
1932fe8fb19SBen Gras
1942fe8fb19SBen Gras /*
1952fe8fb19SBen Gras * XDR long integers
1962fe8fb19SBen Gras * same as xdr_u_long - open coded to save a proc call!
1972fe8fb19SBen Gras */
1982fe8fb19SBen Gras bool_t
xdr_long(XDR * xdrs,long * lp)199f14fb602SLionel Sambuc xdr_long(XDR *xdrs, long *lp)
2002fe8fb19SBen Gras {
2012fe8fb19SBen Gras
2022fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
2032fe8fb19SBen Gras _DIAGASSERT(lp != NULL);
2042fe8fb19SBen Gras
2052fe8fb19SBen Gras switch (xdrs->x_op) {
2062fe8fb19SBen Gras case XDR_ENCODE:
2072fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, lp));
2082fe8fb19SBen Gras case XDR_DECODE:
2092fe8fb19SBen Gras return (XDR_GETLONG(xdrs, lp));
2102fe8fb19SBen Gras case XDR_FREE:
2112fe8fb19SBen Gras return (TRUE);
2122fe8fb19SBen Gras }
2132fe8fb19SBen Gras /* NOTREACHED */
2142fe8fb19SBen Gras return (FALSE);
2152fe8fb19SBen Gras }
2162fe8fb19SBen Gras
2172fe8fb19SBen Gras /*
2182fe8fb19SBen Gras * XDR unsigned long integers
2192fe8fb19SBen Gras * same as xdr_long - open coded to save a proc call!
2202fe8fb19SBen Gras */
2212fe8fb19SBen Gras bool_t
xdr_u_long(XDR * xdrs,u_long * ulp)222f14fb602SLionel Sambuc xdr_u_long(XDR *xdrs, u_long *ulp)
2232fe8fb19SBen Gras {
2242fe8fb19SBen Gras
2252fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
2262fe8fb19SBen Gras _DIAGASSERT(ulp != NULL);
2272fe8fb19SBen Gras
2282fe8fb19SBen Gras switch (xdrs->x_op) {
2292fe8fb19SBen Gras case XDR_ENCODE:
2302fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)ulp));
2312fe8fb19SBen Gras case XDR_DECODE:
2322fe8fb19SBen Gras return (XDR_GETLONG(xdrs, (long *)ulp));
2332fe8fb19SBen Gras case XDR_FREE:
2342fe8fb19SBen Gras return (TRUE);
2352fe8fb19SBen Gras }
2362fe8fb19SBen Gras /* NOTREACHED */
2372fe8fb19SBen Gras return (FALSE);
2382fe8fb19SBen Gras }
2392fe8fb19SBen Gras
2402fe8fb19SBen Gras
2412fe8fb19SBen Gras /*
2422fe8fb19SBen Gras * XDR 32-bit integers
2432fe8fb19SBen Gras * same as xdr_u_int32_t - open coded to save a proc call!
2442fe8fb19SBen Gras */
2452fe8fb19SBen Gras bool_t
xdr_int32_t(XDR * xdrs,int32_t * int32_p)246f14fb602SLionel Sambuc xdr_int32_t(XDR *xdrs, int32_t *int32_p)
2472fe8fb19SBen Gras {
2482fe8fb19SBen Gras long l;
2492fe8fb19SBen Gras
2502fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
2512fe8fb19SBen Gras _DIAGASSERT(int32_p != NULL);
2522fe8fb19SBen Gras
2532fe8fb19SBen Gras switch (xdrs->x_op) {
2542fe8fb19SBen Gras
2552fe8fb19SBen Gras case XDR_ENCODE:
2562fe8fb19SBen Gras l = (long) *int32_p;
2572fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, &l));
2582fe8fb19SBen Gras
2592fe8fb19SBen Gras case XDR_DECODE:
2602fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, &l)) {
2612fe8fb19SBen Gras return (FALSE);
2622fe8fb19SBen Gras }
2632fe8fb19SBen Gras *int32_p = (int32_t) l;
2642fe8fb19SBen Gras return (TRUE);
2652fe8fb19SBen Gras
2662fe8fb19SBen Gras case XDR_FREE:
2672fe8fb19SBen Gras return (TRUE);
2682fe8fb19SBen Gras }
2692fe8fb19SBen Gras /* NOTREACHED */
2702fe8fb19SBen Gras return (FALSE);
2712fe8fb19SBen Gras }
2722fe8fb19SBen Gras
2732fe8fb19SBen Gras /*
2742fe8fb19SBen Gras * XDR unsigned 32-bit integers
2752fe8fb19SBen Gras * same as xdr_int32_t - open coded to save a proc call!
2762fe8fb19SBen Gras */
2772fe8fb19SBen Gras bool_t
xdr_u_int32_t(XDR * xdrs,u_int32_t * u_int32_p)278f14fb602SLionel Sambuc xdr_u_int32_t(XDR *xdrs, u_int32_t *u_int32_p)
2792fe8fb19SBen Gras {
2802fe8fb19SBen Gras u_long l;
2812fe8fb19SBen Gras
2822fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
2832fe8fb19SBen Gras _DIAGASSERT(u_int32_p != NULL);
2842fe8fb19SBen Gras
2852fe8fb19SBen Gras switch (xdrs->x_op) {
2862fe8fb19SBen Gras
2872fe8fb19SBen Gras case XDR_ENCODE:
2882fe8fb19SBen Gras l = (u_long) *u_int32_p;
2892fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)&l));
2902fe8fb19SBen Gras
2912fe8fb19SBen Gras case XDR_DECODE:
2922fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, (long *)&l)) {
2932fe8fb19SBen Gras return (FALSE);
2942fe8fb19SBen Gras }
2952fe8fb19SBen Gras *u_int32_p = (u_int32_t) l;
2962fe8fb19SBen Gras return (TRUE);
2972fe8fb19SBen Gras
2982fe8fb19SBen Gras case XDR_FREE:
2992fe8fb19SBen Gras return (TRUE);
3002fe8fb19SBen Gras }
3012fe8fb19SBen Gras /* NOTREACHED */
3022fe8fb19SBen Gras return (FALSE);
3032fe8fb19SBen Gras }
3042fe8fb19SBen Gras
3052fe8fb19SBen Gras
3062fe8fb19SBen Gras /*
3072fe8fb19SBen Gras * XDR short integers
3082fe8fb19SBen Gras */
3092fe8fb19SBen Gras bool_t
xdr_short(XDR * xdrs,short * sp)310f14fb602SLionel Sambuc xdr_short(XDR *xdrs, short *sp)
3112fe8fb19SBen Gras {
3122fe8fb19SBen Gras long l;
3132fe8fb19SBen Gras
3142fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
3152fe8fb19SBen Gras _DIAGASSERT(sp != NULL);
3162fe8fb19SBen Gras
3172fe8fb19SBen Gras switch (xdrs->x_op) {
3182fe8fb19SBen Gras
3192fe8fb19SBen Gras case XDR_ENCODE:
3202fe8fb19SBen Gras l = (long) *sp;
3212fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, &l));
3222fe8fb19SBen Gras
3232fe8fb19SBen Gras case XDR_DECODE:
3242fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, &l)) {
3252fe8fb19SBen Gras return (FALSE);
3262fe8fb19SBen Gras }
3272fe8fb19SBen Gras *sp = (short) l;
3282fe8fb19SBen Gras return (TRUE);
3292fe8fb19SBen Gras
3302fe8fb19SBen Gras case XDR_FREE:
3312fe8fb19SBen Gras return (TRUE);
3322fe8fb19SBen Gras }
3332fe8fb19SBen Gras /* NOTREACHED */
3342fe8fb19SBen Gras return (FALSE);
3352fe8fb19SBen Gras }
3362fe8fb19SBen Gras
3372fe8fb19SBen Gras /*
3382fe8fb19SBen Gras * XDR unsigned short integers
3392fe8fb19SBen Gras */
3402fe8fb19SBen Gras bool_t
xdr_u_short(XDR * xdrs,u_short * usp)341f14fb602SLionel Sambuc xdr_u_short(XDR *xdrs, u_short *usp)
3422fe8fb19SBen Gras {
3432fe8fb19SBen Gras u_long l;
3442fe8fb19SBen Gras
3452fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
3462fe8fb19SBen Gras _DIAGASSERT(usp != NULL);
3472fe8fb19SBen Gras
3482fe8fb19SBen Gras switch (xdrs->x_op) {
3492fe8fb19SBen Gras
3502fe8fb19SBen Gras case XDR_ENCODE:
3512fe8fb19SBen Gras l = (u_long) *usp;
3522fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)&l));
3532fe8fb19SBen Gras
3542fe8fb19SBen Gras case XDR_DECODE:
3552fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, (long *)&l)) {
3562fe8fb19SBen Gras return (FALSE);
3572fe8fb19SBen Gras }
3582fe8fb19SBen Gras *usp = (u_short) l;
3592fe8fb19SBen Gras return (TRUE);
3602fe8fb19SBen Gras
3612fe8fb19SBen Gras case XDR_FREE:
3622fe8fb19SBen Gras return (TRUE);
3632fe8fb19SBen Gras }
3642fe8fb19SBen Gras /* NOTREACHED */
3652fe8fb19SBen Gras return (FALSE);
3662fe8fb19SBen Gras }
3672fe8fb19SBen Gras
3682fe8fb19SBen Gras
3692fe8fb19SBen Gras /*
3702fe8fb19SBen Gras * XDR 16-bit integers
3712fe8fb19SBen Gras */
3722fe8fb19SBen Gras bool_t
xdr_int16_t(XDR * xdrs,int16_t * int16_p)373f14fb602SLionel Sambuc xdr_int16_t(XDR *xdrs, int16_t *int16_p)
3742fe8fb19SBen Gras {
3752fe8fb19SBen Gras long l;
3762fe8fb19SBen Gras
3772fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
3782fe8fb19SBen Gras _DIAGASSERT(int16_p != NULL);
3792fe8fb19SBen Gras
3802fe8fb19SBen Gras switch (xdrs->x_op) {
3812fe8fb19SBen Gras
3822fe8fb19SBen Gras case XDR_ENCODE:
3832fe8fb19SBen Gras l = (long) *int16_p;
3842fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, &l));
3852fe8fb19SBen Gras
3862fe8fb19SBen Gras case XDR_DECODE:
3872fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, &l)) {
3882fe8fb19SBen Gras return (FALSE);
3892fe8fb19SBen Gras }
3902fe8fb19SBen Gras *int16_p = (int16_t) l;
3912fe8fb19SBen Gras return (TRUE);
3922fe8fb19SBen Gras
3932fe8fb19SBen Gras case XDR_FREE:
3942fe8fb19SBen Gras return (TRUE);
3952fe8fb19SBen Gras }
3962fe8fb19SBen Gras /* NOTREACHED */
3972fe8fb19SBen Gras return (FALSE);
3982fe8fb19SBen Gras }
3992fe8fb19SBen Gras
4002fe8fb19SBen Gras /*
4012fe8fb19SBen Gras * XDR unsigned 16-bit integers
4022fe8fb19SBen Gras */
4032fe8fb19SBen Gras bool_t
xdr_u_int16_t(XDR * xdrs,u_int16_t * u_int16_p)404f14fb602SLionel Sambuc xdr_u_int16_t(XDR *xdrs, u_int16_t *u_int16_p)
4052fe8fb19SBen Gras {
4062fe8fb19SBen Gras u_long l;
4072fe8fb19SBen Gras
4082fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
4092fe8fb19SBen Gras _DIAGASSERT(u_int16_p != NULL);
4102fe8fb19SBen Gras
4112fe8fb19SBen Gras switch (xdrs->x_op) {
4122fe8fb19SBen Gras
4132fe8fb19SBen Gras case XDR_ENCODE:
4142fe8fb19SBen Gras l = (u_long) *u_int16_p;
4152fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)&l));
4162fe8fb19SBen Gras
4172fe8fb19SBen Gras case XDR_DECODE:
4182fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, (long *)&l)) {
4192fe8fb19SBen Gras return (FALSE);
4202fe8fb19SBen Gras }
4212fe8fb19SBen Gras *u_int16_p = (u_int16_t) l;
4222fe8fb19SBen Gras return (TRUE);
4232fe8fb19SBen Gras
4242fe8fb19SBen Gras case XDR_FREE:
4252fe8fb19SBen Gras return (TRUE);
4262fe8fb19SBen Gras }
4272fe8fb19SBen Gras /* NOTREACHED */
4282fe8fb19SBen Gras return (FALSE);
4292fe8fb19SBen Gras }
4302fe8fb19SBen Gras
4312fe8fb19SBen Gras
4322fe8fb19SBen Gras /*
4332fe8fb19SBen Gras * XDR a char
4342fe8fb19SBen Gras */
4352fe8fb19SBen Gras bool_t
xdr_char(XDR * xdrs,char * cp)436f14fb602SLionel Sambuc xdr_char(XDR *xdrs, char *cp)
4372fe8fb19SBen Gras {
4382fe8fb19SBen Gras int i;
4392fe8fb19SBen Gras
4402fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
4412fe8fb19SBen Gras _DIAGASSERT(cp != NULL);
4422fe8fb19SBen Gras
4432fe8fb19SBen Gras i = (*cp);
4442fe8fb19SBen Gras if (!xdr_int(xdrs, &i)) {
4452fe8fb19SBen Gras return (FALSE);
4462fe8fb19SBen Gras }
4472fe8fb19SBen Gras *cp = i;
4482fe8fb19SBen Gras return (TRUE);
4492fe8fb19SBen Gras }
4502fe8fb19SBen Gras
4512fe8fb19SBen Gras /*
4522fe8fb19SBen Gras * XDR an unsigned char
4532fe8fb19SBen Gras */
4542fe8fb19SBen Gras bool_t
xdr_u_char(XDR * xdrs,u_char * cp)455f14fb602SLionel Sambuc xdr_u_char(XDR *xdrs, u_char *cp)
4562fe8fb19SBen Gras {
4572fe8fb19SBen Gras u_int u;
4582fe8fb19SBen Gras
4592fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
4602fe8fb19SBen Gras _DIAGASSERT(cp != NULL);
4612fe8fb19SBen Gras
4622fe8fb19SBen Gras u = (*cp);
4632fe8fb19SBen Gras if (!xdr_u_int(xdrs, &u)) {
4642fe8fb19SBen Gras return (FALSE);
4652fe8fb19SBen Gras }
4662fe8fb19SBen Gras *cp = u;
4672fe8fb19SBen Gras return (TRUE);
4682fe8fb19SBen Gras }
4692fe8fb19SBen Gras
4702fe8fb19SBen Gras /*
4712fe8fb19SBen Gras * XDR booleans
4722fe8fb19SBen Gras */
4732fe8fb19SBen Gras bool_t
xdr_bool(XDR * xdrs,bool_t * bp)474f14fb602SLionel Sambuc xdr_bool(XDR *xdrs, bool_t *bp)
4752fe8fb19SBen Gras {
4762fe8fb19SBen Gras long lb;
4772fe8fb19SBen Gras
4782fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
4792fe8fb19SBen Gras _DIAGASSERT(bp != NULL);
4802fe8fb19SBen Gras
4812fe8fb19SBen Gras switch (xdrs->x_op) {
4822fe8fb19SBen Gras
4832fe8fb19SBen Gras case XDR_ENCODE:
4842fe8fb19SBen Gras lb = *bp ? XDR_TRUE : XDR_FALSE;
4852fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, &lb));
4862fe8fb19SBen Gras
4872fe8fb19SBen Gras case XDR_DECODE:
4882fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, &lb)) {
4892fe8fb19SBen Gras return (FALSE);
4902fe8fb19SBen Gras }
4912fe8fb19SBen Gras *bp = (lb == XDR_FALSE) ? FALSE : TRUE;
4922fe8fb19SBen Gras return (TRUE);
4932fe8fb19SBen Gras
4942fe8fb19SBen Gras case XDR_FREE:
4952fe8fb19SBen Gras return (TRUE);
4962fe8fb19SBen Gras }
4972fe8fb19SBen Gras /* NOTREACHED */
4982fe8fb19SBen Gras return (FALSE);
4992fe8fb19SBen Gras }
5002fe8fb19SBen Gras
5012fe8fb19SBen Gras /*
5022fe8fb19SBen Gras * XDR enumerations
5032fe8fb19SBen Gras */
5042fe8fb19SBen Gras bool_t
xdr_enum(XDR * xdrs,enum_t * ep)505f14fb602SLionel Sambuc xdr_enum(XDR *xdrs, enum_t *ep)
5062fe8fb19SBen Gras {
5072fe8fb19SBen Gras long l;
5082fe8fb19SBen Gras
5092fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
5102fe8fb19SBen Gras _DIAGASSERT(ep != NULL);
5112fe8fb19SBen Gras
5122fe8fb19SBen Gras switch (xdrs->x_op) {
5132fe8fb19SBen Gras
5142fe8fb19SBen Gras case XDR_ENCODE:
5152fe8fb19SBen Gras l = (long) *ep;
5162fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, &l));
5172fe8fb19SBen Gras
5182fe8fb19SBen Gras case XDR_DECODE:
5192fe8fb19SBen Gras if (!XDR_GETLONG(xdrs, &l)) {
5202fe8fb19SBen Gras return (FALSE);
5212fe8fb19SBen Gras }
5222fe8fb19SBen Gras *ep = (enum_t) l;
5232fe8fb19SBen Gras return (TRUE);
5242fe8fb19SBen Gras
5252fe8fb19SBen Gras case XDR_FREE:
5262fe8fb19SBen Gras return (TRUE);
5272fe8fb19SBen Gras }
5282fe8fb19SBen Gras /* NOTREACHED */
5292fe8fb19SBen Gras return (FALSE);
5302fe8fb19SBen Gras }
5312fe8fb19SBen Gras
5322fe8fb19SBen Gras /*
5332fe8fb19SBen Gras * XDR opaque data
5342fe8fb19SBen Gras * Allows the specification of a fixed size sequence of opaque bytes.
5352fe8fb19SBen Gras * cp points to the opaque object and cnt gives the byte length.
5362fe8fb19SBen Gras */
5372fe8fb19SBen Gras bool_t
xdr_opaque(XDR * xdrs,caddr_t cp,u_int cnt)538f14fb602SLionel Sambuc xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt)
5392fe8fb19SBen Gras {
5402fe8fb19SBen Gras u_int rndup;
5412fe8fb19SBen Gras static int crud[BYTES_PER_XDR_UNIT];
5422fe8fb19SBen Gras
5432fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
5442fe8fb19SBen Gras /*
5452fe8fb19SBen Gras * if no data we are done
5462fe8fb19SBen Gras */
5472fe8fb19SBen Gras if (cnt == 0)
5482fe8fb19SBen Gras return (TRUE);
5492fe8fb19SBen Gras _DIAGASSERT(cp != NULL);
5502fe8fb19SBen Gras
5512fe8fb19SBen Gras /*
5522fe8fb19SBen Gras * round byte count to full xdr units
5532fe8fb19SBen Gras */
5542fe8fb19SBen Gras rndup = cnt % BYTES_PER_XDR_UNIT;
5552fe8fb19SBen Gras if (rndup > 0)
5562fe8fb19SBen Gras rndup = BYTES_PER_XDR_UNIT - rndup;
5572fe8fb19SBen Gras
5582fe8fb19SBen Gras if (xdrs->x_op == XDR_DECODE) {
5592fe8fb19SBen Gras if (!XDR_GETBYTES(xdrs, cp, cnt)) {
5602fe8fb19SBen Gras return (FALSE);
5612fe8fb19SBen Gras }
5622fe8fb19SBen Gras if (rndup == 0)
5632fe8fb19SBen Gras return (TRUE);
5642fe8fb19SBen Gras return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup));
5652fe8fb19SBen Gras }
5662fe8fb19SBen Gras
5672fe8fb19SBen Gras if (xdrs->x_op == XDR_ENCODE) {
5682fe8fb19SBen Gras if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
5692fe8fb19SBen Gras return (FALSE);
5702fe8fb19SBen Gras }
5712fe8fb19SBen Gras if (rndup == 0)
5722fe8fb19SBen Gras return (TRUE);
5732fe8fb19SBen Gras return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
5742fe8fb19SBen Gras }
5752fe8fb19SBen Gras
5762fe8fb19SBen Gras if (xdrs->x_op == XDR_FREE) {
5772fe8fb19SBen Gras return (TRUE);
5782fe8fb19SBen Gras }
5792fe8fb19SBen Gras
5802fe8fb19SBen Gras return (FALSE);
5812fe8fb19SBen Gras }
5822fe8fb19SBen Gras
5832fe8fb19SBen Gras /*
5842fe8fb19SBen Gras * XDR counted bytes
5852fe8fb19SBen Gras * *cpp is a pointer to the bytes, *sizep is the count.
5862fe8fb19SBen Gras * If *cpp is NULL maxsize bytes are allocated
5872fe8fb19SBen Gras */
5882fe8fb19SBen Gras bool_t
xdr_bytes(XDR * xdrs,char ** cpp,u_int * sizep,u_int maxsize)589f14fb602SLionel Sambuc xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize)
5902fe8fb19SBen Gras {
5912fe8fb19SBen Gras char *sp; /* sp is the actual string pointer */
5922fe8fb19SBen Gras u_int nodesize;
5932fe8fb19SBen Gras
5942fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
5952fe8fb19SBen Gras _DIAGASSERT(cpp != NULL);
5962fe8fb19SBen Gras _DIAGASSERT(sizep != NULL);
5972fe8fb19SBen Gras
5982fe8fb19SBen Gras sp = *cpp;
5992fe8fb19SBen Gras
6002fe8fb19SBen Gras /*
6012fe8fb19SBen Gras * first deal with the length since xdr bytes are counted
6022fe8fb19SBen Gras */
6032fe8fb19SBen Gras if (! xdr_u_int(xdrs, sizep)) {
6042fe8fb19SBen Gras return (FALSE);
6052fe8fb19SBen Gras }
6062fe8fb19SBen Gras nodesize = *sizep;
6072fe8fb19SBen Gras if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
6082fe8fb19SBen Gras return (FALSE);
6092fe8fb19SBen Gras }
6102fe8fb19SBen Gras
6112fe8fb19SBen Gras /*
6122fe8fb19SBen Gras * now deal with the actual bytes
6132fe8fb19SBen Gras */
6142fe8fb19SBen Gras switch (xdrs->x_op) {
6152fe8fb19SBen Gras
6162fe8fb19SBen Gras case XDR_DECODE:
6172fe8fb19SBen Gras if (nodesize == 0) {
6182fe8fb19SBen Gras return (TRUE);
6192fe8fb19SBen Gras }
6202fe8fb19SBen Gras if (sp == NULL) {
6212fe8fb19SBen Gras *cpp = sp = mem_alloc(nodesize);
6222fe8fb19SBen Gras }
6232fe8fb19SBen Gras if (sp == NULL) {
624*84d9c625SLionel Sambuc warn("%s: out of memory", __func__);
6252fe8fb19SBen Gras return (FALSE);
6262fe8fb19SBen Gras }
6272fe8fb19SBen Gras /* FALLTHROUGH */
6282fe8fb19SBen Gras
6292fe8fb19SBen Gras case XDR_ENCODE:
6302fe8fb19SBen Gras return (xdr_opaque(xdrs, sp, nodesize));
6312fe8fb19SBen Gras
6322fe8fb19SBen Gras case XDR_FREE:
6332fe8fb19SBen Gras if (sp != NULL) {
6342fe8fb19SBen Gras mem_free(sp, nodesize);
6352fe8fb19SBen Gras *cpp = NULL;
6362fe8fb19SBen Gras }
6372fe8fb19SBen Gras return (TRUE);
6382fe8fb19SBen Gras }
6392fe8fb19SBen Gras /* NOTREACHED */
6402fe8fb19SBen Gras return (FALSE);
6412fe8fb19SBen Gras }
6422fe8fb19SBen Gras
6432fe8fb19SBen Gras /*
6442fe8fb19SBen Gras * Implemented here due to commonality of the object.
6452fe8fb19SBen Gras */
6462fe8fb19SBen Gras bool_t
xdr_netobj(XDR * xdrs,struct netobj * np)647f14fb602SLionel Sambuc xdr_netobj(XDR *xdrs, struct netobj *np)
6482fe8fb19SBen Gras {
6492fe8fb19SBen Gras
6502fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
6512fe8fb19SBen Gras _DIAGASSERT(np != NULL);
6522fe8fb19SBen Gras
6532fe8fb19SBen Gras return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
6542fe8fb19SBen Gras }
6552fe8fb19SBen Gras
6562fe8fb19SBen Gras /*
6572fe8fb19SBen Gras * XDR a descriminated union
6582fe8fb19SBen Gras * Support routine for discriminated unions.
6592fe8fb19SBen Gras * You create an array of xdrdiscrim structures, terminated with
6602fe8fb19SBen Gras * an entry with a null procedure pointer. The routine gets
6612fe8fb19SBen Gras * the discriminant value and then searches the array of xdrdiscrims
6622fe8fb19SBen Gras * looking for that value. It calls the procedure given in the xdrdiscrim
6632fe8fb19SBen Gras * to handle the discriminant. If there is no specific routine a default
6642fe8fb19SBen Gras * routine may be called.
6652fe8fb19SBen Gras * If there is no specific or default routine an error is returned.
6662fe8fb19SBen Gras */
6672fe8fb19SBen Gras bool_t
xdr_union(XDR * xdrs,enum_t * dscmp,char * unp,const struct xdr_discrim * choices,xdrproc_t dfault)668f14fb602SLionel Sambuc xdr_union(
669f14fb602SLionel Sambuc XDR *xdrs,
670f14fb602SLionel Sambuc enum_t *dscmp, /* enum to decide which arm to work on */
671f14fb602SLionel Sambuc char *unp, /* the union itself */
672f14fb602SLionel Sambuc const struct xdr_discrim *choices, /* [value, xdr proc] for each arm */
673f14fb602SLionel Sambuc xdrproc_t dfault /* default xdr routine */
674f14fb602SLionel Sambuc )
6752fe8fb19SBen Gras {
6762fe8fb19SBen Gras enum_t dscm;
6772fe8fb19SBen Gras
6782fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
6792fe8fb19SBen Gras _DIAGASSERT(dscmp != NULL);
6802fe8fb19SBen Gras _DIAGASSERT(unp != NULL);
6812fe8fb19SBen Gras _DIAGASSERT(choices != NULL);
6822fe8fb19SBen Gras /* dfault may be NULL */
6832fe8fb19SBen Gras
6842fe8fb19SBen Gras /*
6852fe8fb19SBen Gras * we deal with the discriminator; it's an enum
6862fe8fb19SBen Gras */
6872fe8fb19SBen Gras if (! xdr_enum(xdrs, dscmp)) {
6882fe8fb19SBen Gras return (FALSE);
6892fe8fb19SBen Gras }
6902fe8fb19SBen Gras dscm = *dscmp;
6912fe8fb19SBen Gras
6922fe8fb19SBen Gras /*
6932fe8fb19SBen Gras * search choices for a value that matches the discriminator.
6942fe8fb19SBen Gras * if we find one, execute the xdr routine for that value.
6952fe8fb19SBen Gras */
6962fe8fb19SBen Gras for (; choices->proc != NULL_xdrproc_t; choices++) {
6972fe8fb19SBen Gras if (choices->value == dscm)
6982fe8fb19SBen Gras return ((*(choices->proc))(xdrs, unp));
6992fe8fb19SBen Gras }
7002fe8fb19SBen Gras
7012fe8fb19SBen Gras /*
7022fe8fb19SBen Gras * no match - execute the default xdr routine if there is one
7032fe8fb19SBen Gras */
7042fe8fb19SBen Gras return ((dfault == NULL_xdrproc_t) ? FALSE :
7052fe8fb19SBen Gras (*dfault)(xdrs, unp));
7062fe8fb19SBen Gras }
7072fe8fb19SBen Gras
7082fe8fb19SBen Gras
7092fe8fb19SBen Gras /*
7102fe8fb19SBen Gras * Non-portable xdr primitives.
7112fe8fb19SBen Gras * Care should be taken when moving these routines to new architectures.
7122fe8fb19SBen Gras */
7132fe8fb19SBen Gras
7142fe8fb19SBen Gras
7152fe8fb19SBen Gras /*
7162fe8fb19SBen Gras * XDR null terminated ASCII strings
7172fe8fb19SBen Gras * xdr_string deals with "C strings" - arrays of bytes that are
7182fe8fb19SBen Gras * terminated by a NULL character. The parameter cpp references a
7192fe8fb19SBen Gras * pointer to storage; If the pointer is null, then the necessary
7202fe8fb19SBen Gras * storage is allocated. The last parameter is the max allowed length
7212fe8fb19SBen Gras * of the string as specified by a protocol.
7222fe8fb19SBen Gras */
7232fe8fb19SBen Gras bool_t
xdr_string(XDR * xdrs,char ** cpp,u_int maxsize)724f14fb602SLionel Sambuc xdr_string(XDR *xdrs, char **cpp, u_int maxsize)
7252fe8fb19SBen Gras {
7262fe8fb19SBen Gras char *sp; /* sp is the actual string pointer */
7272fe8fb19SBen Gras u_int size = 0; /* XXX: GCC */
7282fe8fb19SBen Gras u_int nodesize;
729f14fb602SLionel Sambuc size_t len;
7302fe8fb19SBen Gras
7312fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
7322fe8fb19SBen Gras _DIAGASSERT(cpp != NULL);
7332fe8fb19SBen Gras
7342fe8fb19SBen Gras sp = *cpp;
7352fe8fb19SBen Gras
7362fe8fb19SBen Gras /*
7372fe8fb19SBen Gras * first deal with the length since xdr strings are counted-strings
7382fe8fb19SBen Gras */
7392fe8fb19SBen Gras switch (xdrs->x_op) {
7402fe8fb19SBen Gras case XDR_FREE:
7412fe8fb19SBen Gras if (sp == NULL) {
7422fe8fb19SBen Gras return(TRUE); /* already free */
7432fe8fb19SBen Gras }
7442fe8fb19SBen Gras /* FALLTHROUGH */
7452fe8fb19SBen Gras case XDR_ENCODE:
746f14fb602SLionel Sambuc len = strlen(sp);
747f14fb602SLionel Sambuc _DIAGASSERT(__type_fit(u_int, len));
748f14fb602SLionel Sambuc size = (u_int)len;
7492fe8fb19SBen Gras break;
7502fe8fb19SBen Gras case XDR_DECODE:
7512fe8fb19SBen Gras break;
7522fe8fb19SBen Gras }
7532fe8fb19SBen Gras if (! xdr_u_int(xdrs, &size)) {
7542fe8fb19SBen Gras return (FALSE);
7552fe8fb19SBen Gras }
7562fe8fb19SBen Gras if (size > maxsize) {
7572fe8fb19SBen Gras return (FALSE);
7582fe8fb19SBen Gras }
7592fe8fb19SBen Gras nodesize = size + 1;
7602fe8fb19SBen Gras
7612fe8fb19SBen Gras /*
7622fe8fb19SBen Gras * now deal with the actual bytes
7632fe8fb19SBen Gras */
7642fe8fb19SBen Gras switch (xdrs->x_op) {
7652fe8fb19SBen Gras
7662fe8fb19SBen Gras case XDR_DECODE:
7672fe8fb19SBen Gras if (nodesize == 0) {
7682fe8fb19SBen Gras return (TRUE);
7692fe8fb19SBen Gras }
7702fe8fb19SBen Gras if (sp == NULL)
7712fe8fb19SBen Gras *cpp = sp = mem_alloc(nodesize);
7722fe8fb19SBen Gras if (sp == NULL) {
773*84d9c625SLionel Sambuc warn("%s: out of memory", __func__);
7742fe8fb19SBen Gras return (FALSE);
7752fe8fb19SBen Gras }
7762fe8fb19SBen Gras sp[size] = 0;
7772fe8fb19SBen Gras /* FALLTHROUGH */
7782fe8fb19SBen Gras
7792fe8fb19SBen Gras case XDR_ENCODE:
7802fe8fb19SBen Gras return (xdr_opaque(xdrs, sp, size));
7812fe8fb19SBen Gras
7822fe8fb19SBen Gras case XDR_FREE:
7832fe8fb19SBen Gras mem_free(sp, nodesize);
7842fe8fb19SBen Gras *cpp = NULL;
7852fe8fb19SBen Gras return (TRUE);
7862fe8fb19SBen Gras }
7872fe8fb19SBen Gras /* NOTREACHED */
7882fe8fb19SBen Gras return (FALSE);
7892fe8fb19SBen Gras }
7902fe8fb19SBen Gras
7912fe8fb19SBen Gras /*
7922fe8fb19SBen Gras * Wrapper for xdr_string that can be called directly from
7932fe8fb19SBen Gras * routines like clnt_call
7942fe8fb19SBen Gras */
7952fe8fb19SBen Gras bool_t
xdr_wrapstring(XDR * xdrs,char ** cpp)796f14fb602SLionel Sambuc xdr_wrapstring(XDR *xdrs, char **cpp)
7972fe8fb19SBen Gras {
7982fe8fb19SBen Gras
7992fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
8002fe8fb19SBen Gras _DIAGASSERT(cpp != NULL);
8012fe8fb19SBen Gras
8022fe8fb19SBen Gras return xdr_string(xdrs, cpp, LASTUNSIGNED);
8032fe8fb19SBen Gras }
8042fe8fb19SBen Gras
8052fe8fb19SBen Gras /*
8062fe8fb19SBen Gras * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t()
8072fe8fb19SBen Gras * are in the "non-portable" section because they require that a `long long'
8082fe8fb19SBen Gras * be a 64-bit type.
8092fe8fb19SBen Gras *
8102fe8fb19SBen Gras * --thorpej@NetBSD.org, November 30, 1999
8112fe8fb19SBen Gras */
8122fe8fb19SBen Gras
8132fe8fb19SBen Gras /*
8142fe8fb19SBen Gras * XDR 64-bit integers
8152fe8fb19SBen Gras */
8162fe8fb19SBen Gras bool_t
xdr_int64_t(XDR * xdrs,int64_t * llp)817f14fb602SLionel Sambuc xdr_int64_t(XDR *xdrs, int64_t *llp)
8182fe8fb19SBen Gras {
8192fe8fb19SBen Gras u_long ul[2];
8202fe8fb19SBen Gras
8212fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
8222fe8fb19SBen Gras _DIAGASSERT(llp != NULL);
8232fe8fb19SBen Gras
8242fe8fb19SBen Gras switch (xdrs->x_op) {
8252fe8fb19SBen Gras case XDR_ENCODE:
826f14fb602SLionel Sambuc ul[0] = (u_long)(((uint64_t)*llp >> 32) &
827f14fb602SLionel Sambuc (uint64_t)0xffffffffULL);
828f14fb602SLionel Sambuc ul[1] = (u_long)(((uint64_t)*llp) &
829f14fb602SLionel Sambuc (uint64_t)0xffffffffULL);
8302fe8fb19SBen Gras if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
8312fe8fb19SBen Gras return (FALSE);
8322fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
8332fe8fb19SBen Gras case XDR_DECODE:
8342fe8fb19SBen Gras if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
8352fe8fb19SBen Gras return (FALSE);
8362fe8fb19SBen Gras if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
8372fe8fb19SBen Gras return (FALSE);
8382fe8fb19SBen Gras *llp = (int64_t)
8392fe8fb19SBen Gras (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
8402fe8fb19SBen Gras return (TRUE);
8412fe8fb19SBen Gras case XDR_FREE:
8422fe8fb19SBen Gras return (TRUE);
8432fe8fb19SBen Gras }
8442fe8fb19SBen Gras /* NOTREACHED */
8452fe8fb19SBen Gras return (FALSE);
8462fe8fb19SBen Gras }
8472fe8fb19SBen Gras
8482fe8fb19SBen Gras
8492fe8fb19SBen Gras /*
8502fe8fb19SBen Gras * XDR unsigned 64-bit integers
8512fe8fb19SBen Gras */
8522fe8fb19SBen Gras bool_t
xdr_u_int64_t(XDR * xdrs,u_int64_t * ullp)853f14fb602SLionel Sambuc xdr_u_int64_t(XDR *xdrs, u_int64_t *ullp)
8542fe8fb19SBen Gras {
8552fe8fb19SBen Gras u_long ul[2];
8562fe8fb19SBen Gras
8572fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
8582fe8fb19SBen Gras _DIAGASSERT(ullp != NULL);
8592fe8fb19SBen Gras
8602fe8fb19SBen Gras switch (xdrs->x_op) {
8612fe8fb19SBen Gras case XDR_ENCODE:
862f14fb602SLionel Sambuc ul[0] = (u_long)(*ullp >> 32) & 0xffffffffUL;
863f14fb602SLionel Sambuc ul[1] = (u_long)(*ullp) & 0xffffffffUL;
8642fe8fb19SBen Gras if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE)
8652fe8fb19SBen Gras return (FALSE);
8662fe8fb19SBen Gras return (XDR_PUTLONG(xdrs, (long *)&ul[1]));
8672fe8fb19SBen Gras case XDR_DECODE:
8682fe8fb19SBen Gras if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE)
8692fe8fb19SBen Gras return (FALSE);
8702fe8fb19SBen Gras if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE)
8712fe8fb19SBen Gras return (FALSE);
8722fe8fb19SBen Gras *ullp = (u_int64_t)
8732fe8fb19SBen Gras (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1]));
8742fe8fb19SBen Gras return (TRUE);
8752fe8fb19SBen Gras case XDR_FREE:
8762fe8fb19SBen Gras return (TRUE);
8772fe8fb19SBen Gras }
8782fe8fb19SBen Gras /* NOTREACHED */
8792fe8fb19SBen Gras return (FALSE);
8802fe8fb19SBen Gras }
8812fe8fb19SBen Gras
8822fe8fb19SBen Gras
8832fe8fb19SBen Gras /*
8842fe8fb19SBen Gras * XDR hypers
8852fe8fb19SBen Gras */
8862fe8fb19SBen Gras bool_t
xdr_hyper(XDR * xdrs,longlong_t * llp)887f14fb602SLionel Sambuc xdr_hyper(XDR *xdrs, longlong_t *llp)
8882fe8fb19SBen Gras {
8892fe8fb19SBen Gras
8902fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
8912fe8fb19SBen Gras _DIAGASSERT(llp != NULL);
8922fe8fb19SBen Gras
8932fe8fb19SBen Gras /*
8942fe8fb19SBen Gras * Don't bother open-coding this; it's a fair amount of code. Just
8952fe8fb19SBen Gras * call xdr_int64_t().
8962fe8fb19SBen Gras */
8972fe8fb19SBen Gras return (xdr_int64_t(xdrs, (int64_t *)llp));
8982fe8fb19SBen Gras }
8992fe8fb19SBen Gras
9002fe8fb19SBen Gras
9012fe8fb19SBen Gras /*
9022fe8fb19SBen Gras * XDR unsigned hypers
9032fe8fb19SBen Gras */
9042fe8fb19SBen Gras bool_t
xdr_u_hyper(XDR * xdrs,u_longlong_t * ullp)905f14fb602SLionel Sambuc xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp)
9062fe8fb19SBen Gras {
9072fe8fb19SBen Gras
9082fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
9092fe8fb19SBen Gras _DIAGASSERT(ullp != NULL);
9102fe8fb19SBen Gras
9112fe8fb19SBen Gras /*
9122fe8fb19SBen Gras * Don't bother open-coding this; it's a fair amount of code. Just
9132fe8fb19SBen Gras * call xdr_u_int64_t().
9142fe8fb19SBen Gras */
9152fe8fb19SBen Gras return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
9162fe8fb19SBen Gras }
9172fe8fb19SBen Gras
9182fe8fb19SBen Gras
9192fe8fb19SBen Gras /*
9202fe8fb19SBen Gras * XDR longlong_t's
9212fe8fb19SBen Gras */
9222fe8fb19SBen Gras bool_t
xdr_longlong_t(XDR * xdrs,longlong_t * llp)923f14fb602SLionel Sambuc xdr_longlong_t(XDR *xdrs, longlong_t *llp)
9242fe8fb19SBen Gras {
9252fe8fb19SBen Gras
9262fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
9272fe8fb19SBen Gras _DIAGASSERT(llp != NULL);
9282fe8fb19SBen Gras
9292fe8fb19SBen Gras /*
9302fe8fb19SBen Gras * Don't bother open-coding this; it's a fair amount of code. Just
9312fe8fb19SBen Gras * call xdr_int64_t().
9322fe8fb19SBen Gras */
9332fe8fb19SBen Gras return (xdr_int64_t(xdrs, (int64_t *)llp));
9342fe8fb19SBen Gras }
9352fe8fb19SBen Gras
9362fe8fb19SBen Gras
9372fe8fb19SBen Gras /*
9382fe8fb19SBen Gras * XDR u_longlong_t's
9392fe8fb19SBen Gras */
9402fe8fb19SBen Gras bool_t
xdr_u_longlong_t(XDR * xdrs,u_longlong_t * ullp)941f14fb602SLionel Sambuc xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp)
9422fe8fb19SBen Gras {
9432fe8fb19SBen Gras
9442fe8fb19SBen Gras _DIAGASSERT(xdrs != NULL);
9452fe8fb19SBen Gras _DIAGASSERT(ullp != NULL);
9462fe8fb19SBen Gras
9472fe8fb19SBen Gras /*
9482fe8fb19SBen Gras * Don't bother open-coding this; it's a fair amount of code. Just
9492fe8fb19SBen Gras * call xdr_u_int64_t().
9502fe8fb19SBen Gras */
9512fe8fb19SBen Gras return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp));
9522fe8fb19SBen Gras }
953