1eae561b3SGarrett Wollman /* 2eae561b3SGarrett Wollman * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 3eae561b3SGarrett Wollman * unrestricted use provided that this legend is included on all tape 4eae561b3SGarrett Wollman * media and as a part of the software program in whole or part. Users 5eae561b3SGarrett Wollman * may copy or modify Sun RPC without charge, but are not authorized 6eae561b3SGarrett Wollman * to license or distribute it to anyone else except as part of a product or 7eae561b3SGarrett Wollman * program developed by the user. 8eae561b3SGarrett Wollman * 9eae561b3SGarrett Wollman * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 10eae561b3SGarrett Wollman * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 11eae561b3SGarrett Wollman * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 12eae561b3SGarrett Wollman * 13eae561b3SGarrett Wollman * Sun RPC is provided with no support and without any obligation on the 14eae561b3SGarrett Wollman * part of Sun Microsystems, Inc. to assist in its use, correction, 15eae561b3SGarrett Wollman * modification or enhancement. 16eae561b3SGarrett Wollman * 17eae561b3SGarrett Wollman * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 18eae561b3SGarrett Wollman * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 19eae561b3SGarrett Wollman * OR ANY PART THEREOF. 20eae561b3SGarrett Wollman * 21eae561b3SGarrett Wollman * In no event will Sun Microsystems, Inc. be liable for any lost revenue 22eae561b3SGarrett Wollman * or profits or other special, indirect and consequential damages, even if 23eae561b3SGarrett Wollman * Sun has been advised of the possibility of such damages. 24eae561b3SGarrett Wollman * 25eae561b3SGarrett Wollman * Sun Microsystems, Inc. 26eae561b3SGarrett Wollman * 2550 Garcia Avenue 27eae561b3SGarrett Wollman * Mountain View, California 94043 28eae561b3SGarrett Wollman */ 29eae561b3SGarrett Wollman 30eae561b3SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint) 31eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr.c 1.35 87/08/12";*/ 32eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr.c 2.1 88/07/29 4.0 RPCSRC";*/ 33c304ad8aSDavid E. O'Brien static char *rcsid = "$Id: xdr.c,v 1.7 1997/05/28 04:57:30 wpaul Exp $"; 34eae561b3SGarrett Wollman #endif 35eae561b3SGarrett Wollman 36eae561b3SGarrett Wollman /* 37eae561b3SGarrett Wollman * xdr.c, Generic XDR routines implementation. 38eae561b3SGarrett Wollman * 39eae561b3SGarrett Wollman * Copyright (C) 1986, Sun Microsystems, Inc. 40eae561b3SGarrett Wollman * 41eae561b3SGarrett Wollman * These are the "generic" xdr routines used to serialize and de-serialize 42eae561b3SGarrett Wollman * most common data items. See xdr.h for more info on the interface to 43eae561b3SGarrett Wollman * xdr. 44eae561b3SGarrett Wollman */ 45eae561b3SGarrett Wollman 46eae561b3SGarrett Wollman #include <stdio.h> 4729285d6cSPoul-Henning Kamp #include <stdlib.h> 481ad08a09SPeter Wemm #include <string.h> 49eae561b3SGarrett Wollman 50eae561b3SGarrett Wollman #include <rpc/types.h> 51eae561b3SGarrett Wollman #include <rpc/xdr.h> 52eae561b3SGarrett Wollman 53eae561b3SGarrett Wollman /* 54eae561b3SGarrett Wollman * constants specific to the xdr "protocol" 55eae561b3SGarrett Wollman */ 56eae561b3SGarrett Wollman #define XDR_FALSE ((long) 0) 57eae561b3SGarrett Wollman #define XDR_TRUE ((long) 1) 58eae561b3SGarrett Wollman #define LASTUNSIGNED ((u_int) 0-1) 59eae561b3SGarrett Wollman 60eae561b3SGarrett Wollman /* 61eae561b3SGarrett Wollman * for unit alignment 62eae561b3SGarrett Wollman */ 63eae561b3SGarrett Wollman static char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 }; 64eae561b3SGarrett Wollman 65eae561b3SGarrett Wollman /* 66eae561b3SGarrett Wollman * Free a data structure using XDR 67eae561b3SGarrett Wollman * Not a filter, but a convenient utility nonetheless 68eae561b3SGarrett Wollman */ 69eae561b3SGarrett Wollman void 70eae561b3SGarrett Wollman xdr_free(proc, objp) 71eae561b3SGarrett Wollman xdrproc_t proc; 72eae561b3SGarrett Wollman char *objp; 73eae561b3SGarrett Wollman { 74eae561b3SGarrett Wollman XDR x; 75eae561b3SGarrett Wollman 76eae561b3SGarrett Wollman x.x_op = XDR_FREE; 77eae561b3SGarrett Wollman (*proc)(&x, objp); 78eae561b3SGarrett Wollman } 79eae561b3SGarrett Wollman 80eae561b3SGarrett Wollman /* 81eae561b3SGarrett Wollman * XDR nothing 82eae561b3SGarrett Wollman */ 83eae561b3SGarrett Wollman bool_t 84eae561b3SGarrett Wollman xdr_void(/* xdrs, addr */) 85eae561b3SGarrett Wollman /* XDR *xdrs; */ 86eae561b3SGarrett Wollman /* caddr_t addr; */ 87eae561b3SGarrett Wollman { 88eae561b3SGarrett Wollman 89eae561b3SGarrett Wollman return (TRUE); 90eae561b3SGarrett Wollman } 91eae561b3SGarrett Wollman 921ad08a09SPeter Wemm 93eae561b3SGarrett Wollman /* 94eae561b3SGarrett Wollman * XDR integers 95eae561b3SGarrett Wollman */ 96eae561b3SGarrett Wollman bool_t 97eae561b3SGarrett Wollman xdr_int(xdrs, ip) 98eae561b3SGarrett Wollman XDR *xdrs; 99eae561b3SGarrett Wollman int *ip; 100eae561b3SGarrett Wollman { 1011ad08a09SPeter Wemm long l; 102eae561b3SGarrett Wollman 1031ad08a09SPeter Wemm switch (xdrs->x_op) { 1041ad08a09SPeter Wemm 1051ad08a09SPeter Wemm case XDR_ENCODE: 1061ad08a09SPeter Wemm l = (long) *ip; 1071ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, &l)); 1081ad08a09SPeter Wemm 1091ad08a09SPeter Wemm case XDR_DECODE: 1101ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, &l)) { 1111ad08a09SPeter Wemm return (FALSE); 112eae561b3SGarrett Wollman } 1131ad08a09SPeter Wemm *ip = (int) l; 1141ad08a09SPeter Wemm return (TRUE); 1151ad08a09SPeter Wemm 1161ad08a09SPeter Wemm case XDR_FREE: 1171ad08a09SPeter Wemm return (TRUE); 1181ad08a09SPeter Wemm } 1191ad08a09SPeter Wemm return (FALSE); 120eae561b3SGarrett Wollman } 121eae561b3SGarrett Wollman 122eae561b3SGarrett Wollman /* 123eae561b3SGarrett Wollman * XDR unsigned integers 124eae561b3SGarrett Wollman */ 125eae561b3SGarrett Wollman bool_t 126eae561b3SGarrett Wollman xdr_u_int(xdrs, up) 127eae561b3SGarrett Wollman XDR *xdrs; 128eae561b3SGarrett Wollman u_int *up; 129eae561b3SGarrett Wollman { 1301ad08a09SPeter Wemm u_long l; 131eae561b3SGarrett Wollman 1321ad08a09SPeter Wemm switch (xdrs->x_op) { 1331ad08a09SPeter Wemm 1341ad08a09SPeter Wemm case XDR_ENCODE: 1351ad08a09SPeter Wemm l = (u_long) *up; 1361ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 1371ad08a09SPeter Wemm 1381ad08a09SPeter Wemm case XDR_DECODE: 1391ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 1401ad08a09SPeter Wemm return (FALSE); 141eae561b3SGarrett Wollman } 1421ad08a09SPeter Wemm *up = (u_int) l; 1431ad08a09SPeter Wemm return (TRUE); 1441ad08a09SPeter Wemm 1451ad08a09SPeter Wemm case XDR_FREE: 1461ad08a09SPeter Wemm return (TRUE); 147eae561b3SGarrett Wollman } 1481ad08a09SPeter Wemm return (FALSE); 1491ad08a09SPeter Wemm } 1501ad08a09SPeter Wemm 151eae561b3SGarrett Wollman 152eae561b3SGarrett Wollman /* 153eae561b3SGarrett Wollman * XDR long integers 154eae561b3SGarrett Wollman * same as xdr_u_long - open coded to save a proc call! 155eae561b3SGarrett Wollman */ 156eae561b3SGarrett Wollman bool_t 157eae561b3SGarrett Wollman xdr_long(xdrs, lp) 158eae561b3SGarrett Wollman register XDR *xdrs; 159eae561b3SGarrett Wollman long *lp; 160eae561b3SGarrett Wollman { 1611ad08a09SPeter Wemm switch (xdrs->x_op) { 1621ad08a09SPeter Wemm case XDR_ENCODE: 163eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, lp)); 1641ad08a09SPeter Wemm case XDR_DECODE: 165eae561b3SGarrett Wollman return (XDR_GETLONG(xdrs, lp)); 1661ad08a09SPeter Wemm case XDR_FREE: 167eae561b3SGarrett Wollman return (TRUE); 1681ad08a09SPeter Wemm } 169eae561b3SGarrett Wollman 170eae561b3SGarrett Wollman return (FALSE); 171eae561b3SGarrett Wollman } 172eae561b3SGarrett Wollman 173eae561b3SGarrett Wollman /* 174eae561b3SGarrett Wollman * XDR unsigned long integers 175eae561b3SGarrett Wollman * same as xdr_long - open coded to save a proc call! 176eae561b3SGarrett Wollman */ 177eae561b3SGarrett Wollman bool_t 178eae561b3SGarrett Wollman xdr_u_long(xdrs, ulp) 179eae561b3SGarrett Wollman register XDR *xdrs; 180eae561b3SGarrett Wollman u_long *ulp; 181eae561b3SGarrett Wollman { 1821ad08a09SPeter Wemm switch (xdrs->x_op) { 1831ad08a09SPeter Wemm case XDR_ENCODE: 184eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, (long *)ulp)); 1851ad08a09SPeter Wemm case XDR_DECODE: 1861ad08a09SPeter Wemm return (XDR_GETLONG(xdrs, (long *)ulp)); 1871ad08a09SPeter Wemm case XDR_FREE: 188eae561b3SGarrett Wollman return (TRUE); 1891ad08a09SPeter Wemm } 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 1991ad08a09SPeter Wemm xdr_int32_t(xdrs, int32_p) 2001ad08a09SPeter Wemm register XDR *xdrs; 2011ad08a09SPeter Wemm int32_t *int32_p; 2021ad08a09SPeter Wemm { 2031ad08a09SPeter Wemm long l; 2041ad08a09SPeter Wemm 2051ad08a09SPeter Wemm switch (xdrs->x_op) { 2061ad08a09SPeter Wemm 2071ad08a09SPeter Wemm case XDR_ENCODE: 2081ad08a09SPeter Wemm l = (long) *int32_p; 2091ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, &l)); 2101ad08a09SPeter Wemm 2111ad08a09SPeter Wemm case XDR_DECODE: 2121ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, &l)) { 2131ad08a09SPeter Wemm return (FALSE); 2141ad08a09SPeter Wemm } 2151ad08a09SPeter Wemm *int32_p = (int32_t) l; 2161ad08a09SPeter Wemm return (TRUE); 2171ad08a09SPeter Wemm 2181ad08a09SPeter Wemm case XDR_FREE: 2191ad08a09SPeter Wemm return (TRUE); 2201ad08a09SPeter Wemm } 2211ad08a09SPeter Wemm return (FALSE); 2221ad08a09SPeter Wemm } 2231ad08a09SPeter Wemm 2241ad08a09SPeter Wemm /* 2251ad08a09SPeter Wemm * XDR unsigned 32-bit integers 2261ad08a09SPeter Wemm * same as xdr_int32_t - open coded to save a proc call! 2271ad08a09SPeter Wemm */ 2281ad08a09SPeter Wemm bool_t 2291ad08a09SPeter Wemm xdr_u_int32_t(xdrs, u_int32_p) 2301ad08a09SPeter Wemm register XDR *xdrs; 2311ad08a09SPeter Wemm u_int32_t *u_int32_p; 2321ad08a09SPeter Wemm { 2331ad08a09SPeter Wemm u_long l; 2341ad08a09SPeter Wemm 2351ad08a09SPeter Wemm switch (xdrs->x_op) { 2361ad08a09SPeter Wemm 2371ad08a09SPeter Wemm case XDR_ENCODE: 2381ad08a09SPeter Wemm l = (u_long) *u_int32_p; 2391ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 2401ad08a09SPeter Wemm 2411ad08a09SPeter Wemm case XDR_DECODE: 2421ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 2431ad08a09SPeter Wemm return (FALSE); 2441ad08a09SPeter Wemm } 2451ad08a09SPeter Wemm *u_int32_p = (u_int32_t) l; 2461ad08a09SPeter Wemm return (TRUE); 2471ad08a09SPeter Wemm 2481ad08a09SPeter Wemm case XDR_FREE: 2491ad08a09SPeter Wemm return (TRUE); 2501ad08a09SPeter Wemm } 2511ad08a09SPeter Wemm return (FALSE); 2521ad08a09SPeter Wemm } 2531ad08a09SPeter Wemm 254c304ad8aSDavid E. O'Brien /* 255c304ad8aSDavid E. O'Brien * XDR 64-bit integers 256c304ad8aSDavid E. O'Brien */ 257c304ad8aSDavid E. O'Brien bool_t 258c304ad8aSDavid E. O'Brien xdr_int64_t(xdrs, int64_p) 259c304ad8aSDavid E. O'Brien register XDR *xdrs; 260c304ad8aSDavid E. O'Brien int64_t *int64_p; 261c304ad8aSDavid E. O'Brien { 262c304ad8aSDavid E. O'Brien int64_t x; 263c304ad8aSDavid E. O'Brien 264c304ad8aSDavid E. O'Brien switch (xdrs->x_op) { 265c304ad8aSDavid E. O'Brien 266c304ad8aSDavid E. O'Brien case XDR_ENCODE: 267c304ad8aSDavid E. O'Brien return (xdr_opaque(xdrs, (caddr_t)int64_p, sizeof(int64_t))); 268c304ad8aSDavid E. O'Brien 269c304ad8aSDavid E. O'Brien case XDR_DECODE: 270c304ad8aSDavid E. O'Brien if (!xdr_opaque(xdrs, (caddr_t)&x, sizeof x)) { 271c304ad8aSDavid E. O'Brien return (FALSE); 272c304ad8aSDavid E. O'Brien } 273c304ad8aSDavid E. O'Brien *int64_p = x; 274c304ad8aSDavid E. O'Brien return (TRUE); 275c304ad8aSDavid E. O'Brien 276c304ad8aSDavid E. O'Brien case XDR_FREE: 277c304ad8aSDavid E. O'Brien return (TRUE); 278c304ad8aSDavid E. O'Brien } 279c304ad8aSDavid E. O'Brien return (FALSE); 280c304ad8aSDavid E. O'Brien } 281c304ad8aSDavid E. O'Brien 282c304ad8aSDavid E. O'Brien /* 283c304ad8aSDavid E. O'Brien * XDR unsigned 64-bit integers 284c304ad8aSDavid E. O'Brien */ 285c304ad8aSDavid E. O'Brien bool_t 286c304ad8aSDavid E. O'Brien xdr_u_int64_t(xdrs, uint64_p) 287c304ad8aSDavid E. O'Brien register XDR *xdrs; 288c304ad8aSDavid E. O'Brien u_int64_t *uint64_p; 289c304ad8aSDavid E. O'Brien { 290c304ad8aSDavid E. O'Brien u_int64_t x; 291c304ad8aSDavid E. O'Brien 292c304ad8aSDavid E. O'Brien switch (xdrs->x_op) { 293c304ad8aSDavid E. O'Brien 294c304ad8aSDavid E. O'Brien case XDR_ENCODE: 295c304ad8aSDavid E. O'Brien return (xdr_opaque(xdrs, (caddr_t)uint64_p, sizeof(u_int64_t))); 296c304ad8aSDavid E. O'Brien 297c304ad8aSDavid E. O'Brien case XDR_DECODE: 298c304ad8aSDavid E. O'Brien if (!xdr_opaque(xdrs, (caddr_t)&x, sizeof x)) { 299c304ad8aSDavid E. O'Brien return (FALSE); 300c304ad8aSDavid E. O'Brien } 301c304ad8aSDavid E. O'Brien *uint64_p = x; 302c304ad8aSDavid E. O'Brien return (TRUE); 303c304ad8aSDavid E. O'Brien 304c304ad8aSDavid E. O'Brien case XDR_FREE: 305c304ad8aSDavid E. O'Brien return (TRUE); 306c304ad8aSDavid E. O'Brien } 307c304ad8aSDavid E. O'Brien return (FALSE); 308c304ad8aSDavid E. O'Brien } 309c304ad8aSDavid E. O'Brien 3101ad08a09SPeter Wemm 311eae561b3SGarrett Wollman /* 312eae561b3SGarrett Wollman * XDR short integers 313eae561b3SGarrett Wollman */ 314eae561b3SGarrett Wollman bool_t 315eae561b3SGarrett Wollman xdr_short(xdrs, sp) 316eae561b3SGarrett Wollman register XDR *xdrs; 317eae561b3SGarrett Wollman short *sp; 318eae561b3SGarrett Wollman { 319eae561b3SGarrett Wollman long l; 320eae561b3SGarrett Wollman 321eae561b3SGarrett Wollman switch (xdrs->x_op) { 322eae561b3SGarrett Wollman 323eae561b3SGarrett Wollman case XDR_ENCODE: 324eae561b3SGarrett Wollman l = (long) *sp; 325eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, &l)); 326eae561b3SGarrett Wollman 327eae561b3SGarrett Wollman case XDR_DECODE: 328eae561b3SGarrett Wollman if (!XDR_GETLONG(xdrs, &l)) { 329eae561b3SGarrett Wollman return (FALSE); 330eae561b3SGarrett Wollman } 331eae561b3SGarrett Wollman *sp = (short) l; 332eae561b3SGarrett Wollman return (TRUE); 333eae561b3SGarrett Wollman 334eae561b3SGarrett Wollman case XDR_FREE: 335eae561b3SGarrett Wollman return (TRUE); 336eae561b3SGarrett Wollman } 337eae561b3SGarrett Wollman return (FALSE); 338eae561b3SGarrett Wollman } 339eae561b3SGarrett Wollman 340eae561b3SGarrett Wollman /* 341eae561b3SGarrett Wollman * XDR unsigned short integers 342eae561b3SGarrett Wollman */ 343eae561b3SGarrett Wollman bool_t 344eae561b3SGarrett Wollman xdr_u_short(xdrs, usp) 345eae561b3SGarrett Wollman register XDR *xdrs; 346eae561b3SGarrett Wollman u_short *usp; 347eae561b3SGarrett Wollman { 348eae561b3SGarrett Wollman u_long l; 349eae561b3SGarrett Wollman 350eae561b3SGarrett Wollman switch (xdrs->x_op) { 351eae561b3SGarrett Wollman 352eae561b3SGarrett Wollman case XDR_ENCODE: 353eae561b3SGarrett Wollman l = (u_long) *usp; 3541ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 3551ad08a09SPeter Wemm 3561ad08a09SPeter Wemm case XDR_DECODE: 3571ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 3581ad08a09SPeter Wemm return (FALSE); 3591ad08a09SPeter Wemm } 3601ad08a09SPeter Wemm *usp = (u_short) l; 3611ad08a09SPeter Wemm return (TRUE); 3621ad08a09SPeter Wemm 3631ad08a09SPeter Wemm case XDR_FREE: 3641ad08a09SPeter Wemm return (TRUE); 3651ad08a09SPeter Wemm } 3661ad08a09SPeter Wemm return (FALSE); 3671ad08a09SPeter Wemm } 3681ad08a09SPeter Wemm 3691ad08a09SPeter Wemm 3701ad08a09SPeter Wemm /* 3711ad08a09SPeter Wemm * XDR 16-bit integers 3721ad08a09SPeter Wemm */ 3731ad08a09SPeter Wemm bool_t 3741ad08a09SPeter Wemm xdr_int16_t(xdrs, int16_p) 3751ad08a09SPeter Wemm register XDR *xdrs; 3761ad08a09SPeter Wemm int16_t *int16_p; 3771ad08a09SPeter Wemm { 3781ad08a09SPeter Wemm long l; 3791ad08a09SPeter Wemm 3801ad08a09SPeter Wemm switch (xdrs->x_op) { 3811ad08a09SPeter Wemm 3821ad08a09SPeter Wemm case XDR_ENCODE: 3831ad08a09SPeter Wemm l = (long) *int16_p; 384eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, &l)); 385eae561b3SGarrett Wollman 386eae561b3SGarrett Wollman case XDR_DECODE: 387eae561b3SGarrett Wollman if (!XDR_GETLONG(xdrs, &l)) { 388eae561b3SGarrett Wollman return (FALSE); 389eae561b3SGarrett Wollman } 3901ad08a09SPeter Wemm *int16_p = (int16_t) l; 3911ad08a09SPeter Wemm return (TRUE); 3921ad08a09SPeter Wemm 3931ad08a09SPeter Wemm case XDR_FREE: 3941ad08a09SPeter Wemm return (TRUE); 3951ad08a09SPeter Wemm } 3961ad08a09SPeter Wemm return (FALSE); 3971ad08a09SPeter Wemm } 3981ad08a09SPeter Wemm 3991ad08a09SPeter Wemm /* 4001ad08a09SPeter Wemm * XDR unsigned 16-bit integers 4011ad08a09SPeter Wemm */ 4021ad08a09SPeter Wemm bool_t 4031ad08a09SPeter Wemm xdr_u_int16_t(xdrs, u_int16_p) 4041ad08a09SPeter Wemm register XDR *xdrs; 4051ad08a09SPeter Wemm u_int16_t *u_int16_p; 4061ad08a09SPeter Wemm { 4071ad08a09SPeter Wemm u_long l; 4081ad08a09SPeter Wemm 4091ad08a09SPeter Wemm switch (xdrs->x_op) { 4101ad08a09SPeter Wemm 4111ad08a09SPeter Wemm case XDR_ENCODE: 4121ad08a09SPeter Wemm l = (u_long) *u_int16_p; 4131ad08a09SPeter Wemm return (XDR_PUTLONG(xdrs, (long *)&l)); 4141ad08a09SPeter Wemm 4151ad08a09SPeter Wemm case XDR_DECODE: 4161ad08a09SPeter Wemm if (!XDR_GETLONG(xdrs, (long *)&l)) { 4171ad08a09SPeter Wemm return (FALSE); 4181ad08a09SPeter Wemm } 4191ad08a09SPeter Wemm *u_int16_p = (u_int16_t) l; 420eae561b3SGarrett Wollman return (TRUE); 421eae561b3SGarrett Wollman 422eae561b3SGarrett Wollman case XDR_FREE: 423eae561b3SGarrett Wollman return (TRUE); 424eae561b3SGarrett Wollman } 425eae561b3SGarrett Wollman return (FALSE); 426eae561b3SGarrett Wollman } 427eae561b3SGarrett Wollman 428eae561b3SGarrett Wollman 429eae561b3SGarrett Wollman /* 430eae561b3SGarrett Wollman * XDR a char 431eae561b3SGarrett Wollman */ 432eae561b3SGarrett Wollman bool_t 433eae561b3SGarrett Wollman xdr_char(xdrs, cp) 434eae561b3SGarrett Wollman XDR *xdrs; 435eae561b3SGarrett Wollman char *cp; 436eae561b3SGarrett Wollman { 437eae561b3SGarrett Wollman int i; 438eae561b3SGarrett Wollman 439eae561b3SGarrett Wollman i = (*cp); 440eae561b3SGarrett Wollman if (!xdr_int(xdrs, &i)) { 441eae561b3SGarrett Wollman return (FALSE); 442eae561b3SGarrett Wollman } 443eae561b3SGarrett Wollman *cp = i; 444eae561b3SGarrett Wollman return (TRUE); 445eae561b3SGarrett Wollman } 446eae561b3SGarrett Wollman 447eae561b3SGarrett Wollman /* 448eae561b3SGarrett Wollman * XDR an unsigned char 449eae561b3SGarrett Wollman */ 450eae561b3SGarrett Wollman bool_t 451eae561b3SGarrett Wollman xdr_u_char(xdrs, cp) 452eae561b3SGarrett Wollman XDR *xdrs; 4531ad08a09SPeter Wemm u_char *cp; 454eae561b3SGarrett Wollman { 455eae561b3SGarrett Wollman u_int u; 456eae561b3SGarrett Wollman 457eae561b3SGarrett Wollman u = (*cp); 458eae561b3SGarrett Wollman if (!xdr_u_int(xdrs, &u)) { 459eae561b3SGarrett Wollman return (FALSE); 460eae561b3SGarrett Wollman } 461eae561b3SGarrett Wollman *cp = u; 462eae561b3SGarrett Wollman return (TRUE); 463eae561b3SGarrett Wollman } 464eae561b3SGarrett Wollman 465eae561b3SGarrett Wollman /* 466eae561b3SGarrett Wollman * XDR booleans 467eae561b3SGarrett Wollman */ 468eae561b3SGarrett Wollman bool_t 469eae561b3SGarrett Wollman xdr_bool(xdrs, bp) 470eae561b3SGarrett Wollman register XDR *xdrs; 471eae561b3SGarrett Wollman bool_t *bp; 472eae561b3SGarrett Wollman { 473eae561b3SGarrett Wollman long lb; 474eae561b3SGarrett Wollman 475eae561b3SGarrett Wollman switch (xdrs->x_op) { 476eae561b3SGarrett Wollman 477eae561b3SGarrett Wollman case XDR_ENCODE: 478eae561b3SGarrett Wollman lb = *bp ? XDR_TRUE : XDR_FALSE; 479eae561b3SGarrett Wollman return (XDR_PUTLONG(xdrs, &lb)); 480eae561b3SGarrett Wollman 481eae561b3SGarrett Wollman case XDR_DECODE: 482eae561b3SGarrett Wollman if (!XDR_GETLONG(xdrs, &lb)) { 483eae561b3SGarrett Wollman return (FALSE); 484eae561b3SGarrett Wollman } 485eae561b3SGarrett Wollman *bp = (lb == XDR_FALSE) ? FALSE : TRUE; 486eae561b3SGarrett Wollman return (TRUE); 487eae561b3SGarrett Wollman 488eae561b3SGarrett Wollman case XDR_FREE: 489eae561b3SGarrett Wollman return (TRUE); 490eae561b3SGarrett Wollman } 491eae561b3SGarrett Wollman return (FALSE); 492eae561b3SGarrett Wollman } 493eae561b3SGarrett Wollman 494eae561b3SGarrett Wollman /* 495eae561b3SGarrett Wollman * XDR enumerations 496eae561b3SGarrett Wollman */ 497eae561b3SGarrett Wollman bool_t 498eae561b3SGarrett Wollman xdr_enum(xdrs, ep) 499eae561b3SGarrett Wollman XDR *xdrs; 500eae561b3SGarrett Wollman enum_t *ep; 501eae561b3SGarrett Wollman { 502eae561b3SGarrett Wollman #ifndef lint 503eae561b3SGarrett Wollman enum sizecheck { SIZEVAL }; /* used to find the size of an enum */ 504eae561b3SGarrett Wollman 505eae561b3SGarrett Wollman /* 506eae561b3SGarrett Wollman * enums are treated as ints 507eae561b3SGarrett Wollman */ 508eae561b3SGarrett Wollman if (sizeof (enum sizecheck) == sizeof (long)) { 509eae561b3SGarrett Wollman return (xdr_long(xdrs, (long *)ep)); 5101ad08a09SPeter Wemm } else if (sizeof (enum sizecheck) == sizeof (int)) { 5111ad08a09SPeter Wemm return (xdr_int(xdrs, (int *)ep)); 512eae561b3SGarrett Wollman } else if (sizeof (enum sizecheck) == sizeof (short)) { 513eae561b3SGarrett Wollman return (xdr_short(xdrs, (short *)ep)); 514eae561b3SGarrett Wollman } else { 515eae561b3SGarrett Wollman return (FALSE); 516eae561b3SGarrett Wollman } 517eae561b3SGarrett Wollman #else 518eae561b3SGarrett Wollman (void) (xdr_short(xdrs, (short *)ep)); 5191ad08a09SPeter Wemm (void) (xdr_int(xdrs, (int *)ep)); 520eae561b3SGarrett Wollman return (xdr_long(xdrs, (long *)ep)); 521eae561b3SGarrett Wollman #endif 522eae561b3SGarrett Wollman } 523eae561b3SGarrett Wollman 524eae561b3SGarrett Wollman /* 525eae561b3SGarrett Wollman * XDR opaque data 526eae561b3SGarrett Wollman * Allows the specification of a fixed size sequence of opaque bytes. 527eae561b3SGarrett Wollman * cp points to the opaque object and cnt gives the byte length. 528eae561b3SGarrett Wollman */ 529eae561b3SGarrett Wollman bool_t 530eae561b3SGarrett Wollman xdr_opaque(xdrs, cp, cnt) 531eae561b3SGarrett Wollman register XDR *xdrs; 532eae561b3SGarrett Wollman caddr_t cp; 533eae561b3SGarrett Wollman register u_int cnt; 534eae561b3SGarrett Wollman { 535eae561b3SGarrett Wollman register u_int rndup; 536eae561b3SGarrett Wollman static crud[BYTES_PER_XDR_UNIT]; 537eae561b3SGarrett Wollman 538eae561b3SGarrett Wollman /* 539eae561b3SGarrett Wollman * if no data we are done 540eae561b3SGarrett Wollman */ 541eae561b3SGarrett Wollman if (cnt == 0) 542eae561b3SGarrett Wollman return (TRUE); 543eae561b3SGarrett Wollman 544eae561b3SGarrett Wollman /* 545eae561b3SGarrett Wollman * round byte count to full xdr units 546eae561b3SGarrett Wollman */ 547eae561b3SGarrett Wollman rndup = cnt % BYTES_PER_XDR_UNIT; 548eae561b3SGarrett Wollman if (rndup > 0) 549eae561b3SGarrett Wollman rndup = BYTES_PER_XDR_UNIT - rndup; 550eae561b3SGarrett Wollman 551eae561b3SGarrett Wollman if (xdrs->x_op == XDR_DECODE) { 552eae561b3SGarrett Wollman if (!XDR_GETBYTES(xdrs, cp, cnt)) { 553eae561b3SGarrett Wollman return (FALSE); 554eae561b3SGarrett Wollman } 555eae561b3SGarrett Wollman if (rndup == 0) 556eae561b3SGarrett Wollman return (TRUE); 5571ad08a09SPeter Wemm return (XDR_GETBYTES(xdrs, (caddr_t)crud, rndup)); 558eae561b3SGarrett Wollman } 559eae561b3SGarrett Wollman 560eae561b3SGarrett Wollman if (xdrs->x_op == XDR_ENCODE) { 561eae561b3SGarrett Wollman if (!XDR_PUTBYTES(xdrs, cp, cnt)) { 562eae561b3SGarrett Wollman return (FALSE); 563eae561b3SGarrett Wollman } 564eae561b3SGarrett Wollman if (rndup == 0) 565eae561b3SGarrett Wollman return (TRUE); 566eae561b3SGarrett Wollman return (XDR_PUTBYTES(xdrs, xdr_zero, rndup)); 567eae561b3SGarrett Wollman } 568eae561b3SGarrett Wollman 569eae561b3SGarrett Wollman if (xdrs->x_op == XDR_FREE) { 570eae561b3SGarrett Wollman return (TRUE); 571eae561b3SGarrett Wollman } 572eae561b3SGarrett Wollman 573eae561b3SGarrett Wollman return (FALSE); 574eae561b3SGarrett Wollman } 575eae561b3SGarrett Wollman 576eae561b3SGarrett Wollman /* 577eae561b3SGarrett Wollman * XDR counted bytes 578eae561b3SGarrett Wollman * *cpp is a pointer to the bytes, *sizep is the count. 579eae561b3SGarrett Wollman * If *cpp is NULL maxsize bytes are allocated 580eae561b3SGarrett Wollman */ 581eae561b3SGarrett Wollman bool_t 582eae561b3SGarrett Wollman xdr_bytes(xdrs, cpp, sizep, maxsize) 583eae561b3SGarrett Wollman register XDR *xdrs; 584eae561b3SGarrett Wollman char **cpp; 585eae561b3SGarrett Wollman register u_int *sizep; 586eae561b3SGarrett Wollman u_int maxsize; 587eae561b3SGarrett Wollman { 588eae561b3SGarrett Wollman register char *sp = *cpp; /* sp is the actual string pointer */ 589eae561b3SGarrett Wollman register u_int nodesize; 590eae561b3SGarrett Wollman 591eae561b3SGarrett Wollman /* 592eae561b3SGarrett Wollman * first deal with the length since xdr bytes are counted 593eae561b3SGarrett Wollman */ 594eae561b3SGarrett Wollman if (! xdr_u_int(xdrs, sizep)) { 595eae561b3SGarrett Wollman return (FALSE); 596eae561b3SGarrett Wollman } 597eae561b3SGarrett Wollman nodesize = *sizep; 598eae561b3SGarrett Wollman if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) { 599eae561b3SGarrett Wollman return (FALSE); 600eae561b3SGarrett Wollman } 601eae561b3SGarrett Wollman 602eae561b3SGarrett Wollman /* 603eae561b3SGarrett Wollman * now deal with the actual bytes 604eae561b3SGarrett Wollman */ 605eae561b3SGarrett Wollman switch (xdrs->x_op) { 606eae561b3SGarrett Wollman 607eae561b3SGarrett Wollman case XDR_DECODE: 608eae561b3SGarrett Wollman if (nodesize == 0) { 609eae561b3SGarrett Wollman return (TRUE); 610eae561b3SGarrett Wollman } 611eae561b3SGarrett Wollman if (sp == NULL) { 612eae561b3SGarrett Wollman *cpp = sp = (char *)mem_alloc(nodesize); 613eae561b3SGarrett Wollman } 614eae561b3SGarrett Wollman if (sp == NULL) { 615eae561b3SGarrett Wollman (void) fprintf(stderr, "xdr_bytes: out of memory\n"); 616eae561b3SGarrett Wollman return (FALSE); 617eae561b3SGarrett Wollman } 618eae561b3SGarrett Wollman /* fall into ... */ 619eae561b3SGarrett Wollman 620eae561b3SGarrett Wollman case XDR_ENCODE: 621eae561b3SGarrett Wollman return (xdr_opaque(xdrs, sp, nodesize)); 622eae561b3SGarrett Wollman 623eae561b3SGarrett Wollman case XDR_FREE: 624eae561b3SGarrett Wollman if (sp != NULL) { 625eae561b3SGarrett Wollman mem_free(sp, nodesize); 626eae561b3SGarrett Wollman *cpp = NULL; 627eae561b3SGarrett Wollman } 628eae561b3SGarrett Wollman return (TRUE); 629eae561b3SGarrett Wollman } 630eae561b3SGarrett Wollman return (FALSE); 631eae561b3SGarrett Wollman } 632eae561b3SGarrett Wollman 633eae561b3SGarrett Wollman /* 634eae561b3SGarrett Wollman * Implemented here due to commonality of the object. 635eae561b3SGarrett Wollman */ 636eae561b3SGarrett Wollman bool_t 637eae561b3SGarrett Wollman xdr_netobj(xdrs, np) 638eae561b3SGarrett Wollman XDR *xdrs; 639eae561b3SGarrett Wollman struct netobj *np; 640eae561b3SGarrett Wollman { 641eae561b3SGarrett Wollman 642eae561b3SGarrett Wollman return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ)); 643eae561b3SGarrett Wollman } 644eae561b3SGarrett Wollman 645eae561b3SGarrett Wollman /* 646eae561b3SGarrett Wollman * XDR a descriminated union 647eae561b3SGarrett Wollman * Support routine for discriminated unions. 648eae561b3SGarrett Wollman * You create an array of xdrdiscrim structures, terminated with 649eae561b3SGarrett Wollman * an entry with a null procedure pointer. The routine gets 650eae561b3SGarrett Wollman * the discriminant value and then searches the array of xdrdiscrims 651eae561b3SGarrett Wollman * looking for that value. It calls the procedure given in the xdrdiscrim 652eae561b3SGarrett Wollman * to handle the discriminant. If there is no specific routine a default 653eae561b3SGarrett Wollman * routine may be called. 654eae561b3SGarrett Wollman * If there is no specific or default routine an error is returned. 655eae561b3SGarrett Wollman */ 656eae561b3SGarrett Wollman bool_t 657eae561b3SGarrett Wollman xdr_union(xdrs, dscmp, unp, choices, dfault) 658eae561b3SGarrett Wollman register XDR *xdrs; 659eae561b3SGarrett Wollman enum_t *dscmp; /* enum to decide which arm to work on */ 660eae561b3SGarrett Wollman char *unp; /* the union itself */ 661eae561b3SGarrett Wollman struct xdr_discrim *choices; /* [value, xdr proc] for each arm */ 662eae561b3SGarrett Wollman xdrproc_t dfault; /* default xdr routine */ 663eae561b3SGarrett Wollman { 664eae561b3SGarrett Wollman register enum_t dscm; 665eae561b3SGarrett Wollman 666eae561b3SGarrett Wollman /* 667eae561b3SGarrett Wollman * we deal with the discriminator; it's an enum 668eae561b3SGarrett Wollman */ 669eae561b3SGarrett Wollman if (! xdr_enum(xdrs, dscmp)) { 670eae561b3SGarrett Wollman return (FALSE); 671eae561b3SGarrett Wollman } 672eae561b3SGarrett Wollman dscm = *dscmp; 673eae561b3SGarrett Wollman 674eae561b3SGarrett Wollman /* 675eae561b3SGarrett Wollman * search choices for a value that matches the discriminator. 676eae561b3SGarrett Wollman * if we find one, execute the xdr routine for that value. 677eae561b3SGarrett Wollman */ 678eae561b3SGarrett Wollman for (; choices->proc != NULL_xdrproc_t; choices++) { 679eae561b3SGarrett Wollman if (choices->value == dscm) 680eae561b3SGarrett Wollman return ((*(choices->proc))(xdrs, unp, LASTUNSIGNED)); 681eae561b3SGarrett Wollman } 682eae561b3SGarrett Wollman 683eae561b3SGarrett Wollman /* 684eae561b3SGarrett Wollman * no match - execute the default xdr routine if there is one 685eae561b3SGarrett Wollman */ 686eae561b3SGarrett Wollman return ((dfault == NULL_xdrproc_t) ? FALSE : 687eae561b3SGarrett Wollman (*dfault)(xdrs, unp, LASTUNSIGNED)); 688eae561b3SGarrett Wollman } 689eae561b3SGarrett Wollman 690eae561b3SGarrett Wollman 691eae561b3SGarrett Wollman /* 692eae561b3SGarrett Wollman * Non-portable xdr primitives. 693eae561b3SGarrett Wollman * Care should be taken when moving these routines to new architectures. 694eae561b3SGarrett Wollman */ 695eae561b3SGarrett Wollman 696eae561b3SGarrett Wollman 697eae561b3SGarrett Wollman /* 698eae561b3SGarrett Wollman * XDR null terminated ASCII strings 699eae561b3SGarrett Wollman * xdr_string deals with "C strings" - arrays of bytes that are 700eae561b3SGarrett Wollman * terminated by a NULL character. The parameter cpp references a 701eae561b3SGarrett Wollman * pointer to storage; If the pointer is null, then the necessary 702eae561b3SGarrett Wollman * storage is allocated. The last parameter is the max allowed length 703eae561b3SGarrett Wollman * of the string as specified by a protocol. 704eae561b3SGarrett Wollman */ 705eae561b3SGarrett Wollman bool_t 706eae561b3SGarrett Wollman xdr_string(xdrs, cpp, maxsize) 707eae561b3SGarrett Wollman register XDR *xdrs; 708eae561b3SGarrett Wollman char **cpp; 709eae561b3SGarrett Wollman u_int maxsize; 710eae561b3SGarrett Wollman { 711eae561b3SGarrett Wollman register char *sp = *cpp; /* sp is the actual string pointer */ 712eae561b3SGarrett Wollman u_int size; 713eae561b3SGarrett Wollman u_int nodesize; 714eae561b3SGarrett Wollman 715eae561b3SGarrett Wollman /* 716eae561b3SGarrett Wollman * first deal with the length since xdr strings are counted-strings 717eae561b3SGarrett Wollman */ 718eae561b3SGarrett Wollman switch (xdrs->x_op) { 719eae561b3SGarrett Wollman case XDR_FREE: 720eae561b3SGarrett Wollman if (sp == NULL) { 721eae561b3SGarrett Wollman return(TRUE); /* already free */ 722eae561b3SGarrett Wollman } 723eae561b3SGarrett Wollman /* fall through... */ 724eae561b3SGarrett Wollman case XDR_ENCODE: 725eae561b3SGarrett Wollman size = strlen(sp); 726eae561b3SGarrett Wollman break; 727eae561b3SGarrett Wollman } 728eae561b3SGarrett Wollman if (! xdr_u_int(xdrs, &size)) { 729eae561b3SGarrett Wollman return (FALSE); 730eae561b3SGarrett Wollman } 731eae561b3SGarrett Wollman if (size > maxsize) { 732eae561b3SGarrett Wollman return (FALSE); 733eae561b3SGarrett Wollman } 734eae561b3SGarrett Wollman nodesize = size + 1; 735eae561b3SGarrett Wollman 736eae561b3SGarrett Wollman /* 737eae561b3SGarrett Wollman * now deal with the actual bytes 738eae561b3SGarrett Wollman */ 739eae561b3SGarrett Wollman switch (xdrs->x_op) { 740eae561b3SGarrett Wollman 741eae561b3SGarrett Wollman case XDR_DECODE: 742eae561b3SGarrett Wollman if (nodesize == 0) { 743eae561b3SGarrett Wollman return (TRUE); 744eae561b3SGarrett Wollman } 745eae561b3SGarrett Wollman if (sp == NULL) 746eae561b3SGarrett Wollman *cpp = sp = (char *)mem_alloc(nodesize); 747eae561b3SGarrett Wollman if (sp == NULL) { 748eae561b3SGarrett Wollman (void) fprintf(stderr, "xdr_string: out of memory\n"); 749eae561b3SGarrett Wollman return (FALSE); 750eae561b3SGarrett Wollman } 751eae561b3SGarrett Wollman sp[size] = 0; 752eae561b3SGarrett Wollman /* fall into ... */ 753eae561b3SGarrett Wollman 754eae561b3SGarrett Wollman case XDR_ENCODE: 755eae561b3SGarrett Wollman return (xdr_opaque(xdrs, sp, size)); 756eae561b3SGarrett Wollman 757eae561b3SGarrett Wollman case XDR_FREE: 758eae561b3SGarrett Wollman mem_free(sp, nodesize); 759eae561b3SGarrett Wollman *cpp = NULL; 760eae561b3SGarrett Wollman return (TRUE); 761eae561b3SGarrett Wollman } 762eae561b3SGarrett Wollman return (FALSE); 763eae561b3SGarrett Wollman } 764eae561b3SGarrett Wollman 765eae561b3SGarrett Wollman /* 766eae561b3SGarrett Wollman * Wrapper for xdr_string that can be called directly from 767eae561b3SGarrett Wollman * routines like clnt_call 768eae561b3SGarrett Wollman */ 769eae561b3SGarrett Wollman bool_t 770eae561b3SGarrett Wollman xdr_wrapstring(xdrs, cpp) 771eae561b3SGarrett Wollman XDR *xdrs; 772eae561b3SGarrett Wollman char **cpp; 773eae561b3SGarrett Wollman { 7741ad08a09SPeter Wemm return xdr_string(xdrs, cpp, LASTUNSIGNED); 775eae561b3SGarrett Wollman } 776