18360efbdSAlfred Perlstein /* $NetBSD: xdr_mem.c,v 1.15 2000/01/22 22:19:18 mycroft Exp $ */ 28360efbdSAlfred Perlstein 3a204967aSHiroki Sato /*- 4a204967aSHiroki Sato * Copyright (c) 2010, Oracle America, Inc. 5eae561b3SGarrett Wollman * 6a204967aSHiroki Sato * Redistribution and use in source and binary forms, with or without 7a204967aSHiroki Sato * modification, are permitted provided that the following conditions are 8a204967aSHiroki Sato * met: 9eae561b3SGarrett Wollman * 10a204967aSHiroki Sato * * Redistributions of source code must retain the above copyright 11a204967aSHiroki Sato * notice, this list of conditions and the following disclaimer. 12a204967aSHiroki Sato * * Redistributions in binary form must reproduce the above 13a204967aSHiroki Sato * copyright notice, this list of conditions and the following 14a204967aSHiroki Sato * disclaimer in the documentation and/or other materials 15a204967aSHiroki Sato * provided with the distribution. 16a204967aSHiroki Sato * * Neither the name of the "Oracle America, Inc." nor the names of its 17a204967aSHiroki Sato * contributors may be used to endorse or promote products derived 18a204967aSHiroki Sato * from this software without specific prior written permission. 19eae561b3SGarrett Wollman * 20a204967aSHiroki Sato * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21a204967aSHiroki Sato * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22a204967aSHiroki Sato * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23a204967aSHiroki Sato * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24a204967aSHiroki Sato * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 25a204967aSHiroki Sato * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26a204967aSHiroki Sato * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 27a204967aSHiroki Sato * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28a204967aSHiroki Sato * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29a204967aSHiroki Sato * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30a204967aSHiroki Sato * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31a204967aSHiroki Sato * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32eae561b3SGarrett Wollman */ 33eae561b3SGarrett Wollman 34eae561b3SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint) 35a9bdcd37SDavid E. O'Brien static char *sccsid2 = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro"; 36333fc21eSDavid E. O'Brien static char *sccsid = "@(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC"; 37eae561b3SGarrett Wollman #endif 38333fc21eSDavid E. O'Brien #include <sys/cdefs.h> 39333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$"); 40eae561b3SGarrett Wollman 41eae561b3SGarrett Wollman /* 42eae561b3SGarrett Wollman * xdr_mem.h, XDR implementation using memory buffers. 43eae561b3SGarrett Wollman * 44eae561b3SGarrett Wollman * If you have some data to be interpreted as external data representation 45eae561b3SGarrett Wollman * or to be converted to external data representation in a memory buffer, 46eae561b3SGarrett Wollman * then this is the package for you. 47eae561b3SGarrett Wollman * 48eae561b3SGarrett Wollman */ 49eae561b3SGarrett Wollman 508360efbdSAlfred Perlstein #include "namespace.h" 518360efbdSAlfred Perlstein #include <sys/types.h> 528360efbdSAlfred Perlstein 53eae561b3SGarrett Wollman #include <netinet/in.h> 54eae561b3SGarrett Wollman 558360efbdSAlfred Perlstein #include <string.h> 56eae561b3SGarrett Wollman 578360efbdSAlfred Perlstein #include <rpc/types.h> 588360efbdSAlfred Perlstein #include <rpc/xdr.h> 598360efbdSAlfred Perlstein #include "un-namespace.h" 608360efbdSAlfred Perlstein 61c05ac53bSDavid E. O'Brien static void xdrmem_destroy(XDR *); 62c05ac53bSDavid E. O'Brien static bool_t xdrmem_getlong_aligned(XDR *, long *); 63c05ac53bSDavid E. O'Brien static bool_t xdrmem_putlong_aligned(XDR *, const long *); 64c05ac53bSDavid E. O'Brien static bool_t xdrmem_getlong_unaligned(XDR *, long *); 65c05ac53bSDavid E. O'Brien static bool_t xdrmem_putlong_unaligned(XDR *, const long *); 66c05ac53bSDavid E. O'Brien static bool_t xdrmem_getbytes(XDR *, char *, u_int); 67c05ac53bSDavid E. O'Brien static bool_t xdrmem_putbytes(XDR *, const char *, u_int); 688360efbdSAlfred Perlstein /* XXX: w/64-bit pointers, u_int not enough! */ 69c05ac53bSDavid E. O'Brien static u_int xdrmem_getpos(XDR *); 70c05ac53bSDavid E. O'Brien static bool_t xdrmem_setpos(XDR *, u_int); 71c05ac53bSDavid E. O'Brien static int32_t *xdrmem_inline_aligned(XDR *, u_int); 72c05ac53bSDavid E. O'Brien static int32_t *xdrmem_inline_unaligned(XDR *, u_int); 738360efbdSAlfred Perlstein 748360efbdSAlfred Perlstein static const struct xdr_ops xdrmem_ops_aligned = { 751ad08a09SPeter Wemm xdrmem_getlong_aligned, 761ad08a09SPeter Wemm xdrmem_putlong_aligned, 77eae561b3SGarrett Wollman xdrmem_getbytes, 78eae561b3SGarrett Wollman xdrmem_putbytes, 79eae561b3SGarrett Wollman xdrmem_getpos, 80eae561b3SGarrett Wollman xdrmem_setpos, 811ad08a09SPeter Wemm xdrmem_inline_aligned, 821ad08a09SPeter Wemm xdrmem_destroy 831ad08a09SPeter Wemm }; 841ad08a09SPeter Wemm 858360efbdSAlfred Perlstein static const struct xdr_ops xdrmem_ops_unaligned = { 861ad08a09SPeter Wemm xdrmem_getlong_unaligned, 871ad08a09SPeter Wemm xdrmem_putlong_unaligned, 881ad08a09SPeter Wemm xdrmem_getbytes, 891ad08a09SPeter Wemm xdrmem_putbytes, 901ad08a09SPeter Wemm xdrmem_getpos, 911ad08a09SPeter Wemm xdrmem_setpos, 921ad08a09SPeter Wemm xdrmem_inline_unaligned, 93eae561b3SGarrett Wollman xdrmem_destroy 94eae561b3SGarrett Wollman }; 95eae561b3SGarrett Wollman 96eae561b3SGarrett Wollman /* 97eae561b3SGarrett Wollman * The procedure xdrmem_create initializes a stream descriptor for a 98eae561b3SGarrett Wollman * memory buffer. 99eae561b3SGarrett Wollman */ 100eae561b3SGarrett Wollman void 101*d660d38dSCraig Rodrigues xdrmem_create(XDR *xdrs, char *addr, u_int size, enum xdr_op op) 102eae561b3SGarrett Wollman { 103eae561b3SGarrett Wollman 104eae561b3SGarrett Wollman xdrs->x_op = op; 1058360efbdSAlfred Perlstein xdrs->x_ops = ((unsigned long)addr & (sizeof(int32_t) - 1)) 1061ad08a09SPeter Wemm ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; 107eae561b3SGarrett Wollman xdrs->x_private = xdrs->x_base = addr; 108eae561b3SGarrett Wollman xdrs->x_handy = size; 109eae561b3SGarrett Wollman } 110eae561b3SGarrett Wollman 1118360efbdSAlfred Perlstein /*ARGSUSED*/ 112eae561b3SGarrett Wollman static void 113*d660d38dSCraig Rodrigues xdrmem_destroy(XDR *xdrs) 114eae561b3SGarrett Wollman { 1151ad08a09SPeter Wemm 116eae561b3SGarrett Wollman } 117eae561b3SGarrett Wollman 118eae561b3SGarrett Wollman static bool_t 119*d660d38dSCraig Rodrigues xdrmem_getlong_aligned(XDR *xdrs, long *lp) 120eae561b3SGarrett Wollman { 121eae561b3SGarrett Wollman 122d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 123eae561b3SGarrett Wollman return (FALSE); 124d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1258360efbdSAlfred Perlstein *lp = ntohl(*(u_int32_t *)xdrs->x_private); 1268360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 127eae561b3SGarrett Wollman return (TRUE); 128eae561b3SGarrett Wollman } 129eae561b3SGarrett Wollman 130eae561b3SGarrett Wollman static bool_t 131*d660d38dSCraig Rodrigues xdrmem_putlong_aligned(XDR *xdrs, const long *lp) 132eae561b3SGarrett Wollman { 133eae561b3SGarrett Wollman 134d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 135eae561b3SGarrett Wollman return (FALSE); 136d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1378360efbdSAlfred Perlstein *(u_int32_t *)xdrs->x_private = htonl((u_int32_t)*lp); 1388360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1391ad08a09SPeter Wemm return (TRUE); 1401ad08a09SPeter Wemm } 1411ad08a09SPeter Wemm 1421ad08a09SPeter Wemm static bool_t 143*d660d38dSCraig Rodrigues xdrmem_getlong_unaligned(XDR *xdrs, long *lp) 1441ad08a09SPeter Wemm { 1458360efbdSAlfred Perlstein u_int32_t l; 1461ad08a09SPeter Wemm 147d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 1481ad08a09SPeter Wemm return (FALSE); 149d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1508360efbdSAlfred Perlstein memmove(&l, xdrs->x_private, sizeof(int32_t)); 1511ad08a09SPeter Wemm *lp = ntohl(l); 1528360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1531ad08a09SPeter Wemm return (TRUE); 1541ad08a09SPeter Wemm } 1551ad08a09SPeter Wemm 1561ad08a09SPeter Wemm static bool_t 157*d660d38dSCraig Rodrigues xdrmem_putlong_unaligned(XDR *xdrs, const long *lp) 1581ad08a09SPeter Wemm { 1598360efbdSAlfred Perlstein u_int32_t l; 1601ad08a09SPeter Wemm 161d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 1621ad08a09SPeter Wemm return (FALSE); 163d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1648360efbdSAlfred Perlstein l = htonl((u_int32_t)*lp); 1658360efbdSAlfred Perlstein memmove(xdrs->x_private, &l, sizeof(int32_t)); 1668360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 167eae561b3SGarrett Wollman return (TRUE); 168eae561b3SGarrett Wollman } 169eae561b3SGarrett Wollman 170eae561b3SGarrett Wollman static bool_t 171*d660d38dSCraig Rodrigues xdrmem_getbytes(XDR *xdrs, char *addr, u_int len) 172eae561b3SGarrett Wollman { 173eae561b3SGarrett Wollman 174d7f15c94SJacques Vidrine if (xdrs->x_handy < len) 175eae561b3SGarrett Wollman return (FALSE); 176d7f15c94SJacques Vidrine xdrs->x_handy -= len; 1778360efbdSAlfred Perlstein memmove(addr, xdrs->x_private, len); 1788360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + len; 179eae561b3SGarrett Wollman return (TRUE); 180eae561b3SGarrett Wollman } 181eae561b3SGarrett Wollman 182eae561b3SGarrett Wollman static bool_t 183*d660d38dSCraig Rodrigues xdrmem_putbytes(XDR *xdrs, const char *addr, u_int len) 184eae561b3SGarrett Wollman { 185eae561b3SGarrett Wollman 186d7f15c94SJacques Vidrine if (xdrs->x_handy < len) 187eae561b3SGarrett Wollman return (FALSE); 188d7f15c94SJacques Vidrine xdrs->x_handy -= len; 1898360efbdSAlfred Perlstein memmove(xdrs->x_private, addr, len); 1908360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + len; 191eae561b3SGarrett Wollman return (TRUE); 192eae561b3SGarrett Wollman } 193eae561b3SGarrett Wollman 194eae561b3SGarrett Wollman static u_int 195*d660d38dSCraig Rodrigues xdrmem_getpos(XDR *xdrs) 196eae561b3SGarrett Wollman { 197eae561b3SGarrett Wollman 1981ad08a09SPeter Wemm /* XXX w/64-bit pointers, u_int not enough! */ 1998360efbdSAlfred Perlstein return (u_int)((u_long)xdrs->x_private - (u_long)xdrs->x_base); 200eae561b3SGarrett Wollman } 201eae561b3SGarrett Wollman 202eae561b3SGarrett Wollman static bool_t 203*d660d38dSCraig Rodrigues xdrmem_setpos(XDR *xdrs, u_int pos) 204eae561b3SGarrett Wollman { 2058360efbdSAlfred Perlstein char *newaddr = xdrs->x_base + pos; 2068360efbdSAlfred Perlstein char *lastaddr = (char *)xdrs->x_private + xdrs->x_handy; 207eae561b3SGarrett Wollman 208d7f15c94SJacques Vidrine if (newaddr > lastaddr) 209eae561b3SGarrett Wollman return (FALSE); 210eae561b3SGarrett Wollman xdrs->x_private = newaddr; 211d7f15c94SJacques Vidrine xdrs->x_handy = (u_int)(lastaddr - newaddr); /* XXX sizeof(u_int) <? sizeof(ptrdiff_t) */ 212eae561b3SGarrett Wollman return (TRUE); 213eae561b3SGarrett Wollman } 214eae561b3SGarrett Wollman 2151ad08a09SPeter Wemm static int32_t * 216*d660d38dSCraig Rodrigues xdrmem_inline_aligned(XDR *xdrs, u_int len) 217eae561b3SGarrett Wollman { 2181ad08a09SPeter Wemm int32_t *buf = 0; 219eae561b3SGarrett Wollman 220eae561b3SGarrett Wollman if (xdrs->x_handy >= len) { 221eae561b3SGarrett Wollman xdrs->x_handy -= len; 2221ad08a09SPeter Wemm buf = (int32_t *)xdrs->x_private; 2238360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + len; 224eae561b3SGarrett Wollman } 225eae561b3SGarrett Wollman return (buf); 226eae561b3SGarrett Wollman } 2271ad08a09SPeter Wemm 2288360efbdSAlfred Perlstein /* ARGSUSED */ 2291ad08a09SPeter Wemm static int32_t * 230*d660d38dSCraig Rodrigues xdrmem_inline_unaligned(XDR *xdrs, u_int len) 2311ad08a09SPeter Wemm { 2321ad08a09SPeter Wemm 2331ad08a09SPeter Wemm return (0); 2341ad08a09SPeter Wemm } 235