18360efbdSAlfred Perlstein /* $NetBSD: xdr_mem.c,v 1.15 2000/01/22 22:19:18 mycroft Exp $ */ 28360efbdSAlfred Perlstein 3a204967aSHiroki Sato /*- 4*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 5*8a16b7a1SPedro F. Giffuni * 6a204967aSHiroki Sato * Copyright (c) 2010, Oracle America, Inc. 7eae561b3SGarrett Wollman * 8a204967aSHiroki Sato * Redistribution and use in source and binary forms, with or without 9a204967aSHiroki Sato * modification, are permitted provided that the following conditions are 10a204967aSHiroki Sato * met: 11eae561b3SGarrett Wollman * 12a204967aSHiroki Sato * * Redistributions of source code must retain the above copyright 13a204967aSHiroki Sato * notice, this list of conditions and the following disclaimer. 14a204967aSHiroki Sato * * Redistributions in binary form must reproduce the above 15a204967aSHiroki Sato * copyright notice, this list of conditions and the following 16a204967aSHiroki Sato * disclaimer in the documentation and/or other materials 17a204967aSHiroki Sato * provided with the distribution. 18a204967aSHiroki Sato * * Neither the name of the "Oracle America, Inc." nor the names of its 19a204967aSHiroki Sato * contributors may be used to endorse or promote products derived 20a204967aSHiroki Sato * from this software without specific prior written permission. 21eae561b3SGarrett Wollman * 22a204967aSHiroki Sato * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23a204967aSHiroki Sato * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24a204967aSHiroki Sato * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25a204967aSHiroki Sato * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26a204967aSHiroki Sato * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 27a204967aSHiroki Sato * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28a204967aSHiroki Sato * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 29a204967aSHiroki Sato * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30a204967aSHiroki Sato * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31a204967aSHiroki Sato * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32a204967aSHiroki Sato * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 33a204967aSHiroki Sato * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34eae561b3SGarrett Wollman */ 35eae561b3SGarrett Wollman 36eae561b3SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint) 37a9bdcd37SDavid E. O'Brien static char *sccsid2 = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro"; 38333fc21eSDavid E. O'Brien static char *sccsid = "@(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC"; 39eae561b3SGarrett Wollman #endif 40333fc21eSDavid E. O'Brien #include <sys/cdefs.h> 41333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$"); 42eae561b3SGarrett Wollman 43eae561b3SGarrett Wollman /* 44eae561b3SGarrett Wollman * xdr_mem.h, XDR implementation using memory buffers. 45eae561b3SGarrett Wollman * 46eae561b3SGarrett Wollman * If you have some data to be interpreted as external data representation 47eae561b3SGarrett Wollman * or to be converted to external data representation in a memory buffer, 48eae561b3SGarrett Wollman * then this is the package for you. 49eae561b3SGarrett Wollman * 50eae561b3SGarrett Wollman */ 51eae561b3SGarrett Wollman 528360efbdSAlfred Perlstein #include "namespace.h" 538360efbdSAlfred Perlstein #include <sys/types.h> 548360efbdSAlfred Perlstein 55eae561b3SGarrett Wollman #include <netinet/in.h> 56eae561b3SGarrett Wollman 578360efbdSAlfred Perlstein #include <string.h> 58eae561b3SGarrett Wollman 598360efbdSAlfred Perlstein #include <rpc/types.h> 608360efbdSAlfred Perlstein #include <rpc/xdr.h> 618360efbdSAlfred Perlstein #include "un-namespace.h" 628360efbdSAlfred Perlstein 63c05ac53bSDavid E. O'Brien static void xdrmem_destroy(XDR *); 64c05ac53bSDavid E. O'Brien static bool_t xdrmem_getlong_aligned(XDR *, long *); 65c05ac53bSDavid E. O'Brien static bool_t xdrmem_putlong_aligned(XDR *, const long *); 66c05ac53bSDavid E. O'Brien static bool_t xdrmem_getlong_unaligned(XDR *, long *); 67c05ac53bSDavid E. O'Brien static bool_t xdrmem_putlong_unaligned(XDR *, const long *); 68c05ac53bSDavid E. O'Brien static bool_t xdrmem_getbytes(XDR *, char *, u_int); 69c05ac53bSDavid E. O'Brien static bool_t xdrmem_putbytes(XDR *, const char *, u_int); 708360efbdSAlfred Perlstein /* XXX: w/64-bit pointers, u_int not enough! */ 71c05ac53bSDavid E. O'Brien static u_int xdrmem_getpos(XDR *); 72c05ac53bSDavid E. O'Brien static bool_t xdrmem_setpos(XDR *, u_int); 73c05ac53bSDavid E. O'Brien static int32_t *xdrmem_inline_aligned(XDR *, u_int); 74c05ac53bSDavid E. O'Brien static int32_t *xdrmem_inline_unaligned(XDR *, u_int); 758360efbdSAlfred Perlstein 768360efbdSAlfred Perlstein static const struct xdr_ops xdrmem_ops_aligned = { 771ad08a09SPeter Wemm xdrmem_getlong_aligned, 781ad08a09SPeter Wemm xdrmem_putlong_aligned, 79eae561b3SGarrett Wollman xdrmem_getbytes, 80eae561b3SGarrett Wollman xdrmem_putbytes, 81eae561b3SGarrett Wollman xdrmem_getpos, 82eae561b3SGarrett Wollman xdrmem_setpos, 831ad08a09SPeter Wemm xdrmem_inline_aligned, 841ad08a09SPeter Wemm xdrmem_destroy 851ad08a09SPeter Wemm }; 861ad08a09SPeter Wemm 878360efbdSAlfred Perlstein static const struct xdr_ops xdrmem_ops_unaligned = { 881ad08a09SPeter Wemm xdrmem_getlong_unaligned, 891ad08a09SPeter Wemm xdrmem_putlong_unaligned, 901ad08a09SPeter Wemm xdrmem_getbytes, 911ad08a09SPeter Wemm xdrmem_putbytes, 921ad08a09SPeter Wemm xdrmem_getpos, 931ad08a09SPeter Wemm xdrmem_setpos, 941ad08a09SPeter Wemm xdrmem_inline_unaligned, 95eae561b3SGarrett Wollman xdrmem_destroy 96eae561b3SGarrett Wollman }; 97eae561b3SGarrett Wollman 98eae561b3SGarrett Wollman /* 99eae561b3SGarrett Wollman * The procedure xdrmem_create initializes a stream descriptor for a 100eae561b3SGarrett Wollman * memory buffer. 101eae561b3SGarrett Wollman */ 102eae561b3SGarrett Wollman void 103d660d38dSCraig Rodrigues xdrmem_create(XDR *xdrs, char *addr, u_int size, enum xdr_op op) 104eae561b3SGarrett Wollman { 105eae561b3SGarrett Wollman 106eae561b3SGarrett Wollman xdrs->x_op = op; 1078360efbdSAlfred Perlstein xdrs->x_ops = ((unsigned long)addr & (sizeof(int32_t) - 1)) 1081ad08a09SPeter Wemm ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; 109eae561b3SGarrett Wollman xdrs->x_private = xdrs->x_base = addr; 110eae561b3SGarrett Wollman xdrs->x_handy = size; 111eae561b3SGarrett Wollman } 112eae561b3SGarrett Wollman 1138360efbdSAlfred Perlstein /*ARGSUSED*/ 114eae561b3SGarrett Wollman static void 115d660d38dSCraig Rodrigues xdrmem_destroy(XDR *xdrs) 116eae561b3SGarrett Wollman { 1171ad08a09SPeter Wemm 118eae561b3SGarrett Wollman } 119eae561b3SGarrett Wollman 120eae561b3SGarrett Wollman static bool_t 121d660d38dSCraig Rodrigues xdrmem_getlong_aligned(XDR *xdrs, long *lp) 122eae561b3SGarrett Wollman { 123eae561b3SGarrett Wollman 124d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 125eae561b3SGarrett Wollman return (FALSE); 126d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1278360efbdSAlfred Perlstein *lp = ntohl(*(u_int32_t *)xdrs->x_private); 1288360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 129eae561b3SGarrett Wollman return (TRUE); 130eae561b3SGarrett Wollman } 131eae561b3SGarrett Wollman 132eae561b3SGarrett Wollman static bool_t 133d660d38dSCraig Rodrigues xdrmem_putlong_aligned(XDR *xdrs, const long *lp) 134eae561b3SGarrett Wollman { 135eae561b3SGarrett Wollman 136d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 137eae561b3SGarrett Wollman return (FALSE); 138d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1398360efbdSAlfred Perlstein *(u_int32_t *)xdrs->x_private = htonl((u_int32_t)*lp); 1408360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1411ad08a09SPeter Wemm return (TRUE); 1421ad08a09SPeter Wemm } 1431ad08a09SPeter Wemm 1441ad08a09SPeter Wemm static bool_t 145d660d38dSCraig Rodrigues xdrmem_getlong_unaligned(XDR *xdrs, long *lp) 1461ad08a09SPeter Wemm { 1478360efbdSAlfred Perlstein u_int32_t l; 1481ad08a09SPeter Wemm 149d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 1501ad08a09SPeter Wemm return (FALSE); 151d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1528360efbdSAlfred Perlstein memmove(&l, xdrs->x_private, sizeof(int32_t)); 1531ad08a09SPeter Wemm *lp = ntohl(l); 1548360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1551ad08a09SPeter Wemm return (TRUE); 1561ad08a09SPeter Wemm } 1571ad08a09SPeter Wemm 1581ad08a09SPeter Wemm static bool_t 159d660d38dSCraig Rodrigues xdrmem_putlong_unaligned(XDR *xdrs, const long *lp) 1601ad08a09SPeter Wemm { 1618360efbdSAlfred Perlstein u_int32_t l; 1621ad08a09SPeter Wemm 163d7f15c94SJacques Vidrine if (xdrs->x_handy < sizeof(int32_t)) 1641ad08a09SPeter Wemm return (FALSE); 165d7f15c94SJacques Vidrine xdrs->x_handy -= sizeof(int32_t); 1668360efbdSAlfred Perlstein l = htonl((u_int32_t)*lp); 1678360efbdSAlfred Perlstein memmove(xdrs->x_private, &l, sizeof(int32_t)); 1688360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 169eae561b3SGarrett Wollman return (TRUE); 170eae561b3SGarrett Wollman } 171eae561b3SGarrett Wollman 172eae561b3SGarrett Wollman static bool_t 173d660d38dSCraig Rodrigues xdrmem_getbytes(XDR *xdrs, char *addr, u_int len) 174eae561b3SGarrett Wollman { 175eae561b3SGarrett Wollman 176d7f15c94SJacques Vidrine if (xdrs->x_handy < len) 177eae561b3SGarrett Wollman return (FALSE); 178d7f15c94SJacques Vidrine xdrs->x_handy -= len; 1798360efbdSAlfred Perlstein memmove(addr, xdrs->x_private, len); 1808360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + len; 181eae561b3SGarrett Wollman return (TRUE); 182eae561b3SGarrett Wollman } 183eae561b3SGarrett Wollman 184eae561b3SGarrett Wollman static bool_t 185d660d38dSCraig Rodrigues xdrmem_putbytes(XDR *xdrs, const char *addr, u_int len) 186eae561b3SGarrett Wollman { 187eae561b3SGarrett Wollman 188d7f15c94SJacques Vidrine if (xdrs->x_handy < len) 189eae561b3SGarrett Wollman return (FALSE); 190d7f15c94SJacques Vidrine xdrs->x_handy -= len; 1918360efbdSAlfred Perlstein memmove(xdrs->x_private, addr, len); 1928360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + len; 193eae561b3SGarrett Wollman return (TRUE); 194eae561b3SGarrett Wollman } 195eae561b3SGarrett Wollman 196eae561b3SGarrett Wollman static u_int 197d660d38dSCraig Rodrigues xdrmem_getpos(XDR *xdrs) 198eae561b3SGarrett Wollman { 199eae561b3SGarrett Wollman 2001ad08a09SPeter Wemm /* XXX w/64-bit pointers, u_int not enough! */ 2018360efbdSAlfred Perlstein return (u_int)((u_long)xdrs->x_private - (u_long)xdrs->x_base); 202eae561b3SGarrett Wollman } 203eae561b3SGarrett Wollman 204eae561b3SGarrett Wollman static bool_t 205d660d38dSCraig Rodrigues xdrmem_setpos(XDR *xdrs, u_int pos) 206eae561b3SGarrett Wollman { 2078360efbdSAlfred Perlstein char *newaddr = xdrs->x_base + pos; 2088360efbdSAlfred Perlstein char *lastaddr = (char *)xdrs->x_private + xdrs->x_handy; 209eae561b3SGarrett Wollman 210d7f15c94SJacques Vidrine if (newaddr > lastaddr) 211eae561b3SGarrett Wollman return (FALSE); 212eae561b3SGarrett Wollman xdrs->x_private = newaddr; 213d7f15c94SJacques Vidrine xdrs->x_handy = (u_int)(lastaddr - newaddr); /* XXX sizeof(u_int) <? sizeof(ptrdiff_t) */ 214eae561b3SGarrett Wollman return (TRUE); 215eae561b3SGarrett Wollman } 216eae561b3SGarrett Wollman 2171ad08a09SPeter Wemm static int32_t * 218d660d38dSCraig Rodrigues xdrmem_inline_aligned(XDR *xdrs, u_int len) 219eae561b3SGarrett Wollman { 220513004a2SPedro F. Giffuni int32_t *buf = NULL; 221eae561b3SGarrett Wollman 222eae561b3SGarrett Wollman if (xdrs->x_handy >= len) { 223eae561b3SGarrett Wollman xdrs->x_handy -= len; 2241ad08a09SPeter Wemm buf = (int32_t *)xdrs->x_private; 2258360efbdSAlfred Perlstein xdrs->x_private = (char *)xdrs->x_private + len; 226eae561b3SGarrett Wollman } 227eae561b3SGarrett Wollman return (buf); 228eae561b3SGarrett Wollman } 2291ad08a09SPeter Wemm 2308360efbdSAlfred Perlstein /* ARGSUSED */ 2311ad08a09SPeter Wemm static int32_t * 232d660d38dSCraig Rodrigues xdrmem_inline_unaligned(XDR *xdrs, u_int len) 2331ad08a09SPeter Wemm { 2341ad08a09SPeter Wemm 2351ad08a09SPeter Wemm return (0); 2361ad08a09SPeter Wemm } 237