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_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";*/ 32eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC";*/ 331ad08a09SPeter Wemm static char *rcsid = "$Id: xdr_mem.c,v 1.3 1995/10/22 14:53:55 phk Exp $"; 34eae561b3SGarrett Wollman #endif 35eae561b3SGarrett Wollman 36eae561b3SGarrett Wollman /* 37eae561b3SGarrett Wollman * xdr_mem.h, XDR implementation using memory buffers. 38eae561b3SGarrett Wollman * 39eae561b3SGarrett Wollman * Copyright (C) 1984, Sun Microsystems, Inc. 40eae561b3SGarrett Wollman * 41eae561b3SGarrett Wollman * If you have some data to be interpreted as external data representation 42eae561b3SGarrett Wollman * or to be converted to external data representation in a memory buffer, 43eae561b3SGarrett Wollman * then this is the package for you. 44eae561b3SGarrett Wollman * 45eae561b3SGarrett Wollman */ 46eae561b3SGarrett Wollman 4729285d6cSPoul-Henning Kamp #include <string.h> 48eae561b3SGarrett Wollman #include <rpc/types.h> 49eae561b3SGarrett Wollman #include <rpc/xdr.h> 50eae561b3SGarrett Wollman #include <netinet/in.h> 51eae561b3SGarrett Wollman 521ad08a09SPeter Wemm static bool_t xdrmem_getlong_aligned(); 531ad08a09SPeter Wemm static bool_t xdrmem_putlong_aligned(); 541ad08a09SPeter Wemm static bool_t xdrmem_getlong_unaligned(); 551ad08a09SPeter Wemm static bool_t xdrmem_putlong_unaligned(); 56eae561b3SGarrett Wollman static bool_t xdrmem_getbytes(); 57eae561b3SGarrett Wollman static bool_t xdrmem_putbytes(); 581ad08a09SPeter Wemm static u_int xdrmem_getpos(); /* XXX w/64-bit pointers, u_int not enough! */ 59eae561b3SGarrett Wollman static bool_t xdrmem_setpos(); 601ad08a09SPeter Wemm static int32_t *xdrmem_inline_aligned(); 611ad08a09SPeter Wemm static int32_t *xdrmem_inline_unaligned(); 62eae561b3SGarrett Wollman static void xdrmem_destroy(); 63eae561b3SGarrett Wollman 641ad08a09SPeter Wemm static struct xdr_ops xdrmem_ops_aligned = { 651ad08a09SPeter Wemm xdrmem_getlong_aligned, 661ad08a09SPeter Wemm xdrmem_putlong_aligned, 67eae561b3SGarrett Wollman xdrmem_getbytes, 68eae561b3SGarrett Wollman xdrmem_putbytes, 69eae561b3SGarrett Wollman xdrmem_getpos, 70eae561b3SGarrett Wollman xdrmem_setpos, 711ad08a09SPeter Wemm xdrmem_inline_aligned, 721ad08a09SPeter Wemm xdrmem_destroy 731ad08a09SPeter Wemm }; 741ad08a09SPeter Wemm 751ad08a09SPeter Wemm static struct xdr_ops xdrmem_ops_unaligned = { 761ad08a09SPeter Wemm xdrmem_getlong_unaligned, 771ad08a09SPeter Wemm xdrmem_putlong_unaligned, 781ad08a09SPeter Wemm xdrmem_getbytes, 791ad08a09SPeter Wemm xdrmem_putbytes, 801ad08a09SPeter Wemm xdrmem_getpos, 811ad08a09SPeter Wemm xdrmem_setpos, 821ad08a09SPeter Wemm xdrmem_inline_unaligned, 83eae561b3SGarrett Wollman xdrmem_destroy 84eae561b3SGarrett Wollman }; 85eae561b3SGarrett Wollman 86eae561b3SGarrett Wollman /* 87eae561b3SGarrett Wollman * The procedure xdrmem_create initializes a stream descriptor for a 88eae561b3SGarrett Wollman * memory buffer. 89eae561b3SGarrett Wollman */ 90eae561b3SGarrett Wollman void 91eae561b3SGarrett Wollman xdrmem_create(xdrs, addr, size, op) 92eae561b3SGarrett Wollman register XDR *xdrs; 93eae561b3SGarrett Wollman caddr_t addr; 94eae561b3SGarrett Wollman u_int size; 95eae561b3SGarrett Wollman enum xdr_op op; 96eae561b3SGarrett Wollman { 97eae561b3SGarrett Wollman 98eae561b3SGarrett Wollman xdrs->x_op = op; 991ad08a09SPeter Wemm xdrs->x_ops = ((size_t)addr & (sizeof(int32_t) - 1)) 1001ad08a09SPeter Wemm ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; 101eae561b3SGarrett Wollman xdrs->x_private = xdrs->x_base = addr; 102eae561b3SGarrett Wollman xdrs->x_handy = size; 103eae561b3SGarrett Wollman } 104eae561b3SGarrett Wollman 105eae561b3SGarrett Wollman static void 106eae561b3SGarrett Wollman xdrmem_destroy(/*xdrs*/) 107eae561b3SGarrett Wollman /*XDR *xdrs;*/ 108eae561b3SGarrett Wollman { 1091ad08a09SPeter Wemm 110eae561b3SGarrett Wollman } 111eae561b3SGarrett Wollman 112eae561b3SGarrett Wollman static bool_t 1131ad08a09SPeter Wemm xdrmem_getlong_aligned(xdrs, lp) 114eae561b3SGarrett Wollman register XDR *xdrs; 115eae561b3SGarrett Wollman long *lp; 116eae561b3SGarrett Wollman { 117eae561b3SGarrett Wollman 1181ad08a09SPeter Wemm if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 119eae561b3SGarrett Wollman return (FALSE); 1201ad08a09SPeter Wemm *lp = ntohl(*(int32_t *)(xdrs->x_private)); 1211ad08a09SPeter Wemm xdrs->x_private += sizeof(int32_t); 122eae561b3SGarrett Wollman return (TRUE); 123eae561b3SGarrett Wollman } 124eae561b3SGarrett Wollman 125eae561b3SGarrett Wollman static bool_t 1261ad08a09SPeter Wemm xdrmem_putlong_aligned(xdrs, lp) 127eae561b3SGarrett Wollman register XDR *xdrs; 128eae561b3SGarrett Wollman long *lp; 129eae561b3SGarrett Wollman { 130eae561b3SGarrett Wollman 1311ad08a09SPeter Wemm if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 132eae561b3SGarrett Wollman return (FALSE); 1331ad08a09SPeter Wemm *(int32_t *)xdrs->x_private = htonl(*lp); 1341ad08a09SPeter Wemm xdrs->x_private += sizeof(int32_t); 1351ad08a09SPeter Wemm return (TRUE); 1361ad08a09SPeter Wemm } 1371ad08a09SPeter Wemm 1381ad08a09SPeter Wemm static bool_t 1391ad08a09SPeter Wemm xdrmem_getlong_unaligned(xdrs, lp) 1401ad08a09SPeter Wemm register XDR *xdrs; 1411ad08a09SPeter Wemm long *lp; 1421ad08a09SPeter Wemm { 1431ad08a09SPeter Wemm int32_t l; 1441ad08a09SPeter Wemm 1451ad08a09SPeter Wemm if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 1461ad08a09SPeter Wemm return (FALSE); 1471ad08a09SPeter Wemm memcpy(&l, xdrs->x_private, sizeof(int32_t)); 1481ad08a09SPeter Wemm *lp = ntohl(l); 1491ad08a09SPeter Wemm xdrs->x_private += sizeof(int32_t); 1501ad08a09SPeter Wemm return (TRUE); 1511ad08a09SPeter Wemm } 1521ad08a09SPeter Wemm 1531ad08a09SPeter Wemm static bool_t 1541ad08a09SPeter Wemm xdrmem_putlong_unaligned(xdrs, lp) 1551ad08a09SPeter Wemm register XDR *xdrs; 1561ad08a09SPeter Wemm long *lp; 1571ad08a09SPeter Wemm { 1581ad08a09SPeter Wemm int32_t l; 1591ad08a09SPeter Wemm 1601ad08a09SPeter Wemm if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 1611ad08a09SPeter Wemm return (FALSE); 1621ad08a09SPeter Wemm l = htonl(*lp); 1631ad08a09SPeter Wemm memcpy(xdrs->x_private, &l, sizeof(int32_t)); 1641ad08a09SPeter Wemm xdrs->x_private += sizeof(int32_t); 165eae561b3SGarrett Wollman return (TRUE); 166eae561b3SGarrett Wollman } 167eae561b3SGarrett Wollman 168eae561b3SGarrett Wollman static bool_t 169eae561b3SGarrett Wollman xdrmem_getbytes(xdrs, addr, len) 170eae561b3SGarrett Wollman register XDR *xdrs; 171eae561b3SGarrett Wollman caddr_t addr; 172eae561b3SGarrett Wollman register u_int len; 173eae561b3SGarrett Wollman { 174eae561b3SGarrett Wollman 175eae561b3SGarrett Wollman if ((xdrs->x_handy -= len) < 0) 176eae561b3SGarrett Wollman return (FALSE); 1771ad08a09SPeter Wemm memcpy(addr, xdrs->x_private, len); 178eae561b3SGarrett Wollman xdrs->x_private += len; 179eae561b3SGarrett Wollman return (TRUE); 180eae561b3SGarrett Wollman } 181eae561b3SGarrett Wollman 182eae561b3SGarrett Wollman static bool_t 183eae561b3SGarrett Wollman xdrmem_putbytes(xdrs, addr, len) 184eae561b3SGarrett Wollman register XDR *xdrs; 185eae561b3SGarrett Wollman caddr_t addr; 186eae561b3SGarrett Wollman register u_int len; 187eae561b3SGarrett Wollman { 188eae561b3SGarrett Wollman 189eae561b3SGarrett Wollman if ((xdrs->x_handy -= len) < 0) 190eae561b3SGarrett Wollman return (FALSE); 1911ad08a09SPeter Wemm memcpy(xdrs->x_private, addr, len); 192eae561b3SGarrett Wollman xdrs->x_private += len; 193eae561b3SGarrett Wollman return (TRUE); 194eae561b3SGarrett Wollman } 195eae561b3SGarrett Wollman 196eae561b3SGarrett Wollman static u_int 197eae561b3SGarrett Wollman xdrmem_getpos(xdrs) 198eae561b3SGarrett Wollman register XDR *xdrs; 199eae561b3SGarrett Wollman { 200eae561b3SGarrett Wollman 2011ad08a09SPeter Wemm /* XXX w/64-bit pointers, u_int not enough! */ 2021ad08a09SPeter Wemm return ((u_long)xdrs->x_private - (u_long)xdrs->x_base); 203eae561b3SGarrett Wollman } 204eae561b3SGarrett Wollman 205eae561b3SGarrett Wollman static bool_t 206eae561b3SGarrett Wollman xdrmem_setpos(xdrs, pos) 207eae561b3SGarrett Wollman register XDR *xdrs; 208eae561b3SGarrett Wollman u_int pos; 209eae561b3SGarrett Wollman { 210eae561b3SGarrett Wollman register caddr_t newaddr = xdrs->x_base + pos; 211eae561b3SGarrett Wollman register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; 212eae561b3SGarrett Wollman 213eae561b3SGarrett Wollman if ((long)newaddr > (long)lastaddr) 214eae561b3SGarrett Wollman return (FALSE); 215eae561b3SGarrett Wollman xdrs->x_private = newaddr; 2161ad08a09SPeter Wemm xdrs->x_handy = (long)lastaddr - (long)newaddr; 217eae561b3SGarrett Wollman return (TRUE); 218eae561b3SGarrett Wollman } 219eae561b3SGarrett Wollman 2201ad08a09SPeter Wemm static int32_t * 2211ad08a09SPeter Wemm xdrmem_inline_aligned(xdrs, len) 222eae561b3SGarrett Wollman register XDR *xdrs; 223eae561b3SGarrett Wollman int len; 224eae561b3SGarrett Wollman { 2251ad08a09SPeter Wemm int32_t *buf = 0; 226eae561b3SGarrett Wollman 227eae561b3SGarrett Wollman if (xdrs->x_handy >= len) { 228eae561b3SGarrett Wollman xdrs->x_handy -= len; 2291ad08a09SPeter Wemm buf = (int32_t *) xdrs->x_private; 230eae561b3SGarrett Wollman xdrs->x_private += len; 231eae561b3SGarrett Wollman } 232eae561b3SGarrett Wollman return (buf); 233eae561b3SGarrett Wollman } 2341ad08a09SPeter Wemm 2351ad08a09SPeter Wemm static int32_t * 2361ad08a09SPeter Wemm xdrmem_inline_unaligned(xdrs, len) 2371ad08a09SPeter Wemm register XDR *xdrs; 2381ad08a09SPeter Wemm int len; 2391ad08a09SPeter Wemm { 2401ad08a09SPeter Wemm 2411ad08a09SPeter Wemm return (0); 2421ad08a09SPeter Wemm } 243