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