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 #if defined(LIBC_SCCS) && !defined(lint) 37a9bdcd37SDavid E. O'Brien static char *sccsid2 = "@(#)xdr.c 1.35 87/08/12"; 38333fc21eSDavid E. O'Brien static char *sccsid = "@(#)xdr.c 2.1 88/07/29 4.0 RPCSRC"; 39eae561b3SGarrett Wollman #endif 40333fc21eSDavid E. O'Brien #include <sys/cdefs.h> 41333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$"); 42eae561b3SGarrett Wollman 43eae561b3SGarrett Wollman /* 44eae561b3SGarrett Wollman * xdr.c, Generic XDR routines implementation. 45eae561b3SGarrett Wollman * 46eae561b3SGarrett Wollman * These are the "generic" xdr routines used to serialize and de-serialize 47eae561b3SGarrett Wollman * most common data items. See xdr.h for more info on the interface to 48eae561b3SGarrett Wollman * xdr. 49eae561b3SGarrett Wollman */ 50eae561b3SGarrett Wollman 518360efbdSAlfred Perlstein #include "namespace.h" 528360efbdSAlfred Perlstein #include <err.h> 53eae561b3SGarrett Wollman #include <stdio.h> 5429285d6cSPoul-Henning Kamp #include <stdlib.h> 551ad08a09SPeter Wemm #include <string.h> 56eae561b3SGarrett Wollman 576448ec89SXin LI #include <rpc/rpc.h> 586448ec89SXin LI #include <rpc/rpc_com.h> 59eae561b3SGarrett Wollman #include <rpc/types.h> 60eae561b3SGarrett Wollman #include <rpc/xdr.h> 618360efbdSAlfred Perlstein #include "un-namespace.h" 628360efbdSAlfred Perlstein 638360efbdSAlfred Perlstein typedef quad_t longlong_t; /* ANSI long long type */ 648360efbdSAlfred Perlstein typedef u_quad_t u_longlong_t; /* ANSI unsigned long long type */ 65eae561b3SGarrett Wollman 66eae561b3SGarrett Wollman /* 67eae561b3SGarrett Wollman * constants specific to the xdr "protocol" 68eae561b3SGarrett Wollman */ 69eae561b3SGarrett Wollman #define XDR_FALSE ((long) 0) 70eae561b3SGarrett Wollman #define XDR_TRUE ((long) 1) 71eae561b3SGarrett Wollman 72eae561b3SGarrett Wollman /* 73eae561b3SGarrett Wollman * for unit alignment 74eae561b3SGarrett Wollman */ 758360efbdSAlfred Perlstein static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 }; 76eae561b3SGarrett Wollman 77eae561b3SGarrett Wollman /* 78eae561b3SGarrett Wollman * Free a data structure using XDR 79eae561b3SGarrett Wollman * Not a filter, but a convenient utility nonetheless 80eae561b3SGarrett Wollman */ 81eae561b3SGarrett Wollman void 82d660d38dSCraig Rodrigues xdr_free(xdrproc_t proc, void *objp) 83eae561b3SGarrett Wollman { 84eae561b3SGarrett Wollman XDR x; 85eae561b3SGarrett Wollman 86eae561b3SGarrett Wollman x.x_op = XDR_FREE; 87eae561b3SGarrett Wollman (*proc)(&x, objp); 88eae561b3SGarrett Wollman } 89eae561b3SGarrett Wollman 90eae561b3SGarrett Wollman /* 91eae561b3SGarrett Wollman * XDR nothing 92eae561b3SGarrett Wollman */ 93eae561b3SGarrett Wollman bool_t 94f249dbccSDag-Erling Smørgrav xdr_void(void) 95eae561b3SGarrett Wollman { 96eae561b3SGarrett Wollman 97eae561b3SGarrett Wollman return (TRUE); 98eae561b3SGarrett Wollman } 99eae561b3SGarrett Wollman 1001ad08a09SPeter Wemm 101eae561b3SGarrett Wollman /* 102eae561b3SGarrett Wollman * XDR integers 103eae561b3SGarrett Wollman */ 104eae561b3SGarrett Wollman bool_t 105d660d38dSCraig Rodrigues xdr_int(XDR *xdrs, int *ip) 106eae561b3SGarrett Wollman { 1071ad08a09SPeter Wemm long l; 108eae561b3SGarrett Wollman 1091ad08a09SPeter Wemm switch (xdrs->x_op) { 1101ad08a09SPeter Wemm 1111ad08a09SPeter Wemm case XDR_ENCODE: 1121ad08a09SPeter Wemm l = (long) *ip; 1131ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, &l)); 1141ad08a09SPeter Wemm 1151ad08a09SPeter Wemm case XDR_DECODE: 1161ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, &l)) { 1171ad08a09SPeter Wemm return (FALSE); 118eae561b3SGarrett Wollman } 1191ad08a09SPeter Wemm *ip = (int) l; 1201ad08a09SPeter Wemm return (TRUE); 1211ad08a09SPeter Wemm 1221ad08a09SPeter Wemm case XDR_FREE: 1231ad08a09SPeter Wemm return (TRUE); 1241ad08a09SPeter Wemm } 1258360efbdSAlfred Perlstein /* NOTREACHED */ 1261ad08a09SPeter Wemm return (FALSE); 127eae561b3SGarrett Wollman } 128eae561b3SGarrett Wollman 129eae561b3SGarrett Wollman /* 130eae561b3SGarrett Wollman * XDR unsigned integers 131eae561b3SGarrett Wollman */ 132eae561b3SGarrett Wollman bool_t 133d660d38dSCraig Rodrigues xdr_u_int(XDR *xdrs, u_int *up) 134eae561b3SGarrett Wollman { 1351ad08a09SPeter Wemm u_long l; 136eae561b3SGarrett Wollman 1371ad08a09SPeter Wemm switch (xdrs->x_op) { 1381ad08a09SPeter Wemm 1391ad08a09SPeter Wemm case XDR_ENCODE: 1401ad08a09SPeter Wemm l = (u_long) *up; 1411ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 1421ad08a09SPeter Wemm 1431ad08a09SPeter Wemm case XDR_DECODE: 1441ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 1451ad08a09SPeter Wemm return (FALSE); 146eae561b3SGarrett Wollman } 1471ad08a09SPeter Wemm *up = (u_int) l; 1481ad08a09SPeter Wemm return (TRUE); 1491ad08a09SPeter Wemm 1501ad08a09SPeter Wemm case XDR_FREE: 1511ad08a09SPeter Wemm return (TRUE); 152eae561b3SGarrett Wollman } 1538360efbdSAlfred Perlstein /* NOTREACHED */ 1541ad08a09SPeter Wemm return (FALSE); 1551ad08a09SPeter Wemm } 1561ad08a09SPeter Wemm 157eae561b3SGarrett Wollman 158eae561b3SGarrett Wollman /* 159eae561b3SGarrett Wollman * XDR long integers 160eae561b3SGarrett Wollman * same as xdr_u_long - open coded to save a proc call! 161eae561b3SGarrett Wollman */ 162eae561b3SGarrett Wollman bool_t 163d660d38dSCraig Rodrigues xdr_long(XDR *xdrs, long *lp) 164eae561b3SGarrett Wollman { 1651ad08a09SPeter Wemm switch (xdrs->x_op) { 1661ad08a09SPeter Wemm case XDR_ENCODE: 167eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, lp)); 1681ad08a09SPeter Wemm case XDR_DECODE: 169eae561b3SGarrett Wollman return (XDR_GETLONG(xdrs, lp)); 1701ad08a09SPeter Wemm case XDR_FREE: 171eae561b3SGarrett Wollman return (TRUE); 1721ad08a09SPeter Wemm } 1738360efbdSAlfred Perlstein /* NOTREACHED */ 174eae561b3SGarrett Wollman return (FALSE); 175eae561b3SGarrett Wollman } 176eae561b3SGarrett Wollman 177eae561b3SGarrett Wollman /* 178eae561b3SGarrett Wollman * XDR unsigned long integers 179eae561b3SGarrett Wollman * same as xdr_long - open coded to save a proc call! 180eae561b3SGarrett Wollman */ 181eae561b3SGarrett Wollman bool_t 182d660d38dSCraig Rodrigues xdr_u_long(XDR *xdrs, u_long *ulp) 183eae561b3SGarrett Wollman { 1841ad08a09SPeter Wemm switch (xdrs->x_op) { 1851ad08a09SPeter Wemm case XDR_ENCODE: 186eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, (long *)ulp)); 1871ad08a09SPeter Wemm case XDR_DECODE: 1881ad08a09SPeter Wemm return (XDR_GETLONG(xdrs, (long *)ulp)); 1891ad08a09SPeter Wemm case XDR_FREE: 190eae561b3SGarrett Wollman return (TRUE); 1911ad08a09SPeter Wemm } 1928360efbdSAlfred Perlstein /* NOTREACHED */ 193eae561b3SGarrett Wollman return (FALSE); 194eae561b3SGarrett Wollman } 195eae561b3SGarrett Wollman 1961ad08a09SPeter Wemm 1971ad08a09SPeter Wemm /* 1981ad08a09SPeter Wemm * XDR 32-bit integers 1991ad08a09SPeter Wemm * same as xdr_u_int32_t - open coded to save a proc call! 2001ad08a09SPeter Wemm */ 2011ad08a09SPeter Wemm bool_t 202d660d38dSCraig Rodrigues xdr_int32_t(XDR *xdrs, int32_t *int32_p) 2031ad08a09SPeter Wemm { 2041ad08a09SPeter Wemm long l; 2051ad08a09SPeter Wemm 2061ad08a09SPeter Wemm switch (xdrs->x_op) { 2071ad08a09SPeter Wemm 2081ad08a09SPeter Wemm case XDR_ENCODE: 2091ad08a09SPeter Wemm l = (long) *int32_p; 2101ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, &l)); 2111ad08a09SPeter Wemm 2121ad08a09SPeter Wemm case XDR_DECODE: 2131ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, &l)) { 2141ad08a09SPeter Wemm return (FALSE); 2151ad08a09SPeter Wemm } 2161ad08a09SPeter Wemm *int32_p = (int32_t) l; 2171ad08a09SPeter Wemm return (TRUE); 2181ad08a09SPeter Wemm 2191ad08a09SPeter Wemm case XDR_FREE: 2201ad08a09SPeter Wemm return (TRUE); 2211ad08a09SPeter Wemm } 2228360efbdSAlfred Perlstein /* NOTREACHED */ 2231ad08a09SPeter Wemm return (FALSE); 2241ad08a09SPeter Wemm } 2251ad08a09SPeter Wemm 2261ad08a09SPeter Wemm /* 2271ad08a09SPeter Wemm * XDR unsigned 32-bit integers 2281ad08a09SPeter Wemm * same as xdr_int32_t - open coded to save a proc call! 2291ad08a09SPeter Wemm */ 2301ad08a09SPeter Wemm bool_t 231d660d38dSCraig Rodrigues xdr_u_int32_t(XDR *xdrs, u_int32_t *u_int32_p) 2321ad08a09SPeter Wemm { 2331ad08a09SPeter Wemm u_long l; 2341ad08a09SPeter Wemm 2351ad08a09SPeter Wemm switch (xdrs->x_op) { 2361ad08a09SPeter Wemm 2371ad08a09SPeter Wemm case XDR_ENCODE: 2381ad08a09SPeter Wemm l = (u_long) *u_int32_p; 2391ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 2401ad08a09SPeter Wemm 2411ad08a09SPeter Wemm case XDR_DECODE: 2421ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 2431ad08a09SPeter Wemm return (FALSE); 2441ad08a09SPeter Wemm } 2451ad08a09SPeter Wemm *u_int32_p = (u_int32_t) l; 2461ad08a09SPeter Wemm return (TRUE); 2471ad08a09SPeter Wemm 2481ad08a09SPeter Wemm case XDR_FREE: 2491ad08a09SPeter Wemm return (TRUE); 2501ad08a09SPeter Wemm } 2518360efbdSAlfred Perlstein /* NOTREACHED */ 252c304ad8aSDavid E. O'Brien return (FALSE); 253c304ad8aSDavid E. O'Brien } 254c304ad8aSDavid E. O'Brien 255a9148abdSDoug Rabson /* 256a9148abdSDoug Rabson * XDR unsigned 32-bit integers 257a9148abdSDoug Rabson * same as xdr_int32_t - open coded to save a proc call! 258a9148abdSDoug Rabson */ 259a9148abdSDoug Rabson bool_t 260d660d38dSCraig Rodrigues xdr_uint32_t(XDR *xdrs, uint32_t *u_int32_p) 261a9148abdSDoug Rabson { 262a9148abdSDoug Rabson u_long l; 263a9148abdSDoug Rabson 264a9148abdSDoug Rabson switch (xdrs->x_op) { 265a9148abdSDoug Rabson 266a9148abdSDoug Rabson case XDR_ENCODE: 267a9148abdSDoug Rabson l = (u_long) *u_int32_p; 268a9148abdSDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&l)); 269a9148abdSDoug Rabson 270a9148abdSDoug Rabson case XDR_DECODE: 271a9148abdSDoug Rabson if (!XDR_GETLONG(xdrs, (long *)&l)) { 272a9148abdSDoug Rabson return (FALSE); 273a9148abdSDoug Rabson } 274a9148abdSDoug Rabson *u_int32_p = (u_int32_t) l; 275a9148abdSDoug Rabson return (TRUE); 276a9148abdSDoug Rabson 277a9148abdSDoug Rabson case XDR_FREE: 278a9148abdSDoug Rabson return (TRUE); 279a9148abdSDoug Rabson } 280a9148abdSDoug Rabson /* NOTREACHED */ 281a9148abdSDoug Rabson return (FALSE); 282a9148abdSDoug Rabson } 2831ad08a09SPeter Wemm 284eae561b3SGarrett Wollman /* 285eae561b3SGarrett Wollman * XDR short integers 286eae561b3SGarrett Wollman */ 287eae561b3SGarrett Wollman bool_t 288d660d38dSCraig Rodrigues xdr_short(XDR *xdrs, short *sp) 289eae561b3SGarrett Wollman { 290eae561b3SGarrett Wollman long l; 291eae561b3SGarrett Wollman 292eae561b3SGarrett Wollman switch (xdrs->x_op) { 293eae561b3SGarrett Wollman 294eae561b3SGarrett Wollman case XDR_ENCODE: 295eae561b3SGarrett Wollman l = (long) *sp; 296eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, &l)); 297eae561b3SGarrett Wollman 298eae561b3SGarrett Wollman case XDR_DECODE: 299eae561b3SGarrett Wollman if (!XDR_GETLONG(xdrs, &l)) { 300eae561b3SGarrett Wollman return (FALSE); 301eae561b3SGarrett Wollman } 302eae561b3SGarrett Wollman *sp = (short) l; 303eae561b3SGarrett Wollman return (TRUE); 304eae561b3SGarrett Wollman 305eae561b3SGarrett Wollman case XDR_FREE: 306eae561b3SGarrett Wollman return (TRUE); 307eae561b3SGarrett Wollman } 3088360efbdSAlfred Perlstein /* NOTREACHED */ 309eae561b3SGarrett Wollman return (FALSE); 310eae561b3SGarrett Wollman } 311eae561b3SGarrett Wollman 312eae561b3SGarrett Wollman /* 313eae561b3SGarrett Wollman * XDR unsigned short integers 314eae561b3SGarrett Wollman */ 315eae561b3SGarrett Wollman bool_t 316d660d38dSCraig Rodrigues xdr_u_short(XDR *xdrs, u_short *usp) 317eae561b3SGarrett Wollman { 318eae561b3SGarrett Wollman u_long l; 319eae561b3SGarrett Wollman 320eae561b3SGarrett Wollman switch (xdrs->x_op) { 321eae561b3SGarrett Wollman 322eae561b3SGarrett Wollman case XDR_ENCODE: 323eae561b3SGarrett Wollman l = (u_long) *usp; 3241ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 3251ad08a09SPeter Wemm 3261ad08a09SPeter Wemm case XDR_DECODE: 3271ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 3281ad08a09SPeter Wemm return (FALSE); 3291ad08a09SPeter Wemm } 3301ad08a09SPeter Wemm *usp = (u_short) l; 3311ad08a09SPeter Wemm return (TRUE); 3321ad08a09SPeter Wemm 3331ad08a09SPeter Wemm case XDR_FREE: 3341ad08a09SPeter Wemm return (TRUE); 3351ad08a09SPeter Wemm } 3368360efbdSAlfred Perlstein /* NOTREACHED */ 3371ad08a09SPeter Wemm return (FALSE); 3381ad08a09SPeter Wemm } 3391ad08a09SPeter Wemm 3401ad08a09SPeter Wemm 3411ad08a09SPeter Wemm /* 3421ad08a09SPeter Wemm * XDR 16-bit integers 3431ad08a09SPeter Wemm */ 3441ad08a09SPeter Wemm bool_t 345d660d38dSCraig Rodrigues xdr_int16_t(XDR *xdrs, int16_t *int16_p) 3461ad08a09SPeter Wemm { 3471ad08a09SPeter Wemm long l; 3481ad08a09SPeter Wemm 3491ad08a09SPeter Wemm switch (xdrs->x_op) { 3501ad08a09SPeter Wemm 3511ad08a09SPeter Wemm case XDR_ENCODE: 3521ad08a09SPeter Wemm l = (long) *int16_p; 353eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, &l)); 354eae561b3SGarrett Wollman 355eae561b3SGarrett Wollman case XDR_DECODE: 356eae561b3SGarrett Wollman if (!XDR_GETLONG(xdrs, &l)) { 357eae561b3SGarrett Wollman return (FALSE); 358eae561b3SGarrett Wollman } 3591ad08a09SPeter Wemm *int16_p = (int16_t) l; 3601ad08a09SPeter Wemm return (TRUE); 3611ad08a09SPeter Wemm 3621ad08a09SPeter Wemm case XDR_FREE: 3631ad08a09SPeter Wemm return (TRUE); 3641ad08a09SPeter Wemm } 3658360efbdSAlfred Perlstein /* NOTREACHED */ 3661ad08a09SPeter Wemm return (FALSE); 3671ad08a09SPeter Wemm } 3681ad08a09SPeter Wemm 3691ad08a09SPeter Wemm /* 3701ad08a09SPeter Wemm * XDR unsigned 16-bit integers 3711ad08a09SPeter Wemm */ 3721ad08a09SPeter Wemm bool_t 373d660d38dSCraig Rodrigues xdr_u_int16_t(XDR *xdrs, u_int16_t *u_int16_p) 3741ad08a09SPeter Wemm { 3751ad08a09SPeter Wemm u_long l; 3761ad08a09SPeter Wemm 3771ad08a09SPeter Wemm switch (xdrs->x_op) { 3781ad08a09SPeter Wemm 3791ad08a09SPeter Wemm case XDR_ENCODE: 3801ad08a09SPeter Wemm l = (u_long) *u_int16_p; 3811ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 3821ad08a09SPeter Wemm 3831ad08a09SPeter Wemm case XDR_DECODE: 3841ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 3851ad08a09SPeter Wemm return (FALSE); 3861ad08a09SPeter Wemm } 3871ad08a09SPeter Wemm *u_int16_p = (u_int16_t) l; 388eae561b3SGarrett Wollman return (TRUE); 389eae561b3SGarrett Wollman 390eae561b3SGarrett Wollman case XDR_FREE: 391eae561b3SGarrett Wollman return (TRUE); 392eae561b3SGarrett Wollman } 3938360efbdSAlfred Perlstein /* NOTREACHED */ 394eae561b3SGarrett Wollman return (FALSE); 395eae561b3SGarrett Wollman } 396eae561b3SGarrett Wollman 397a9148abdSDoug Rabson /* 398a9148abdSDoug Rabson * XDR unsigned 16-bit integers 399a9148abdSDoug Rabson */ 400a9148abdSDoug Rabson bool_t 401d660d38dSCraig Rodrigues xdr_uint16_t(XDR *xdrs, uint16_t *u_int16_p) 402a9148abdSDoug Rabson { 403a9148abdSDoug Rabson u_long l; 404a9148abdSDoug Rabson 405a9148abdSDoug Rabson switch (xdrs->x_op) { 406a9148abdSDoug Rabson 407a9148abdSDoug Rabson case XDR_ENCODE: 408a9148abdSDoug Rabson l = (u_long) *u_int16_p; 409a9148abdSDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&l)); 410a9148abdSDoug Rabson 411a9148abdSDoug Rabson case XDR_DECODE: 412a9148abdSDoug Rabson if (!XDR_GETLONG(xdrs, (long *)&l)) { 413a9148abdSDoug Rabson return (FALSE); 414a9148abdSDoug Rabson } 415a9148abdSDoug Rabson *u_int16_p = (u_int16_t) l; 416a9148abdSDoug Rabson return (TRUE); 417a9148abdSDoug Rabson 418a9148abdSDoug Rabson case XDR_FREE: 419a9148abdSDoug Rabson return (TRUE); 420a9148abdSDoug Rabson } 421a9148abdSDoug Rabson /* NOTREACHED */ 422a9148abdSDoug Rabson return (FALSE); 423a9148abdSDoug Rabson } 424a9148abdSDoug Rabson 425eae561b3SGarrett Wollman 426eae561b3SGarrett Wollman /* 427eae561b3SGarrett Wollman * XDR a char 428eae561b3SGarrett Wollman */ 429eae561b3SGarrett Wollman bool_t 430d660d38dSCraig Rodrigues xdr_char(XDR *xdrs, char *cp) 431eae561b3SGarrett Wollman { 432*a872c370SBrooks Davis u_int i; 433eae561b3SGarrett Wollman 434*a872c370SBrooks Davis i = *((unsigned char *)cp); 435*a872c370SBrooks Davis if (!xdr_u_int(xdrs, &i)) { 436eae561b3SGarrett Wollman return (FALSE); 437eae561b3SGarrett Wollman } 438*a872c370SBrooks Davis *((unsigned char *)cp) = i; 439eae561b3SGarrett Wollman return (TRUE); 440eae561b3SGarrett Wollman } 441eae561b3SGarrett Wollman 442eae561b3SGarrett Wollman /* 443eae561b3SGarrett Wollman * XDR an unsigned char 444eae561b3SGarrett Wollman */ 445eae561b3SGarrett Wollman bool_t 446d660d38dSCraig Rodrigues xdr_u_char(XDR *xdrs, u_char *cp) 447eae561b3SGarrett Wollman { 448eae561b3SGarrett Wollman u_int u; 449eae561b3SGarrett Wollman 450eae561b3SGarrett Wollman u = (*cp); 451eae561b3SGarrett Wollman if (!xdr_u_int(xdrs, &u)) { 452eae561b3SGarrett Wollman return (FALSE); 453eae561b3SGarrett Wollman } 454eae561b3SGarrett Wollman *cp = u; 455eae561b3SGarrett Wollman return (TRUE); 456eae561b3SGarrett Wollman } 457eae561b3SGarrett Wollman 458eae561b3SGarrett Wollman /* 459eae561b3SGarrett Wollman * XDR booleans 460eae561b3SGarrett Wollman */ 461eae561b3SGarrett Wollman bool_t 462d660d38dSCraig Rodrigues xdr_bool(XDR *xdrs, bool_t *bp) 463eae561b3SGarrett Wollman { 464eae561b3SGarrett Wollman long lb; 465eae561b3SGarrett Wollman 466eae561b3SGarrett Wollman switch (xdrs->x_op) { 467eae561b3SGarrett Wollman 468eae561b3SGarrett Wollman case XDR_ENCODE: 469eae561b3SGarrett Wollman lb = *bp ? XDR_TRUE : XDR_FALSE; 470eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, &lb)); 471eae561b3SGarrett Wollman 472eae561b3SGarrett Wollman case XDR_DECODE: 473eae561b3SGarrett Wollman if (!XDR_GETLONG(xdrs, &lb)) { 474eae561b3SGarrett Wollman return (FALSE); 475eae561b3SGarrett Wollman } 476eae561b3SGarrett Wollman *bp = (lb == XDR_FALSE) ? FALSE : TRUE; 477eae561b3SGarrett Wollman return (TRUE); 478eae561b3SGarrett Wollman 479eae561b3SGarrett Wollman case XDR_FREE: 480eae561b3SGarrett Wollman return (TRUE); 481eae561b3SGarrett Wollman } 4828360efbdSAlfred Perlstein /* NOTREACHED */ 483eae561b3SGarrett Wollman return (FALSE); 484eae561b3SGarrett Wollman } 485eae561b3SGarrett Wollman 486eae561b3SGarrett Wollman /* 487eae561b3SGarrett Wollman * XDR enumerations 488eae561b3SGarrett Wollman */ 489eae561b3SGarrett Wollman bool_t 490d660d38dSCraig Rodrigues xdr_enum(XDR *xdrs, enum_t *ep) 491eae561b3SGarrett Wollman { 492eae561b3SGarrett Wollman enum sizecheck { SIZEVAL }; /* used to find the size of an enum */ 493eae561b3SGarrett Wollman 494eae561b3SGarrett Wollman /* 495eae561b3SGarrett Wollman * enums are treated as ints 496eae561b3SGarrett Wollman */ 4978360efbdSAlfred Perlstein /* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) { 4988360efbdSAlfred Perlstein return (xdr_long(xdrs, (long *)(void *)ep)); 4998360efbdSAlfred Perlstein } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) { 5008360efbdSAlfred Perlstein return (xdr_int(xdrs, (int *)(void *)ep)); 5018360efbdSAlfred Perlstein } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) { 5028360efbdSAlfred Perlstein return (xdr_short(xdrs, (short *)(void *)ep)); 503eae561b3SGarrett Wollman } else { 504eae561b3SGarrett Wollman return (FALSE); 505eae561b3SGarrett Wollman } 506eae561b3SGarrett Wollman } 507eae561b3SGarrett Wollman 508eae561b3SGarrett Wollman /* 509eae561b3SGarrett Wollman * XDR opaque data 510eae561b3SGarrett Wollman * Allows the specification of a fixed size sequence of opaque bytes. 511eae561b3SGarrett Wollman * cp points to the opaque object and cnt gives the byte length. 512eae561b3SGarrett Wollman */ 513eae561b3SGarrett Wollman bool_t 514d660d38dSCraig Rodrigues xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt) 515eae561b3SGarrett Wollman { 5168360efbdSAlfred Perlstein u_int rndup; 5178360efbdSAlfred Perlstein static int crud[BYTES_PER_XDR_UNIT]; 518eae561b3SGarrett Wollman 519eae561b3SGarrett Wollman /* 520eae561b3SGarrett Wollman * if no data we are done 521eae561b3SGarrett Wollman */ 522eae561b3SGarrett Wollman if (cnt == 0) 523eae561b3SGarrett Wollman return (TRUE); 524eae561b3SGarrett Wollman 525eae561b3SGarrett Wollman /* 526eae561b3SGarrett Wollman * round byte count to full xdr units 527eae561b3SGarrett Wollman */ 528eae561b3SGarrett Wollman rndup = cnt % BYTES_PER_XDR_UNIT; 529eae561b3SGarrett Wollman if (rndup > 0) 530eae561b3SGarrett Wollman rndup = BYTES_PER_XDR_UNIT - rndup; 531eae561b3SGarrett Wollman 532eae561b3SGarrett Wollman if (xdrs->x_op == XDR_DECODE) { 533eae561b3SGarrett Wollman if (!XDR_GETBYTES(xdrs, cp, cnt)) { 534eae561b3SGarrett Wollman return (FALSE); 535eae561b3SGarrett Wollman } 536eae561b3SGarrett Wollman if (rndup == 0) 537eae561b3SGarrett Wollman return (TRUE); 5388360efbdSAlfred Perlstein return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup)); 539eae561b3SGarrett Wollman } 540eae561b3SGarrett Wollman 541eae561b3SGarrett Wollman if (xdrs->x_op == XDR_ENCODE) { 542eae561b3SGarrett Wollman if (!XDR_PUTBYTES(xdrs, cp, cnt)) { 543eae561b3SGarrett Wollman return (FALSE); 544eae561b3SGarrett Wollman } 545eae561b3SGarrett Wollman if (rndup == 0) 546eae561b3SGarrett Wollman return (TRUE); 547eae561b3SGarrett Wollman return (XDR_PUTBYTES(xdrs, xdr_zero, rndup)); 548eae561b3SGarrett Wollman } 549eae561b3SGarrett Wollman 550eae561b3SGarrett Wollman if (xdrs->x_op == XDR_FREE) { 551eae561b3SGarrett Wollman return (TRUE); 552eae561b3SGarrett Wollman } 553eae561b3SGarrett Wollman 554eae561b3SGarrett Wollman return (FALSE); 555eae561b3SGarrett Wollman } 556eae561b3SGarrett Wollman 557eae561b3SGarrett Wollman /* 558eae561b3SGarrett Wollman * XDR counted bytes 559eae561b3SGarrett Wollman * *cpp is a pointer to the bytes, *sizep is the count. 560eae561b3SGarrett Wollman * If *cpp is NULL maxsize bytes are allocated 561eae561b3SGarrett Wollman */ 562eae561b3SGarrett Wollman bool_t 563d660d38dSCraig Rodrigues xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize) 564eae561b3SGarrett Wollman { 5658360efbdSAlfred Perlstein char *sp = *cpp; /* sp is the actual string pointer */ 5668360efbdSAlfred Perlstein u_int nodesize; 5676448ec89SXin LI bool_t ret, allocated = FALSE; 568eae561b3SGarrett Wollman 569eae561b3SGarrett Wollman /* 570eae561b3SGarrett Wollman * first deal with the length since xdr bytes are counted 571eae561b3SGarrett Wollman */ 572eae561b3SGarrett Wollman if (! xdr_u_int(xdrs, sizep)) { 573eae561b3SGarrett Wollman return (FALSE); 574eae561b3SGarrett Wollman } 575eae561b3SGarrett Wollman nodesize = *sizep; 576eae561b3SGarrett Wollman if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) { 577eae561b3SGarrett Wollman return (FALSE); 578eae561b3SGarrett Wollman } 579eae561b3SGarrett Wollman 580eae561b3SGarrett Wollman /* 581eae561b3SGarrett Wollman * now deal with the actual bytes 582eae561b3SGarrett Wollman */ 583eae561b3SGarrett Wollman switch (xdrs->x_op) { 584eae561b3SGarrett Wollman 585eae561b3SGarrett Wollman case XDR_DECODE: 586eae561b3SGarrett Wollman if (nodesize == 0) { 587eae561b3SGarrett Wollman return (TRUE); 588eae561b3SGarrett Wollman } 589eae561b3SGarrett Wollman if (sp == NULL) { 5908360efbdSAlfred Perlstein *cpp = sp = mem_alloc(nodesize); 5916448ec89SXin LI allocated = TRUE; 592eae561b3SGarrett Wollman } 593eae561b3SGarrett Wollman if (sp == NULL) { 5948360efbdSAlfred Perlstein warnx("xdr_bytes: out of memory"); 595eae561b3SGarrett Wollman return (FALSE); 596eae561b3SGarrett Wollman } 5978360efbdSAlfred Perlstein /* FALLTHROUGH */ 598eae561b3SGarrett Wollman 599eae561b3SGarrett Wollman case XDR_ENCODE: 6006448ec89SXin LI ret = xdr_opaque(xdrs, sp, nodesize); 6016448ec89SXin LI if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) { 6026448ec89SXin LI if (allocated == TRUE) { 6036448ec89SXin LI free(sp); 6046448ec89SXin LI *cpp = NULL; 6056448ec89SXin LI } 6066448ec89SXin LI } 6076448ec89SXin LI return (ret); 608eae561b3SGarrett Wollman 609eae561b3SGarrett Wollman case XDR_FREE: 610eae561b3SGarrett Wollman if (sp != NULL) { 611eae561b3SGarrett Wollman mem_free(sp, nodesize); 612eae561b3SGarrett Wollman *cpp = NULL; 613eae561b3SGarrett Wollman } 614eae561b3SGarrett Wollman return (TRUE); 615eae561b3SGarrett Wollman } 6168360efbdSAlfred Perlstein /* NOTREACHED */ 617eae561b3SGarrett Wollman return (FALSE); 618eae561b3SGarrett Wollman } 619eae561b3SGarrett Wollman 620eae561b3SGarrett Wollman /* 621eae561b3SGarrett Wollman * Implemented here due to commonality of the object. 622eae561b3SGarrett Wollman */ 623eae561b3SGarrett Wollman bool_t 624d660d38dSCraig Rodrigues xdr_netobj(XDR *xdrs, struct netobj *np) 625eae561b3SGarrett Wollman { 626eae561b3SGarrett Wollman 627eae561b3SGarrett Wollman return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ)); 628eae561b3SGarrett Wollman } 629eae561b3SGarrett Wollman 630eae561b3SGarrett Wollman /* 631eae561b3SGarrett Wollman * XDR a descriminated union 632eae561b3SGarrett Wollman * Support routine for discriminated unions. 633eae561b3SGarrett Wollman * You create an array of xdrdiscrim structures, terminated with 634eae561b3SGarrett Wollman * an entry with a null procedure pointer. The routine gets 635eae561b3SGarrett Wollman * the discriminant value and then searches the array of xdrdiscrims 636eae561b3SGarrett Wollman * looking for that value. It calls the procedure given in the xdrdiscrim 637eae561b3SGarrett Wollman * to handle the discriminant. If there is no specific routine a default 638eae561b3SGarrett Wollman * routine may be called. 639eae561b3SGarrett Wollman * If there is no specific or default routine an error is returned. 640eae561b3SGarrett Wollman */ 641eae561b3SGarrett Wollman bool_t 642d660d38dSCraig Rodrigues xdr_union(XDR *xdrs, enum_t *dscmp, char *unp, const struct xdr_discrim *choices, xdrproc_t dfault) 643d660d38dSCraig Rodrigues /* 644d660d38dSCraig Rodrigues * XDR *xdrs; 645d660d38dSCraig Rodrigues * enum_t *dscmp; // enum to decide which arm to work on 646d660d38dSCraig Rodrigues * char *unp; // the union itself 647d660d38dSCraig Rodrigues * const struct xdr_discrim *choices; // [value, xdr proc] for each arm 648d660d38dSCraig Rodrigues * xdrproc_t dfault; // default xdr routine 649d660d38dSCraig Rodrigues */ 650eae561b3SGarrett Wollman { 6518360efbdSAlfred Perlstein enum_t dscm; 652eae561b3SGarrett Wollman 653eae561b3SGarrett Wollman /* 654eae561b3SGarrett Wollman * we deal with the discriminator; it's an enum 655eae561b3SGarrett Wollman */ 656eae561b3SGarrett Wollman if (! xdr_enum(xdrs, dscmp)) { 657eae561b3SGarrett Wollman return (FALSE); 658eae561b3SGarrett Wollman } 659eae561b3SGarrett Wollman dscm = *dscmp; 660eae561b3SGarrett Wollman 661eae561b3SGarrett Wollman /* 662eae561b3SGarrett Wollman * search choices for a value that matches the discriminator. 663eae561b3SGarrett Wollman * if we find one, execute the xdr routine for that value. 664eae561b3SGarrett Wollman */ 665eae561b3SGarrett Wollman for (; choices->proc != NULL_xdrproc_t; choices++) { 666eae561b3SGarrett Wollman if (choices->value == dscm) 6678360efbdSAlfred Perlstein return ((*(choices->proc))(xdrs, unp)); 668eae561b3SGarrett Wollman } 669eae561b3SGarrett Wollman 670eae561b3SGarrett Wollman /* 671eae561b3SGarrett Wollman * no match - execute the default xdr routine if there is one 672eae561b3SGarrett Wollman */ 673eae561b3SGarrett Wollman return ((dfault == NULL_xdrproc_t) ? FALSE : 6748360efbdSAlfred Perlstein (*dfault)(xdrs, unp)); 675eae561b3SGarrett Wollman } 676eae561b3SGarrett Wollman 677eae561b3SGarrett Wollman 678eae561b3SGarrett Wollman /* 679eae561b3SGarrett Wollman * Non-portable xdr primitives. 680eae561b3SGarrett Wollman * Care should be taken when moving these routines to new architectures. 681eae561b3SGarrett Wollman */ 682eae561b3SGarrett Wollman 683eae561b3SGarrett Wollman 684eae561b3SGarrett Wollman /* 685eae561b3SGarrett Wollman * XDR null terminated ASCII strings 686eae561b3SGarrett Wollman * xdr_string deals with "C strings" - arrays of bytes that are 687eae561b3SGarrett Wollman * terminated by a NULL character. The parameter cpp references a 688eae561b3SGarrett Wollman * pointer to storage; If the pointer is null, then the necessary 689eae561b3SGarrett Wollman * storage is allocated. The last parameter is the max allowed length 690eae561b3SGarrett Wollman * of the string as specified by a protocol. 691eae561b3SGarrett Wollman */ 692eae561b3SGarrett Wollman bool_t 693d660d38dSCraig Rodrigues xdr_string(XDR *xdrs, char **cpp, u_int maxsize) 694eae561b3SGarrett Wollman { 6958360efbdSAlfred Perlstein char *sp = *cpp; /* sp is the actual string pointer */ 696eae561b3SGarrett Wollman u_int size; 697eae561b3SGarrett Wollman u_int nodesize; 6986448ec89SXin LI bool_t ret, allocated = FALSE; 699eae561b3SGarrett Wollman 700eae561b3SGarrett Wollman /* 701eae561b3SGarrett Wollman * first deal with the length since xdr strings are counted-strings 702eae561b3SGarrett Wollman */ 703eae561b3SGarrett Wollman switch (xdrs->x_op) { 704eae561b3SGarrett Wollman case XDR_FREE: 705eae561b3SGarrett Wollman if (sp == NULL) { 706eae561b3SGarrett Wollman return(TRUE); /* already free */ 707eae561b3SGarrett Wollman } 7088360efbdSAlfred Perlstein /* FALLTHROUGH */ 709eae561b3SGarrett Wollman case XDR_ENCODE: 710eae561b3SGarrett Wollman size = strlen(sp); 711eae561b3SGarrett Wollman break; 7128360efbdSAlfred Perlstein case XDR_DECODE: 7138360efbdSAlfred Perlstein break; 714eae561b3SGarrett Wollman } 715eae561b3SGarrett Wollman if (! xdr_u_int(xdrs, &size)) { 716eae561b3SGarrett Wollman return (FALSE); 717eae561b3SGarrett Wollman } 718eae561b3SGarrett Wollman if (size > maxsize) { 719eae561b3SGarrett Wollman return (FALSE); 720eae561b3SGarrett Wollman } 721eae561b3SGarrett Wollman nodesize = size + 1; 722eae561b3SGarrett Wollman 723eae561b3SGarrett Wollman /* 724eae561b3SGarrett Wollman * now deal with the actual bytes 725eae561b3SGarrett Wollman */ 726eae561b3SGarrett Wollman switch (xdrs->x_op) { 727eae561b3SGarrett Wollman 728eae561b3SGarrett Wollman case XDR_DECODE: 729eae561b3SGarrett Wollman if (nodesize == 0) { 730eae561b3SGarrett Wollman return (TRUE); 731eae561b3SGarrett Wollman } 7326448ec89SXin LI if (sp == NULL) { 7338360efbdSAlfred Perlstein *cpp = sp = mem_alloc(nodesize); 7346448ec89SXin LI allocated = TRUE; 7356448ec89SXin LI } 736eae561b3SGarrett Wollman if (sp == NULL) { 7378360efbdSAlfred Perlstein warnx("xdr_string: out of memory"); 738eae561b3SGarrett Wollman return (FALSE); 739eae561b3SGarrett Wollman } 740eae561b3SGarrett Wollman sp[size] = 0; 7418360efbdSAlfred Perlstein /* FALLTHROUGH */ 742eae561b3SGarrett Wollman 743eae561b3SGarrett Wollman case XDR_ENCODE: 7446448ec89SXin LI ret = xdr_opaque(xdrs, sp, size); 7456448ec89SXin LI if ((xdrs->x_op == XDR_DECODE) && (ret == FALSE)) { 7466448ec89SXin LI if (allocated == TRUE) { 7476448ec89SXin LI free(sp); 7486448ec89SXin LI *cpp = NULL; 7496448ec89SXin LI } 7506448ec89SXin LI } 7516448ec89SXin LI return (ret); 752eae561b3SGarrett Wollman 753eae561b3SGarrett Wollman case XDR_FREE: 754eae561b3SGarrett Wollman mem_free(sp, nodesize); 755eae561b3SGarrett Wollman *cpp = NULL; 756eae561b3SGarrett Wollman return (TRUE); 757eae561b3SGarrett Wollman } 7588360efbdSAlfred Perlstein /* NOTREACHED */ 759eae561b3SGarrett Wollman return (FALSE); 760eae561b3SGarrett Wollman } 761eae561b3SGarrett Wollman 762eae561b3SGarrett Wollman /* 763eae561b3SGarrett Wollman * Wrapper for xdr_string that can be called directly from 764eae561b3SGarrett Wollman * routines like clnt_call 765eae561b3SGarrett Wollman */ 766eae561b3SGarrett Wollman bool_t 767d660d38dSCraig Rodrigues xdr_wrapstring(XDR *xdrs, char **cpp) 768eae561b3SGarrett Wollman { 7696448ec89SXin LI return xdr_string(xdrs, cpp, RPC_MAXDATASIZE); 770eae561b3SGarrett Wollman } 7718360efbdSAlfred Perlstein 7728360efbdSAlfred Perlstein /* 7738360efbdSAlfred Perlstein * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t() 7748360efbdSAlfred Perlstein * are in the "non-portable" section because they require that a `long long' 7758360efbdSAlfred Perlstein * be a 64-bit type. 7768360efbdSAlfred Perlstein * 7778360efbdSAlfred Perlstein * --thorpej@netbsd.org, November 30, 1999 7788360efbdSAlfred Perlstein */ 7798360efbdSAlfred Perlstein 7808360efbdSAlfred Perlstein /* 7818360efbdSAlfred Perlstein * XDR 64-bit integers 7828360efbdSAlfred Perlstein */ 7838360efbdSAlfred Perlstein bool_t 784d660d38dSCraig Rodrigues xdr_int64_t(XDR *xdrs, int64_t *llp) 7858360efbdSAlfred Perlstein { 7868360efbdSAlfred Perlstein u_long ul[2]; 7878360efbdSAlfred Perlstein 7888360efbdSAlfred Perlstein switch (xdrs->x_op) { 7898360efbdSAlfred Perlstein case XDR_ENCODE: 7908360efbdSAlfred Perlstein ul[0] = (u_long)((u_int64_t)*llp >> 32) & 0xffffffff; 7918360efbdSAlfred Perlstein ul[1] = (u_long)((u_int64_t)*llp) & 0xffffffff; 7928360efbdSAlfred Perlstein if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) 7938360efbdSAlfred Perlstein return (FALSE); 7948360efbdSAlfred Perlstein return (XDR_PUTLONG(xdrs, (long *)&ul[1])); 7958360efbdSAlfred Perlstein case XDR_DECODE: 7968360efbdSAlfred Perlstein if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) 7978360efbdSAlfred Perlstein return (FALSE); 7988360efbdSAlfred Perlstein if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) 7998360efbdSAlfred Perlstein return (FALSE); 8008360efbdSAlfred Perlstein *llp = (int64_t) 8018360efbdSAlfred Perlstein (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); 8028360efbdSAlfred Perlstein return (TRUE); 8038360efbdSAlfred Perlstein case XDR_FREE: 8048360efbdSAlfred Perlstein return (TRUE); 8058360efbdSAlfred Perlstein } 8068360efbdSAlfred Perlstein /* NOTREACHED */ 8078360efbdSAlfred Perlstein return (FALSE); 8088360efbdSAlfred Perlstein } 8098360efbdSAlfred Perlstein 8108360efbdSAlfred Perlstein 8118360efbdSAlfred Perlstein /* 8128360efbdSAlfred Perlstein * XDR unsigned 64-bit integers 8138360efbdSAlfred Perlstein */ 8148360efbdSAlfred Perlstein bool_t 815d660d38dSCraig Rodrigues xdr_u_int64_t(XDR *xdrs, u_int64_t *ullp) 8168360efbdSAlfred Perlstein { 8178360efbdSAlfred Perlstein u_long ul[2]; 8188360efbdSAlfred Perlstein 8198360efbdSAlfred Perlstein switch (xdrs->x_op) { 8208360efbdSAlfred Perlstein case XDR_ENCODE: 8218360efbdSAlfred Perlstein ul[0] = (u_long)(*ullp >> 32) & 0xffffffff; 8228360efbdSAlfred Perlstein ul[1] = (u_long)(*ullp) & 0xffffffff; 8238360efbdSAlfred Perlstein if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) 8248360efbdSAlfred Perlstein return (FALSE); 8258360efbdSAlfred Perlstein return (XDR_PUTLONG(xdrs, (long *)&ul[1])); 8268360efbdSAlfred Perlstein case XDR_DECODE: 8278360efbdSAlfred Perlstein if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) 8288360efbdSAlfred Perlstein return (FALSE); 8298360efbdSAlfred Perlstein if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) 8308360efbdSAlfred Perlstein return (FALSE); 8318360efbdSAlfred Perlstein *ullp = (u_int64_t) 8328360efbdSAlfred Perlstein (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); 8338360efbdSAlfred Perlstein return (TRUE); 8348360efbdSAlfred Perlstein case XDR_FREE: 8358360efbdSAlfred Perlstein return (TRUE); 8368360efbdSAlfred Perlstein } 8378360efbdSAlfred Perlstein /* NOTREACHED */ 8388360efbdSAlfred Perlstein return (FALSE); 8398360efbdSAlfred Perlstein } 8408360efbdSAlfred Perlstein 841a9148abdSDoug Rabson /* 842a9148abdSDoug Rabson * XDR unsigned 64-bit integers 843a9148abdSDoug Rabson */ 844a9148abdSDoug Rabson bool_t 845d660d38dSCraig Rodrigues xdr_uint64_t(XDR *xdrs, uint64_t *ullp) 846a9148abdSDoug Rabson { 847a9148abdSDoug Rabson u_long ul[2]; 848a9148abdSDoug Rabson 849a9148abdSDoug Rabson switch (xdrs->x_op) { 850a9148abdSDoug Rabson case XDR_ENCODE: 851a9148abdSDoug Rabson ul[0] = (u_long)(*ullp >> 32) & 0xffffffff; 852a9148abdSDoug Rabson ul[1] = (u_long)(*ullp) & 0xffffffff; 853a9148abdSDoug Rabson if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) 854a9148abdSDoug Rabson return (FALSE); 855a9148abdSDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&ul[1])); 856a9148abdSDoug Rabson case XDR_DECODE: 857a9148abdSDoug Rabson if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) 858a9148abdSDoug Rabson return (FALSE); 859a9148abdSDoug Rabson if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) 860a9148abdSDoug Rabson return (FALSE); 861a9148abdSDoug Rabson *ullp = (u_int64_t) 862a9148abdSDoug Rabson (((u_int64_t)ul[0] << 32) | ((u_int64_t)ul[1])); 863a9148abdSDoug Rabson return (TRUE); 864a9148abdSDoug Rabson case XDR_FREE: 865a9148abdSDoug Rabson return (TRUE); 866a9148abdSDoug Rabson } 867a9148abdSDoug Rabson /* NOTREACHED */ 868a9148abdSDoug Rabson return (FALSE); 869a9148abdSDoug Rabson } 870a9148abdSDoug Rabson 8718360efbdSAlfred Perlstein 8728360efbdSAlfred Perlstein /* 8738360efbdSAlfred Perlstein * XDR hypers 8748360efbdSAlfred Perlstein */ 8758360efbdSAlfred Perlstein bool_t 876d660d38dSCraig Rodrigues xdr_hyper(XDR *xdrs, longlong_t *llp) 8778360efbdSAlfred Perlstein { 8788360efbdSAlfred Perlstein 8798360efbdSAlfred Perlstein /* 8808360efbdSAlfred Perlstein * Don't bother open-coding this; it's a fair amount of code. Just 8818360efbdSAlfred Perlstein * call xdr_int64_t(). 8828360efbdSAlfred Perlstein */ 8838360efbdSAlfred Perlstein return (xdr_int64_t(xdrs, (int64_t *)llp)); 8848360efbdSAlfred Perlstein } 8858360efbdSAlfred Perlstein 8868360efbdSAlfred Perlstein 8878360efbdSAlfred Perlstein /* 8888360efbdSAlfred Perlstein * XDR unsigned hypers 8898360efbdSAlfred Perlstein */ 8908360efbdSAlfred Perlstein bool_t 891d660d38dSCraig Rodrigues xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp) 8928360efbdSAlfred Perlstein { 8938360efbdSAlfred Perlstein 8948360efbdSAlfred Perlstein /* 8958360efbdSAlfred Perlstein * Don't bother open-coding this; it's a fair amount of code. Just 8968360efbdSAlfred Perlstein * call xdr_u_int64_t(). 8978360efbdSAlfred Perlstein */ 8988360efbdSAlfred Perlstein return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp)); 8998360efbdSAlfred Perlstein } 9008360efbdSAlfred Perlstein 9018360efbdSAlfred Perlstein 9028360efbdSAlfred Perlstein /* 9038360efbdSAlfred Perlstein * XDR longlong_t's 9048360efbdSAlfred Perlstein */ 9058360efbdSAlfred Perlstein bool_t 906d660d38dSCraig Rodrigues xdr_longlong_t(XDR *xdrs, longlong_t *llp) 9078360efbdSAlfred Perlstein { 9088360efbdSAlfred Perlstein 9098360efbdSAlfred Perlstein /* 9108360efbdSAlfred Perlstein * Don't bother open-coding this; it's a fair amount of code. Just 9118360efbdSAlfred Perlstein * call xdr_int64_t(). 9128360efbdSAlfred Perlstein */ 9138360efbdSAlfred Perlstein return (xdr_int64_t(xdrs, (int64_t *)llp)); 9148360efbdSAlfred Perlstein } 9158360efbdSAlfred Perlstein 9168360efbdSAlfred Perlstein 9178360efbdSAlfred Perlstein /* 9188360efbdSAlfred Perlstein * XDR u_longlong_t's 9198360efbdSAlfred Perlstein */ 9208360efbdSAlfred Perlstein bool_t 921d660d38dSCraig Rodrigues xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp) 9228360efbdSAlfred Perlstein { 9238360efbdSAlfred Perlstein 9248360efbdSAlfred Perlstein /* 9258360efbdSAlfred Perlstein * Don't bother open-coding this; it's a fair amount of code. Just 9268360efbdSAlfred Perlstein * call xdr_u_int64_t(). 9278360efbdSAlfred Perlstein */ 9288360efbdSAlfred Perlstein return (xdr_u_int64_t(xdrs, (u_int64_t *)ullp)); 9298360efbdSAlfred Perlstein } 930