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