1dfdcada3SDoug Rabson /* $NetBSD: xdr.c,v 1.22 2000/07/06 03:10:35 christos Exp $ */ 2dfdcada3SDoug Rabson 3dfdcada3SDoug Rabson /* 4dfdcada3SDoug Rabson * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 5dfdcada3SDoug Rabson * unrestricted use provided that this legend is included on all tape 6dfdcada3SDoug Rabson * media and as a part of the software program in whole or part. Users 7dfdcada3SDoug Rabson * may copy or modify Sun RPC without charge, but are not authorized 8dfdcada3SDoug Rabson * to license or distribute it to anyone else except as part of a product or 9dfdcada3SDoug Rabson * program developed by the user. 10dfdcada3SDoug Rabson * 11dfdcada3SDoug Rabson * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 12dfdcada3SDoug Rabson * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 13dfdcada3SDoug Rabson * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 14dfdcada3SDoug Rabson * 15dfdcada3SDoug Rabson * Sun RPC is provided with no support and without any obligation on the 16dfdcada3SDoug Rabson * part of Sun Microsystems, Inc. to assist in its use, correction, 17dfdcada3SDoug Rabson * modification or enhancement. 18dfdcada3SDoug Rabson * 19dfdcada3SDoug Rabson * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 20dfdcada3SDoug Rabson * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 21dfdcada3SDoug Rabson * OR ANY PART THEREOF. 22dfdcada3SDoug Rabson * 23dfdcada3SDoug Rabson * In no event will Sun Microsystems, Inc. be liable for any lost revenue 24dfdcada3SDoug Rabson * or profits or other special, indirect and consequential damages, even if 25dfdcada3SDoug Rabson * Sun has been advised of the possibility of such damages. 26dfdcada3SDoug Rabson * 27dfdcada3SDoug Rabson * Sun Microsystems, Inc. 28dfdcada3SDoug Rabson * 2550 Garcia Avenue 29dfdcada3SDoug Rabson * Mountain View, California 94043 30dfdcada3SDoug Rabson */ 31dfdcada3SDoug Rabson 32dfdcada3SDoug Rabson #if defined(LIBC_SCCS) && !defined(lint) 33dfdcada3SDoug Rabson static char *sccsid2 = "@(#)xdr.c 1.35 87/08/12"; 34dfdcada3SDoug Rabson static char *sccsid = "@(#)xdr.c 2.1 88/07/29 4.0 RPCSRC"; 35dfdcada3SDoug Rabson #endif 36dfdcada3SDoug Rabson #include <sys/cdefs.h> 37dfdcada3SDoug Rabson __FBSDID("$FreeBSD$"); 38dfdcada3SDoug Rabson 39dfdcada3SDoug Rabson /* 40dfdcada3SDoug Rabson * xdr.c, Generic XDR routines implementation. 41dfdcada3SDoug Rabson * 42dfdcada3SDoug Rabson * Copyright (C) 1986, Sun Microsystems, Inc. 43dfdcada3SDoug Rabson * 44dfdcada3SDoug Rabson * These are the "generic" xdr routines used to serialize and de-serialize 45dfdcada3SDoug Rabson * most common data items. See xdr.h for more info on the interface to 46dfdcada3SDoug Rabson * xdr. 47dfdcada3SDoug Rabson */ 48dfdcada3SDoug Rabson 49dfdcada3SDoug Rabson #include <sys/param.h> 50dfdcada3SDoug Rabson #include <sys/systm.h> 51dfdcada3SDoug Rabson #include <sys/kernel.h> 52dfdcada3SDoug Rabson #include <sys/malloc.h> 53dfdcada3SDoug Rabson 54dfdcada3SDoug Rabson #include <rpc/types.h> 55dfdcada3SDoug Rabson #include <rpc/xdr.h> 56dfdcada3SDoug Rabson 57dfdcada3SDoug Rabson typedef quad_t longlong_t; /* ANSI long long type */ 58dfdcada3SDoug Rabson typedef u_quad_t u_longlong_t; /* ANSI unsigned long long type */ 59dfdcada3SDoug Rabson 60dfdcada3SDoug Rabson /* 61dfdcada3SDoug Rabson * constants specific to the xdr "protocol" 62dfdcada3SDoug Rabson */ 63dfdcada3SDoug Rabson #define XDR_FALSE ((long) 0) 64dfdcada3SDoug Rabson #define XDR_TRUE ((long) 1) 65dfdcada3SDoug Rabson #define LASTUNSIGNED ((u_int) 0-1) 66dfdcada3SDoug Rabson 67dfdcada3SDoug Rabson /* 68dfdcada3SDoug Rabson * for unit alignment 69dfdcada3SDoug Rabson */ 70dfdcada3SDoug Rabson static const char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 }; 71dfdcada3SDoug Rabson 72dfdcada3SDoug Rabson /* 73dfdcada3SDoug Rabson * Free a data structure using XDR 74dfdcada3SDoug Rabson * Not a filter, but a convenient utility nonetheless 75dfdcada3SDoug Rabson */ 76dfdcada3SDoug Rabson void 77dfdcada3SDoug Rabson xdr_free(xdrproc_t proc, void *objp) 78dfdcada3SDoug Rabson { 79dfdcada3SDoug Rabson XDR x; 80dfdcada3SDoug Rabson 81dfdcada3SDoug Rabson x.x_op = XDR_FREE; 82dfdcada3SDoug Rabson (*proc)(&x, objp); 83dfdcada3SDoug Rabson } 84dfdcada3SDoug Rabson 85dfdcada3SDoug Rabson /* 86dfdcada3SDoug Rabson * XDR nothing 87dfdcada3SDoug Rabson */ 88dfdcada3SDoug Rabson bool_t 89dfdcada3SDoug Rabson xdr_void(void) 90dfdcada3SDoug Rabson { 91dfdcada3SDoug Rabson 92dfdcada3SDoug Rabson return (TRUE); 93dfdcada3SDoug Rabson } 94dfdcada3SDoug Rabson 95dfdcada3SDoug Rabson 96dfdcada3SDoug Rabson /* 97dfdcada3SDoug Rabson * XDR integers 98dfdcada3SDoug Rabson */ 99dfdcada3SDoug Rabson bool_t 100dfdcada3SDoug Rabson xdr_int(XDR *xdrs, int *ip) 101dfdcada3SDoug Rabson { 102dfdcada3SDoug Rabson long l; 103dfdcada3SDoug Rabson 104dfdcada3SDoug Rabson switch (xdrs->x_op) { 105dfdcada3SDoug Rabson 106dfdcada3SDoug Rabson case XDR_ENCODE: 107dfdcada3SDoug Rabson l = (long) *ip; 108dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, &l)); 109dfdcada3SDoug Rabson 110dfdcada3SDoug Rabson case XDR_DECODE: 111dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, &l)) { 112dfdcada3SDoug Rabson return (FALSE); 113dfdcada3SDoug Rabson } 114dfdcada3SDoug Rabson *ip = (int) l; 115dfdcada3SDoug Rabson return (TRUE); 116dfdcada3SDoug Rabson 117dfdcada3SDoug Rabson case XDR_FREE: 118dfdcada3SDoug Rabson return (TRUE); 119dfdcada3SDoug Rabson } 120dfdcada3SDoug Rabson /* NOTREACHED */ 121dfdcada3SDoug Rabson return (FALSE); 122dfdcada3SDoug Rabson } 123dfdcada3SDoug Rabson 124dfdcada3SDoug Rabson /* 125dfdcada3SDoug Rabson * XDR unsigned integers 126dfdcada3SDoug Rabson */ 127dfdcada3SDoug Rabson bool_t 128dfdcada3SDoug Rabson xdr_u_int(XDR *xdrs, u_int *up) 129dfdcada3SDoug Rabson { 130dfdcada3SDoug Rabson u_long l; 131dfdcada3SDoug Rabson 132dfdcada3SDoug Rabson switch (xdrs->x_op) { 133dfdcada3SDoug Rabson 134dfdcada3SDoug Rabson case XDR_ENCODE: 135dfdcada3SDoug Rabson l = (u_long) *up; 136dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&l)); 137dfdcada3SDoug Rabson 138dfdcada3SDoug Rabson case XDR_DECODE: 139dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, (long *)&l)) { 140dfdcada3SDoug Rabson return (FALSE); 141dfdcada3SDoug Rabson } 142dfdcada3SDoug Rabson *up = (u_int) l; 143dfdcada3SDoug Rabson return (TRUE); 144dfdcada3SDoug Rabson 145dfdcada3SDoug Rabson case XDR_FREE: 146dfdcada3SDoug Rabson return (TRUE); 147dfdcada3SDoug Rabson } 148dfdcada3SDoug Rabson /* NOTREACHED */ 149dfdcada3SDoug Rabson return (FALSE); 150dfdcada3SDoug Rabson } 151dfdcada3SDoug Rabson 152dfdcada3SDoug Rabson 153dfdcada3SDoug Rabson /* 154dfdcada3SDoug Rabson * XDR long integers 155dfdcada3SDoug Rabson * same as xdr_u_long - open coded to save a proc call! 156dfdcada3SDoug Rabson */ 157dfdcada3SDoug Rabson bool_t 158dfdcada3SDoug Rabson xdr_long(XDR *xdrs, long *lp) 159dfdcada3SDoug Rabson { 160dfdcada3SDoug Rabson switch (xdrs->x_op) { 161dfdcada3SDoug Rabson case XDR_ENCODE: 162dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, lp)); 163dfdcada3SDoug Rabson case XDR_DECODE: 164dfdcada3SDoug Rabson return (XDR_GETLONG(xdrs, lp)); 165dfdcada3SDoug Rabson case XDR_FREE: 166dfdcada3SDoug Rabson return (TRUE); 167dfdcada3SDoug Rabson } 168dfdcada3SDoug Rabson /* NOTREACHED */ 169dfdcada3SDoug Rabson return (FALSE); 170dfdcada3SDoug Rabson } 171dfdcada3SDoug Rabson 172dfdcada3SDoug Rabson /* 173dfdcada3SDoug Rabson * XDR unsigned long integers 174dfdcada3SDoug Rabson * same as xdr_long - open coded to save a proc call! 175dfdcada3SDoug Rabson */ 176dfdcada3SDoug Rabson bool_t 177dfdcada3SDoug Rabson xdr_u_long(XDR *xdrs, u_long *ulp) 178dfdcada3SDoug Rabson { 179dfdcada3SDoug Rabson switch (xdrs->x_op) { 180dfdcada3SDoug Rabson case XDR_ENCODE: 181dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)ulp)); 182dfdcada3SDoug Rabson case XDR_DECODE: 183dfdcada3SDoug Rabson return (XDR_GETLONG(xdrs, (long *)ulp)); 184dfdcada3SDoug Rabson case XDR_FREE: 185dfdcada3SDoug Rabson return (TRUE); 186dfdcada3SDoug Rabson } 187dfdcada3SDoug Rabson /* NOTREACHED */ 188dfdcada3SDoug Rabson return (FALSE); 189dfdcada3SDoug Rabson } 190dfdcada3SDoug Rabson 191dfdcada3SDoug Rabson 192dfdcada3SDoug Rabson /* 193dfdcada3SDoug Rabson * XDR 32-bit integers 194dfdcada3SDoug Rabson * same as xdr_uint32_t - open coded to save a proc call! 195dfdcada3SDoug Rabson */ 196dfdcada3SDoug Rabson bool_t 197dfdcada3SDoug Rabson xdr_int32_t(XDR *xdrs, int32_t *int32_p) 198dfdcada3SDoug Rabson { 199dfdcada3SDoug Rabson long l; 200dfdcada3SDoug Rabson 201dfdcada3SDoug Rabson switch (xdrs->x_op) { 202dfdcada3SDoug Rabson 203dfdcada3SDoug Rabson case XDR_ENCODE: 204dfdcada3SDoug Rabson l = (long) *int32_p; 205dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, &l)); 206dfdcada3SDoug Rabson 207dfdcada3SDoug Rabson case XDR_DECODE: 208dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, &l)) { 209dfdcada3SDoug Rabson return (FALSE); 210dfdcada3SDoug Rabson } 211dfdcada3SDoug Rabson *int32_p = (int32_t) l; 212dfdcada3SDoug Rabson return (TRUE); 213dfdcada3SDoug Rabson 214dfdcada3SDoug Rabson case XDR_FREE: 215dfdcada3SDoug Rabson return (TRUE); 216dfdcada3SDoug Rabson } 217dfdcada3SDoug Rabson /* NOTREACHED */ 218dfdcada3SDoug Rabson return (FALSE); 219dfdcada3SDoug Rabson } 220dfdcada3SDoug Rabson 221dfdcada3SDoug Rabson /* 222dfdcada3SDoug Rabson * XDR unsigned 32-bit integers 223dfdcada3SDoug Rabson * same as xdr_int32_t - open coded to save a proc call! 224dfdcada3SDoug Rabson */ 225dfdcada3SDoug Rabson bool_t 226dfdcada3SDoug Rabson xdr_uint32_t(XDR *xdrs, uint32_t *uint32_p) 227dfdcada3SDoug Rabson { 228dfdcada3SDoug Rabson u_long l; 229dfdcada3SDoug Rabson 230dfdcada3SDoug Rabson switch (xdrs->x_op) { 231dfdcada3SDoug Rabson 232dfdcada3SDoug Rabson case XDR_ENCODE: 233dfdcada3SDoug Rabson l = (u_long) *uint32_p; 234dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&l)); 235dfdcada3SDoug Rabson 236dfdcada3SDoug Rabson case XDR_DECODE: 237dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, (long *)&l)) { 238dfdcada3SDoug Rabson return (FALSE); 239dfdcada3SDoug Rabson } 240dfdcada3SDoug Rabson *uint32_p = (uint32_t) l; 241dfdcada3SDoug Rabson return (TRUE); 242dfdcada3SDoug Rabson 243dfdcada3SDoug Rabson case XDR_FREE: 244dfdcada3SDoug Rabson return (TRUE); 245dfdcada3SDoug Rabson } 246dfdcada3SDoug Rabson /* NOTREACHED */ 247dfdcada3SDoug Rabson return (FALSE); 248dfdcada3SDoug Rabson } 249dfdcada3SDoug Rabson 250dfdcada3SDoug Rabson 251dfdcada3SDoug Rabson /* 252dfdcada3SDoug Rabson * XDR short integers 253dfdcada3SDoug Rabson */ 254dfdcada3SDoug Rabson bool_t 255dfdcada3SDoug Rabson xdr_short(XDR *xdrs, short *sp) 256dfdcada3SDoug Rabson { 257dfdcada3SDoug Rabson long l; 258dfdcada3SDoug Rabson 259dfdcada3SDoug Rabson switch (xdrs->x_op) { 260dfdcada3SDoug Rabson 261dfdcada3SDoug Rabson case XDR_ENCODE: 262dfdcada3SDoug Rabson l = (long) *sp; 263dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, &l)); 264dfdcada3SDoug Rabson 265dfdcada3SDoug Rabson case XDR_DECODE: 266dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, &l)) { 267dfdcada3SDoug Rabson return (FALSE); 268dfdcada3SDoug Rabson } 269dfdcada3SDoug Rabson *sp = (short) l; 270dfdcada3SDoug Rabson return (TRUE); 271dfdcada3SDoug Rabson 272dfdcada3SDoug Rabson case XDR_FREE: 273dfdcada3SDoug Rabson return (TRUE); 274dfdcada3SDoug Rabson } 275dfdcada3SDoug Rabson /* NOTREACHED */ 276dfdcada3SDoug Rabson return (FALSE); 277dfdcada3SDoug Rabson } 278dfdcada3SDoug Rabson 279dfdcada3SDoug Rabson /* 280dfdcada3SDoug Rabson * XDR unsigned short integers 281dfdcada3SDoug Rabson */ 282dfdcada3SDoug Rabson bool_t 283dfdcada3SDoug Rabson xdr_u_short(XDR *xdrs, u_short *usp) 284dfdcada3SDoug Rabson { 285dfdcada3SDoug Rabson u_long l; 286dfdcada3SDoug Rabson 287dfdcada3SDoug Rabson switch (xdrs->x_op) { 288dfdcada3SDoug Rabson 289dfdcada3SDoug Rabson case XDR_ENCODE: 290dfdcada3SDoug Rabson l = (u_long) *usp; 291dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&l)); 292dfdcada3SDoug Rabson 293dfdcada3SDoug Rabson case XDR_DECODE: 294dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, (long *)&l)) { 295dfdcada3SDoug Rabson return (FALSE); 296dfdcada3SDoug Rabson } 297dfdcada3SDoug Rabson *usp = (u_short) l; 298dfdcada3SDoug Rabson return (TRUE); 299dfdcada3SDoug Rabson 300dfdcada3SDoug Rabson case XDR_FREE: 301dfdcada3SDoug Rabson return (TRUE); 302dfdcada3SDoug Rabson } 303dfdcada3SDoug Rabson /* NOTREACHED */ 304dfdcada3SDoug Rabson return (FALSE); 305dfdcada3SDoug Rabson } 306dfdcada3SDoug Rabson 307dfdcada3SDoug Rabson 308dfdcada3SDoug Rabson /* 309dfdcada3SDoug Rabson * XDR 16-bit integers 310dfdcada3SDoug Rabson */ 311dfdcada3SDoug Rabson bool_t 312dfdcada3SDoug Rabson xdr_int16_t(XDR *xdrs, int16_t *int16_p) 313dfdcada3SDoug Rabson { 314dfdcada3SDoug Rabson long l; 315dfdcada3SDoug Rabson 316dfdcada3SDoug Rabson switch (xdrs->x_op) { 317dfdcada3SDoug Rabson 318dfdcada3SDoug Rabson case XDR_ENCODE: 319dfdcada3SDoug Rabson l = (long) *int16_p; 320dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, &l)); 321dfdcada3SDoug Rabson 322dfdcada3SDoug Rabson case XDR_DECODE: 323dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, &l)) { 324dfdcada3SDoug Rabson return (FALSE); 325dfdcada3SDoug Rabson } 326dfdcada3SDoug Rabson *int16_p = (int16_t) l; 327dfdcada3SDoug Rabson return (TRUE); 328dfdcada3SDoug Rabson 329dfdcada3SDoug Rabson case XDR_FREE: 330dfdcada3SDoug Rabson return (TRUE); 331dfdcada3SDoug Rabson } 332dfdcada3SDoug Rabson /* NOTREACHED */ 333dfdcada3SDoug Rabson return (FALSE); 334dfdcada3SDoug Rabson } 335dfdcada3SDoug Rabson 336dfdcada3SDoug Rabson /* 337dfdcada3SDoug Rabson * XDR unsigned 16-bit integers 338dfdcada3SDoug Rabson */ 339dfdcada3SDoug Rabson bool_t 340dfdcada3SDoug Rabson xdr_uint16_t(XDR *xdrs, uint16_t *uint16_p) 341dfdcada3SDoug Rabson { 342dfdcada3SDoug Rabson u_long l; 343dfdcada3SDoug Rabson 344dfdcada3SDoug Rabson switch (xdrs->x_op) { 345dfdcada3SDoug Rabson 346dfdcada3SDoug Rabson case XDR_ENCODE: 347dfdcada3SDoug Rabson l = (u_long) *uint16_p; 348dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&l)); 349dfdcada3SDoug Rabson 350dfdcada3SDoug Rabson case XDR_DECODE: 351dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, (long *)&l)) { 352dfdcada3SDoug Rabson return (FALSE); 353dfdcada3SDoug Rabson } 354dfdcada3SDoug Rabson *uint16_p = (uint16_t) l; 355dfdcada3SDoug Rabson return (TRUE); 356dfdcada3SDoug Rabson 357dfdcada3SDoug Rabson case XDR_FREE: 358dfdcada3SDoug Rabson return (TRUE); 359dfdcada3SDoug Rabson } 360dfdcada3SDoug Rabson /* NOTREACHED */ 361dfdcada3SDoug Rabson return (FALSE); 362dfdcada3SDoug Rabson } 363dfdcada3SDoug Rabson 364dfdcada3SDoug Rabson 365dfdcada3SDoug Rabson /* 366dfdcada3SDoug Rabson * XDR a char 367dfdcada3SDoug Rabson */ 368dfdcada3SDoug Rabson bool_t 369dfdcada3SDoug Rabson xdr_char(XDR *xdrs, char *cp) 370dfdcada3SDoug Rabson { 371dfdcada3SDoug Rabson int i; 372dfdcada3SDoug Rabson 373dfdcada3SDoug Rabson i = (*cp); 374dfdcada3SDoug Rabson if (!xdr_int(xdrs, &i)) { 375dfdcada3SDoug Rabson return (FALSE); 376dfdcada3SDoug Rabson } 377dfdcada3SDoug Rabson *cp = i; 378dfdcada3SDoug Rabson return (TRUE); 379dfdcada3SDoug Rabson } 380dfdcada3SDoug Rabson 381dfdcada3SDoug Rabson /* 382dfdcada3SDoug Rabson * XDR an unsigned char 383dfdcada3SDoug Rabson */ 384dfdcada3SDoug Rabson bool_t 385dfdcada3SDoug Rabson xdr_u_char(XDR *xdrs, u_char *cp) 386dfdcada3SDoug Rabson { 387dfdcada3SDoug Rabson u_int u; 388dfdcada3SDoug Rabson 389dfdcada3SDoug Rabson u = (*cp); 390dfdcada3SDoug Rabson if (!xdr_u_int(xdrs, &u)) { 391dfdcada3SDoug Rabson return (FALSE); 392dfdcada3SDoug Rabson } 393dfdcada3SDoug Rabson *cp = u; 394dfdcada3SDoug Rabson return (TRUE); 395dfdcada3SDoug Rabson } 396dfdcada3SDoug Rabson 397dfdcada3SDoug Rabson /* 398dfdcada3SDoug Rabson * XDR booleans 399dfdcada3SDoug Rabson */ 400dfdcada3SDoug Rabson bool_t 401dfdcada3SDoug Rabson xdr_bool(XDR *xdrs, bool_t *bp) 402dfdcada3SDoug Rabson { 403dfdcada3SDoug Rabson long lb; 404dfdcada3SDoug Rabson 405dfdcada3SDoug Rabson switch (xdrs->x_op) { 406dfdcada3SDoug Rabson 407dfdcada3SDoug Rabson case XDR_ENCODE: 408dfdcada3SDoug Rabson lb = *bp ? XDR_TRUE : XDR_FALSE; 409dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, &lb)); 410dfdcada3SDoug Rabson 411dfdcada3SDoug Rabson case XDR_DECODE: 412dfdcada3SDoug Rabson if (!XDR_GETLONG(xdrs, &lb)) { 413dfdcada3SDoug Rabson return (FALSE); 414dfdcada3SDoug Rabson } 415dfdcada3SDoug Rabson *bp = (lb == XDR_FALSE) ? FALSE : TRUE; 416dfdcada3SDoug Rabson return (TRUE); 417dfdcada3SDoug Rabson 418dfdcada3SDoug Rabson case XDR_FREE: 419dfdcada3SDoug Rabson return (TRUE); 420dfdcada3SDoug Rabson } 421dfdcada3SDoug Rabson /* NOTREACHED */ 422dfdcada3SDoug Rabson return (FALSE); 423dfdcada3SDoug Rabson } 424dfdcada3SDoug Rabson 425dfdcada3SDoug Rabson /* 426dfdcada3SDoug Rabson * XDR enumerations 427dfdcada3SDoug Rabson */ 428dfdcada3SDoug Rabson bool_t 429dfdcada3SDoug Rabson xdr_enum(XDR *xdrs, enum_t *ep) 430dfdcada3SDoug Rabson { 431dfdcada3SDoug Rabson enum sizecheck { SIZEVAL }; /* used to find the size of an enum */ 432dfdcada3SDoug Rabson 433dfdcada3SDoug Rabson /* 434dfdcada3SDoug Rabson * enums are treated as ints 435dfdcada3SDoug Rabson */ 436dfdcada3SDoug Rabson /* LINTED */ if (sizeof (enum sizecheck) == sizeof (long)) { 437dfdcada3SDoug Rabson return (xdr_long(xdrs, (long *)(void *)ep)); 438dfdcada3SDoug Rabson } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (int)) { 439dfdcada3SDoug Rabson return (xdr_int(xdrs, (int *)(void *)ep)); 440dfdcada3SDoug Rabson } else /* LINTED */ if (sizeof (enum sizecheck) == sizeof (short)) { 441dfdcada3SDoug Rabson return (xdr_short(xdrs, (short *)(void *)ep)); 442dfdcada3SDoug Rabson } else { 443dfdcada3SDoug Rabson return (FALSE); 444dfdcada3SDoug Rabson } 445dfdcada3SDoug Rabson } 446dfdcada3SDoug Rabson 447dfdcada3SDoug Rabson /* 448dfdcada3SDoug Rabson * XDR opaque data 449dfdcada3SDoug Rabson * Allows the specification of a fixed size sequence of opaque bytes. 450dfdcada3SDoug Rabson * cp points to the opaque object and cnt gives the byte length. 451dfdcada3SDoug Rabson */ 452dfdcada3SDoug Rabson bool_t 453dfdcada3SDoug Rabson xdr_opaque(XDR *xdrs, caddr_t cp, u_int cnt) 454dfdcada3SDoug Rabson { 455dfdcada3SDoug Rabson u_int rndup; 456dfdcada3SDoug Rabson static int crud[BYTES_PER_XDR_UNIT]; 457dfdcada3SDoug Rabson 458dfdcada3SDoug Rabson /* 459dfdcada3SDoug Rabson * if no data we are done 460dfdcada3SDoug Rabson */ 461dfdcada3SDoug Rabson if (cnt == 0) 462dfdcada3SDoug Rabson return (TRUE); 463dfdcada3SDoug Rabson 464dfdcada3SDoug Rabson /* 465dfdcada3SDoug Rabson * round byte count to full xdr units 466dfdcada3SDoug Rabson */ 467dfdcada3SDoug Rabson rndup = cnt % BYTES_PER_XDR_UNIT; 468dfdcada3SDoug Rabson if (rndup > 0) 469dfdcada3SDoug Rabson rndup = BYTES_PER_XDR_UNIT - rndup; 470dfdcada3SDoug Rabson 471dfdcada3SDoug Rabson if (xdrs->x_op == XDR_DECODE) { 472dfdcada3SDoug Rabson if (!XDR_GETBYTES(xdrs, cp, cnt)) { 473dfdcada3SDoug Rabson return (FALSE); 474dfdcada3SDoug Rabson } 475dfdcada3SDoug Rabson if (rndup == 0) 476dfdcada3SDoug Rabson return (TRUE); 477dfdcada3SDoug Rabson return (XDR_GETBYTES(xdrs, (caddr_t)(void *)crud, rndup)); 478dfdcada3SDoug Rabson } 479dfdcada3SDoug Rabson 480dfdcada3SDoug Rabson if (xdrs->x_op == XDR_ENCODE) { 481dfdcada3SDoug Rabson if (!XDR_PUTBYTES(xdrs, cp, cnt)) { 482dfdcada3SDoug Rabson return (FALSE); 483dfdcada3SDoug Rabson } 484dfdcada3SDoug Rabson if (rndup == 0) 485dfdcada3SDoug Rabson return (TRUE); 486dfdcada3SDoug Rabson return (XDR_PUTBYTES(xdrs, xdr_zero, rndup)); 487dfdcada3SDoug Rabson } 488dfdcada3SDoug Rabson 489dfdcada3SDoug Rabson if (xdrs->x_op == XDR_FREE) { 490dfdcada3SDoug Rabson return (TRUE); 491dfdcada3SDoug Rabson } 492dfdcada3SDoug Rabson 493dfdcada3SDoug Rabson return (FALSE); 494dfdcada3SDoug Rabson } 495dfdcada3SDoug Rabson 496dfdcada3SDoug Rabson /* 497dfdcada3SDoug Rabson * XDR counted bytes 498dfdcada3SDoug Rabson * *cpp is a pointer to the bytes, *sizep is the count. 499dfdcada3SDoug Rabson * If *cpp is NULL maxsize bytes are allocated 500dfdcada3SDoug Rabson */ 501dfdcada3SDoug Rabson bool_t 502dfdcada3SDoug Rabson xdr_bytes(XDR *xdrs, char **cpp, u_int *sizep, u_int maxsize) 503dfdcada3SDoug Rabson { 504dfdcada3SDoug Rabson char *sp = *cpp; /* sp is the actual string pointer */ 505dfdcada3SDoug Rabson u_int nodesize; 506dfdcada3SDoug Rabson 507dfdcada3SDoug Rabson /* 508dfdcada3SDoug Rabson * first deal with the length since xdr bytes are counted 509dfdcada3SDoug Rabson */ 510dfdcada3SDoug Rabson if (! xdr_u_int(xdrs, sizep)) { 511dfdcada3SDoug Rabson return (FALSE); 512dfdcada3SDoug Rabson } 513dfdcada3SDoug Rabson nodesize = *sizep; 514dfdcada3SDoug Rabson if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) { 515dfdcada3SDoug Rabson return (FALSE); 516dfdcada3SDoug Rabson } 517dfdcada3SDoug Rabson 518dfdcada3SDoug Rabson /* 519dfdcada3SDoug Rabson * now deal with the actual bytes 520dfdcada3SDoug Rabson */ 521dfdcada3SDoug Rabson switch (xdrs->x_op) { 522dfdcada3SDoug Rabson 523dfdcada3SDoug Rabson case XDR_DECODE: 524dfdcada3SDoug Rabson if (nodesize == 0) { 525dfdcada3SDoug Rabson return (TRUE); 526dfdcada3SDoug Rabson } 527dfdcada3SDoug Rabson if (sp == NULL) { 528dfdcada3SDoug Rabson *cpp = sp = mem_alloc(nodesize); 529dfdcada3SDoug Rabson } 530dfdcada3SDoug Rabson if (sp == NULL) { 531dfdcada3SDoug Rabson printf("xdr_bytes: out of memory"); 532dfdcada3SDoug Rabson return (FALSE); 533dfdcada3SDoug Rabson } 534dfdcada3SDoug Rabson /* FALLTHROUGH */ 535dfdcada3SDoug Rabson 536dfdcada3SDoug Rabson case XDR_ENCODE: 537dfdcada3SDoug Rabson return (xdr_opaque(xdrs, sp, nodesize)); 538dfdcada3SDoug Rabson 539dfdcada3SDoug Rabson case XDR_FREE: 540dfdcada3SDoug Rabson if (sp != NULL) { 541dfdcada3SDoug Rabson mem_free(sp, nodesize); 542dfdcada3SDoug Rabson *cpp = NULL; 543dfdcada3SDoug Rabson } 544dfdcada3SDoug Rabson return (TRUE); 545dfdcada3SDoug Rabson } 546dfdcada3SDoug Rabson /* NOTREACHED */ 547dfdcada3SDoug Rabson return (FALSE); 548dfdcada3SDoug Rabson } 549dfdcada3SDoug Rabson 550dfdcada3SDoug Rabson /* 551dfdcada3SDoug Rabson * Implemented here due to commonality of the object. 552dfdcada3SDoug Rabson */ 553dfdcada3SDoug Rabson bool_t 554dfdcada3SDoug Rabson xdr_netobj(XDR *xdrs, struct netobj *np) 555dfdcada3SDoug Rabson { 556dfdcada3SDoug Rabson 557dfdcada3SDoug Rabson return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ)); 558dfdcada3SDoug Rabson } 559dfdcada3SDoug Rabson 560dfdcada3SDoug Rabson /* 561dfdcada3SDoug Rabson * XDR a descriminated union 562dfdcada3SDoug Rabson * Support routine for discriminated unions. 563dfdcada3SDoug Rabson * You create an array of xdrdiscrim structures, terminated with 564dfdcada3SDoug Rabson * an entry with a null procedure pointer. The routine gets 565dfdcada3SDoug Rabson * the discriminant value and then searches the array of xdrdiscrims 566dfdcada3SDoug Rabson * looking for that value. It calls the procedure given in the xdrdiscrim 567dfdcada3SDoug Rabson * to handle the discriminant. If there is no specific routine a default 568dfdcada3SDoug Rabson * routine may be called. 569dfdcada3SDoug Rabson * If there is no specific or default routine an error is returned. 570dfdcada3SDoug Rabson */ 571dfdcada3SDoug Rabson bool_t 572dfdcada3SDoug Rabson xdr_union(XDR *xdrs, 573dfdcada3SDoug Rabson enum_t *dscmp, /* enum to decide which arm to work on */ 574dfdcada3SDoug Rabson char *unp, /* the union itself */ 575dfdcada3SDoug Rabson const struct xdr_discrim *choices, /* [value, xdr proc] for each arm */ 576dfdcada3SDoug Rabson xdrproc_t dfault) /* default xdr routine */ 577dfdcada3SDoug Rabson { 578dfdcada3SDoug Rabson enum_t dscm; 579dfdcada3SDoug Rabson 580dfdcada3SDoug Rabson /* 581dfdcada3SDoug Rabson * we deal with the discriminator; it's an enum 582dfdcada3SDoug Rabson */ 583dfdcada3SDoug Rabson if (! xdr_enum(xdrs, dscmp)) { 584dfdcada3SDoug Rabson return (FALSE); 585dfdcada3SDoug Rabson } 586dfdcada3SDoug Rabson dscm = *dscmp; 587dfdcada3SDoug Rabson 588dfdcada3SDoug Rabson /* 589dfdcada3SDoug Rabson * search choices for a value that matches the discriminator. 590dfdcada3SDoug Rabson * if we find one, execute the xdr routine for that value. 591dfdcada3SDoug Rabson */ 592dfdcada3SDoug Rabson for (; choices->proc != NULL_xdrproc_t; choices++) { 593dfdcada3SDoug Rabson if (choices->value == dscm) 594dfdcada3SDoug Rabson return ((*(choices->proc))(xdrs, unp)); 595dfdcada3SDoug Rabson } 596dfdcada3SDoug Rabson 597dfdcada3SDoug Rabson /* 598dfdcada3SDoug Rabson * no match - execute the default xdr routine if there is one 599dfdcada3SDoug Rabson */ 600dfdcada3SDoug Rabson return ((dfault == NULL_xdrproc_t) ? FALSE : 601dfdcada3SDoug Rabson (*dfault)(xdrs, unp)); 602dfdcada3SDoug Rabson } 603dfdcada3SDoug Rabson 604dfdcada3SDoug Rabson 605dfdcada3SDoug Rabson /* 606dfdcada3SDoug Rabson * Non-portable xdr primitives. 607dfdcada3SDoug Rabson * Care should be taken when moving these routines to new architectures. 608dfdcada3SDoug Rabson */ 609dfdcada3SDoug Rabson 610dfdcada3SDoug Rabson 611dfdcada3SDoug Rabson /* 612dfdcada3SDoug Rabson * XDR null terminated ASCII strings 613dfdcada3SDoug Rabson * xdr_string deals with "C strings" - arrays of bytes that are 614dfdcada3SDoug Rabson * terminated by a NULL character. The parameter cpp references a 615dfdcada3SDoug Rabson * pointer to storage; If the pointer is null, then the necessary 616dfdcada3SDoug Rabson * storage is allocated. The last parameter is the max allowed length 617dfdcada3SDoug Rabson * of the string as specified by a protocol. 618dfdcada3SDoug Rabson */ 619dfdcada3SDoug Rabson bool_t 620dfdcada3SDoug Rabson xdr_string(XDR *xdrs, char **cpp, u_int maxsize) 621dfdcada3SDoug Rabson { 622dfdcada3SDoug Rabson char *sp = *cpp; /* sp is the actual string pointer */ 623dfdcada3SDoug Rabson u_int size; 624dfdcada3SDoug Rabson u_int nodesize; 625dfdcada3SDoug Rabson 626dfdcada3SDoug Rabson /* 627dfdcada3SDoug Rabson * first deal with the length since xdr strings are counted-strings 628dfdcada3SDoug Rabson */ 629dfdcada3SDoug Rabson switch (xdrs->x_op) { 630dfdcada3SDoug Rabson case XDR_FREE: 631dfdcada3SDoug Rabson if (sp == NULL) { 632dfdcada3SDoug Rabson return(TRUE); /* already free */ 633dfdcada3SDoug Rabson } 634dfdcada3SDoug Rabson /* FALLTHROUGH */ 635dfdcada3SDoug Rabson case XDR_ENCODE: 636dfdcada3SDoug Rabson size = strlen(sp); 637dfdcada3SDoug Rabson break; 638dfdcada3SDoug Rabson case XDR_DECODE: 639dfdcada3SDoug Rabson break; 640dfdcada3SDoug Rabson } 641dfdcada3SDoug Rabson if (! xdr_u_int(xdrs, &size)) { 642dfdcada3SDoug Rabson return (FALSE); 643dfdcada3SDoug Rabson } 644dfdcada3SDoug Rabson if (size > maxsize) { 645dfdcada3SDoug Rabson return (FALSE); 646dfdcada3SDoug Rabson } 647dfdcada3SDoug Rabson nodesize = size + 1; 648dfdcada3SDoug Rabson 649dfdcada3SDoug Rabson /* 650dfdcada3SDoug Rabson * now deal with the actual bytes 651dfdcada3SDoug Rabson */ 652dfdcada3SDoug Rabson switch (xdrs->x_op) { 653dfdcada3SDoug Rabson 654dfdcada3SDoug Rabson case XDR_DECODE: 655dfdcada3SDoug Rabson if (nodesize == 0) { 656dfdcada3SDoug Rabson return (TRUE); 657dfdcada3SDoug Rabson } 658dfdcada3SDoug Rabson if (sp == NULL) 659dfdcada3SDoug Rabson *cpp = sp = mem_alloc(nodesize); 660dfdcada3SDoug Rabson if (sp == NULL) { 661dfdcada3SDoug Rabson printf("xdr_string: out of memory"); 662dfdcada3SDoug Rabson return (FALSE); 663dfdcada3SDoug Rabson } 664dfdcada3SDoug Rabson sp[size] = 0; 665dfdcada3SDoug Rabson /* FALLTHROUGH */ 666dfdcada3SDoug Rabson 667dfdcada3SDoug Rabson case XDR_ENCODE: 668dfdcada3SDoug Rabson return (xdr_opaque(xdrs, sp, size)); 669dfdcada3SDoug Rabson 670dfdcada3SDoug Rabson case XDR_FREE: 671dfdcada3SDoug Rabson mem_free(sp, nodesize); 672dfdcada3SDoug Rabson *cpp = NULL; 673dfdcada3SDoug Rabson return (TRUE); 674dfdcada3SDoug Rabson } 675dfdcada3SDoug Rabson /* NOTREACHED */ 676dfdcada3SDoug Rabson return (FALSE); 677dfdcada3SDoug Rabson } 678dfdcada3SDoug Rabson 679dfdcada3SDoug Rabson /* 680dfdcada3SDoug Rabson * Wrapper for xdr_string that can be called directly from 681dfdcada3SDoug Rabson * routines like clnt_call 682dfdcada3SDoug Rabson */ 683dfdcada3SDoug Rabson bool_t 684dfdcada3SDoug Rabson xdr_wrapstring(XDR *xdrs, char **cpp) 685dfdcada3SDoug Rabson { 686dfdcada3SDoug Rabson return xdr_string(xdrs, cpp, LASTUNSIGNED); 687dfdcada3SDoug Rabson } 688dfdcada3SDoug Rabson 689dfdcada3SDoug Rabson /* 690dfdcada3SDoug Rabson * NOTE: xdr_hyper(), xdr_u_hyper(), xdr_longlong_t(), and xdr_u_longlong_t() 691dfdcada3SDoug Rabson * are in the "non-portable" section because they require that a `long long' 692dfdcada3SDoug Rabson * be a 64-bit type. 693dfdcada3SDoug Rabson * 694dfdcada3SDoug Rabson * --thorpej@netbsd.org, November 30, 1999 695dfdcada3SDoug Rabson */ 696dfdcada3SDoug Rabson 697dfdcada3SDoug Rabson /* 698dfdcada3SDoug Rabson * XDR 64-bit integers 699dfdcada3SDoug Rabson */ 700dfdcada3SDoug Rabson bool_t 701dfdcada3SDoug Rabson xdr_int64_t(XDR *xdrs, int64_t *llp) 702dfdcada3SDoug Rabson { 703dfdcada3SDoug Rabson u_long ul[2]; 704dfdcada3SDoug Rabson 705dfdcada3SDoug Rabson switch (xdrs->x_op) { 706dfdcada3SDoug Rabson case XDR_ENCODE: 707dfdcada3SDoug Rabson ul[0] = (u_long)((uint64_t)*llp >> 32) & 0xffffffff; 708dfdcada3SDoug Rabson ul[1] = (u_long)((uint64_t)*llp) & 0xffffffff; 709dfdcada3SDoug Rabson if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) 710dfdcada3SDoug Rabson return (FALSE); 711dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&ul[1])); 712dfdcada3SDoug Rabson case XDR_DECODE: 713dfdcada3SDoug Rabson if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) 714dfdcada3SDoug Rabson return (FALSE); 715dfdcada3SDoug Rabson if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) 716dfdcada3SDoug Rabson return (FALSE); 717dfdcada3SDoug Rabson *llp = (int64_t) 718dfdcada3SDoug Rabson (((uint64_t)ul[0] << 32) | ((uint64_t)ul[1])); 719dfdcada3SDoug Rabson return (TRUE); 720dfdcada3SDoug Rabson case XDR_FREE: 721dfdcada3SDoug Rabson return (TRUE); 722dfdcada3SDoug Rabson } 723dfdcada3SDoug Rabson /* NOTREACHED */ 724dfdcada3SDoug Rabson return (FALSE); 725dfdcada3SDoug Rabson } 726dfdcada3SDoug Rabson 727dfdcada3SDoug Rabson 728dfdcada3SDoug Rabson /* 729dfdcada3SDoug Rabson * XDR unsigned 64-bit integers 730dfdcada3SDoug Rabson */ 731dfdcada3SDoug Rabson bool_t 732dfdcada3SDoug Rabson xdr_uint64_t(XDR *xdrs, uint64_t *ullp) 733dfdcada3SDoug Rabson { 734dfdcada3SDoug Rabson u_long ul[2]; 735dfdcada3SDoug Rabson 736dfdcada3SDoug Rabson switch (xdrs->x_op) { 737dfdcada3SDoug Rabson case XDR_ENCODE: 738dfdcada3SDoug Rabson ul[0] = (u_long)(*ullp >> 32) & 0xffffffff; 739dfdcada3SDoug Rabson ul[1] = (u_long)(*ullp) & 0xffffffff; 740dfdcada3SDoug Rabson if (XDR_PUTLONG(xdrs, (long *)&ul[0]) == FALSE) 741dfdcada3SDoug Rabson return (FALSE); 742dfdcada3SDoug Rabson return (XDR_PUTLONG(xdrs, (long *)&ul[1])); 743dfdcada3SDoug Rabson case XDR_DECODE: 744dfdcada3SDoug Rabson if (XDR_GETLONG(xdrs, (long *)&ul[0]) == FALSE) 745dfdcada3SDoug Rabson return (FALSE); 746dfdcada3SDoug Rabson if (XDR_GETLONG(xdrs, (long *)&ul[1]) == FALSE) 747dfdcada3SDoug Rabson return (FALSE); 748dfdcada3SDoug Rabson *ullp = (uint64_t) 749dfdcada3SDoug Rabson (((uint64_t)ul[0] << 32) | ((uint64_t)ul[1])); 750dfdcada3SDoug Rabson return (TRUE); 751dfdcada3SDoug Rabson case XDR_FREE: 752dfdcada3SDoug Rabson return (TRUE); 753dfdcada3SDoug Rabson } 754dfdcada3SDoug Rabson /* NOTREACHED */ 755dfdcada3SDoug Rabson return (FALSE); 756dfdcada3SDoug Rabson } 757dfdcada3SDoug Rabson 758dfdcada3SDoug Rabson 759dfdcada3SDoug Rabson /* 760dfdcada3SDoug Rabson * XDR hypers 761dfdcada3SDoug Rabson */ 762dfdcada3SDoug Rabson bool_t 763dfdcada3SDoug Rabson xdr_hyper(XDR *xdrs, longlong_t *llp) 764dfdcada3SDoug Rabson { 765dfdcada3SDoug Rabson 766dfdcada3SDoug Rabson /* 767dfdcada3SDoug Rabson * Don't bother open-coding this; it's a fair amount of code. Just 768dfdcada3SDoug Rabson * call xdr_int64_t(). 769dfdcada3SDoug Rabson */ 770dfdcada3SDoug Rabson return (xdr_int64_t(xdrs, (int64_t *)llp)); 771dfdcada3SDoug Rabson } 772dfdcada3SDoug Rabson 773dfdcada3SDoug Rabson 774dfdcada3SDoug Rabson /* 775dfdcada3SDoug Rabson * XDR unsigned hypers 776dfdcada3SDoug Rabson */ 777dfdcada3SDoug Rabson bool_t 778dfdcada3SDoug Rabson xdr_u_hyper(XDR *xdrs, u_longlong_t *ullp) 779dfdcada3SDoug Rabson { 780dfdcada3SDoug Rabson 781dfdcada3SDoug Rabson /* 782dfdcada3SDoug Rabson * Don't bother open-coding this; it's a fair amount of code. Just 783dfdcada3SDoug Rabson * call xdr_uint64_t(). 784dfdcada3SDoug Rabson */ 785dfdcada3SDoug Rabson return (xdr_uint64_t(xdrs, (uint64_t *)ullp)); 786dfdcada3SDoug Rabson } 787dfdcada3SDoug Rabson 788dfdcada3SDoug Rabson 789dfdcada3SDoug Rabson /* 790dfdcada3SDoug Rabson * XDR longlong_t's 791dfdcada3SDoug Rabson */ 792dfdcada3SDoug Rabson bool_t 793dfdcada3SDoug Rabson xdr_longlong_t(XDR *xdrs, longlong_t *llp) 794dfdcada3SDoug Rabson { 795dfdcada3SDoug Rabson 796dfdcada3SDoug Rabson /* 797dfdcada3SDoug Rabson * Don't bother open-coding this; it's a fair amount of code. Just 798dfdcada3SDoug Rabson * call xdr_int64_t(). 799dfdcada3SDoug Rabson */ 800dfdcada3SDoug Rabson return (xdr_int64_t(xdrs, (int64_t *)llp)); 801dfdcada3SDoug Rabson } 802dfdcada3SDoug Rabson 803dfdcada3SDoug Rabson 804dfdcada3SDoug Rabson /* 805dfdcada3SDoug Rabson * XDR u_longlong_t's 806dfdcada3SDoug Rabson */ 807dfdcada3SDoug Rabson bool_t 808dfdcada3SDoug Rabson xdr_u_longlong_t(XDR *xdrs, u_longlong_t *ullp) 809dfdcada3SDoug Rabson { 810dfdcada3SDoug Rabson 811dfdcada3SDoug Rabson /* 812dfdcada3SDoug Rabson * Don't bother open-coding this; it's a fair amount of code. Just 813dfdcada3SDoug Rabson * call xdr_uint64_t(). 814dfdcada3SDoug Rabson */ 815dfdcada3SDoug Rabson return (xdr_uint64_t(xdrs, (uint64_t *)ullp)); 816dfdcada3SDoug Rabson } 817