174462Salfred/* $NetBSD: xdr_mem.c,v 1.15 2000/01/22 22:19:18 mycroft Exp $ */ 274462Salfred 3259118Shrs/*- 4259118Shrs * Copyright (c) 2010, Oracle America, Inc. 58870Srgrimes * 6259118Shrs * Redistribution and use in source and binary forms, with or without 7259118Shrs * modification, are permitted provided that the following conditions are 8259118Shrs * met: 98870Srgrimes * 10259118Shrs * * Redistributions of source code must retain the above copyright 11259118Shrs * notice, this list of conditions and the following disclaimer. 12259118Shrs * * Redistributions in binary form must reproduce the above 13259118Shrs * copyright notice, this list of conditions and the following 14259118Shrs * disclaimer in the documentation and/or other materials 15259118Shrs * provided with the distribution. 16259118Shrs * * Neither the name of the "Oracle America, Inc." nor the names of its 17259118Shrs * contributors may be used to endorse or promote products derived 18259118Shrs * from this software without specific prior written permission. 198870Srgrimes * 20259118Shrs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21259118Shrs * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22259118Shrs * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23259118Shrs * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24259118Shrs * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 25259118Shrs * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26259118Shrs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 27259118Shrs * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28259118Shrs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29259118Shrs * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30259118Shrs * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31259118Shrs * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 321902Swollman */ 331902Swollman 341902Swollman#if defined(LIBC_SCCS) && !defined(lint) 35136582Sobrienstatic char *sccsid2 = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro"; 3692986Sobrienstatic char *sccsid = "@(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC"; 371902Swollman#endif 3892986Sobrien#include <sys/cdefs.h> 3992986Sobrien__FBSDID("$FreeBSD: releng/11.0/lib/libc/xdr/xdr_mem.c 297790 2016-04-10 19:33:58Z pfg $"); 401902Swollman 411902Swollman/* 421902Swollman * xdr_mem.h, XDR implementation using memory buffers. 431902Swollman * 441902Swollman * If you have some data to be interpreted as external data representation 451902Swollman * or to be converted to external data representation in a memory buffer, 461902Swollman * then this is the package for you. 471902Swollman * 481902Swollman */ 491902Swollman 5074462Salfred#include "namespace.h" 5174462Salfred#include <sys/types.h> 5274462Salfred 5374462Salfred#include <netinet/in.h> 5474462Salfred 5511669Sphk#include <string.h> 5674462Salfred 571902Swollman#include <rpc/types.h> 581902Swollman#include <rpc/xdr.h> 5974462Salfred#include "un-namespace.h" 601902Swollman 6192905Sobrienstatic void xdrmem_destroy(XDR *); 6292905Sobrienstatic bool_t xdrmem_getlong_aligned(XDR *, long *); 6392905Sobrienstatic bool_t xdrmem_putlong_aligned(XDR *, const long *); 6492905Sobrienstatic bool_t xdrmem_getlong_unaligned(XDR *, long *); 6592905Sobrienstatic bool_t xdrmem_putlong_unaligned(XDR *, const long *); 6692905Sobrienstatic bool_t xdrmem_getbytes(XDR *, char *, u_int); 6792905Sobrienstatic bool_t xdrmem_putbytes(XDR *, const char *, u_int); 6874462Salfred/* XXX: w/64-bit pointers, u_int not enough! */ 6992905Sobrienstatic u_int xdrmem_getpos(XDR *); 7092905Sobrienstatic bool_t xdrmem_setpos(XDR *, u_int); 7192905Sobrienstatic int32_t *xdrmem_inline_aligned(XDR *, u_int); 7292905Sobrienstatic int32_t *xdrmem_inline_unaligned(XDR *, u_int); 731902Swollman 7474462Salfredstatic const struct xdr_ops xdrmem_ops_aligned = { 7521062Speter xdrmem_getlong_aligned, 7621062Speter xdrmem_putlong_aligned, 771902Swollman xdrmem_getbytes, 781902Swollman xdrmem_putbytes, 791902Swollman xdrmem_getpos, 801902Swollman xdrmem_setpos, 8121062Speter xdrmem_inline_aligned, 821902Swollman xdrmem_destroy 831902Swollman}; 841902Swollman 8574462Salfredstatic const struct xdr_ops xdrmem_ops_unaligned = { 8621062Speter xdrmem_getlong_unaligned, 8721062Speter xdrmem_putlong_unaligned, 8821062Speter xdrmem_getbytes, 8921062Speter xdrmem_putbytes, 9021062Speter xdrmem_getpos, 9121062Speter xdrmem_setpos, 9221062Speter xdrmem_inline_unaligned, 9321062Speter xdrmem_destroy 9421062Speter}; 9521062Speter 961902Swollman/* 971902Swollman * The procedure xdrmem_create initializes a stream descriptor for a 988870Srgrimes * memory buffer. 991902Swollman */ 1001902Swollmanvoid 101283833Srodrigcxdrmem_create(XDR *xdrs, char *addr, u_int size, enum xdr_op op) 1021902Swollman{ 1031902Swollman 1041902Swollman xdrs->x_op = op; 10574462Salfred xdrs->x_ops = ((unsigned long)addr & (sizeof(int32_t) - 1)) 10674462Salfred ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; 1071902Swollman xdrs->x_private = xdrs->x_base = addr; 1081902Swollman xdrs->x_handy = size; 1091902Swollman} 1101902Swollman 11174462Salfred/*ARGSUSED*/ 1121902Swollmanstatic void 113283833Srodrigcxdrmem_destroy(XDR *xdrs) 1141902Swollman{ 11521062Speter 1161902Swollman} 1171902Swollman 1181902Swollmanstatic bool_t 119283833Srodrigcxdrmem_getlong_aligned(XDR *xdrs, long *lp) 1201902Swollman{ 1211902Swollman 122111962Snectar if (xdrs->x_handy < sizeof(int32_t)) 1231902Swollman return (FALSE); 124111962Snectar xdrs->x_handy -= sizeof(int32_t); 12574462Salfred *lp = ntohl(*(u_int32_t *)xdrs->x_private); 12674462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1271902Swollman return (TRUE); 1281902Swollman} 1291902Swollman 1301902Swollmanstatic bool_t 131283833Srodrigcxdrmem_putlong_aligned(XDR *xdrs, const long *lp) 1321902Swollman{ 1331902Swollman 134111962Snectar if (xdrs->x_handy < sizeof(int32_t)) 1351902Swollman return (FALSE); 136111962Snectar xdrs->x_handy -= sizeof(int32_t); 13774462Salfred *(u_int32_t *)xdrs->x_private = htonl((u_int32_t)*lp); 13874462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1391902Swollman return (TRUE); 1401902Swollman} 1411902Swollman 1421902Swollmanstatic bool_t 143283833Srodrigcxdrmem_getlong_unaligned(XDR *xdrs, long *lp) 14421062Speter{ 14574462Salfred u_int32_t l; 14621062Speter 147111962Snectar if (xdrs->x_handy < sizeof(int32_t)) 14821062Speter return (FALSE); 149111962Snectar xdrs->x_handy -= sizeof(int32_t); 15074462Salfred memmove(&l, xdrs->x_private, sizeof(int32_t)); 15121062Speter *lp = ntohl(l); 15274462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 15321062Speter return (TRUE); 15421062Speter} 15521062Speter 15621062Speterstatic bool_t 157283833Srodrigcxdrmem_putlong_unaligned(XDR *xdrs, const long *lp) 15821062Speter{ 15974462Salfred u_int32_t l; 16021062Speter 161111962Snectar if (xdrs->x_handy < sizeof(int32_t)) 16221062Speter return (FALSE); 163111962Snectar xdrs->x_handy -= sizeof(int32_t); 16474462Salfred l = htonl((u_int32_t)*lp); 16574462Salfred memmove(xdrs->x_private, &l, sizeof(int32_t)); 16674462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 16721062Speter return (TRUE); 16821062Speter} 16921062Speter 17021062Speterstatic bool_t 171283833Srodrigcxdrmem_getbytes(XDR *xdrs, char *addr, u_int len) 1721902Swollman{ 1731902Swollman 174111962Snectar if (xdrs->x_handy < len) 1751902Swollman return (FALSE); 176111962Snectar xdrs->x_handy -= len; 17774462Salfred memmove(addr, xdrs->x_private, len); 17874462Salfred xdrs->x_private = (char *)xdrs->x_private + len; 1791902Swollman return (TRUE); 1801902Swollman} 1811902Swollman 1821902Swollmanstatic bool_t 183283833Srodrigcxdrmem_putbytes(XDR *xdrs, const char *addr, u_int len) 1841902Swollman{ 1851902Swollman 186111962Snectar if (xdrs->x_handy < len) 1871902Swollman return (FALSE); 188111962Snectar xdrs->x_handy -= len; 18974462Salfred memmove(xdrs->x_private, addr, len); 19074462Salfred xdrs->x_private = (char *)xdrs->x_private + len; 1911902Swollman return (TRUE); 1921902Swollman} 1931902Swollman 1941902Swollmanstatic u_int 195283833Srodrigcxdrmem_getpos(XDR *xdrs) 1961902Swollman{ 1971902Swollman 19821062Speter /* XXX w/64-bit pointers, u_int not enough! */ 19974462Salfred return (u_int)((u_long)xdrs->x_private - (u_long)xdrs->x_base); 2001902Swollman} 2011902Swollman 2021902Swollmanstatic bool_t 203283833Srodrigcxdrmem_setpos(XDR *xdrs, u_int pos) 2041902Swollman{ 20574462Salfred char *newaddr = xdrs->x_base + pos; 20674462Salfred char *lastaddr = (char *)xdrs->x_private + xdrs->x_handy; 2071902Swollman 208111962Snectar if (newaddr > lastaddr) 2091902Swollman return (FALSE); 2101902Swollman xdrs->x_private = newaddr; 211111962Snectar xdrs->x_handy = (u_int)(lastaddr - newaddr); /* XXX sizeof(u_int) <? sizeof(ptrdiff_t) */ 2121902Swollman return (TRUE); 2131902Swollman} 2141902Swollman 21521062Speterstatic int32_t * 216283833Srodrigcxdrmem_inline_aligned(XDR *xdrs, u_int len) 2171902Swollman{ 218297790Spfg int32_t *buf = NULL; 2191902Swollman 2201902Swollman if (xdrs->x_handy >= len) { 2211902Swollman xdrs->x_handy -= len; 22274462Salfred buf = (int32_t *)xdrs->x_private; 22374462Salfred xdrs->x_private = (char *)xdrs->x_private + len; 2241902Swollman } 2251902Swollman return (buf); 2261902Swollman} 22721062Speter 22874462Salfred/* ARGSUSED */ 22921062Speterstatic int32_t * 230283833Srodrigcxdrmem_inline_unaligned(XDR *xdrs, u_int len) 23121062Speter{ 23274462Salfred 23321062Speter return (0); 23421062Speter} 235