xdr_mem.c revision 74462
174462Salfred/* $NetBSD: xdr_mem.c,v 1.15 2000/01/22 22:19:18 mycroft Exp $ */ 274462Salfred 31902Swollman/* 41902Swollman * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 51902Swollman * unrestricted use provided that this legend is included on all tape 61902Swollman * media and as a part of the software program in whole or part. Users 71902Swollman * may copy or modify Sun RPC without charge, but are not authorized 81902Swollman * to license or distribute it to anyone else except as part of a product or 91902Swollman * program developed by the user. 108870Srgrimes * 111902Swollman * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 121902Swollman * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 131902Swollman * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 148870Srgrimes * 151902Swollman * Sun RPC is provided with no support and without any obligation on the 161902Swollman * part of Sun Microsystems, Inc. to assist in its use, correction, 171902Swollman * modification or enhancement. 188870Srgrimes * 191902Swollman * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 201902Swollman * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 211902Swollman * OR ANY PART THEREOF. 228870Srgrimes * 231902Swollman * In no event will Sun Microsystems, Inc. be liable for any lost revenue 241902Swollman * or profits or other special, indirect and consequential damages, even if 251902Swollman * Sun has been advised of the possibility of such damages. 268870Srgrimes * 271902Swollman * Sun Microsystems, Inc. 281902Swollman * 2550 Garcia Avenue 291902Swollman * Mountain View, California 94043 301902Swollman */ 311902Swollman 3274462Salfred#include <sys/cdefs.h> 331902Swollman#if defined(LIBC_SCCS) && !defined(lint) 341902Swollman/*static char *sccsid = "from: @(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";*/ 351902Swollman/*static char *sccsid = "from: @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC";*/ 3650476Speterstatic char *rcsid = "$FreeBSD: head/lib/libc/xdr/xdr_mem.c 74462 2001-03-19 12:50:13Z alfred $"; 371902Swollman#endif 381902Swollman 391902Swollman/* 401902Swollman * xdr_mem.h, XDR implementation using memory buffers. 411902Swollman * 421902Swollman * Copyright (C) 1984, Sun Microsystems, Inc. 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 6174462Salfredstatic void xdrmem_destroy __P((XDR *)); 6274462Salfredstatic bool_t xdrmem_getlong_aligned __P((XDR *, long *)); 6374462Salfredstatic bool_t xdrmem_putlong_aligned __P((XDR *, const long *)); 6474462Salfredstatic bool_t xdrmem_getlong_unaligned __P((XDR *, long *)); 6574462Salfredstatic bool_t xdrmem_putlong_unaligned __P((XDR *, const long *)); 6674462Salfredstatic bool_t xdrmem_getbytes __P((XDR *, char *, u_int)); 6774462Salfredstatic bool_t xdrmem_putbytes __P((XDR *, const char *, u_int)); 6874462Salfred/* XXX: w/64-bit pointers, u_int not enough! */ 6974462Salfredstatic u_int xdrmem_getpos __P((XDR *)); 7074462Salfredstatic bool_t xdrmem_setpos __P((XDR *, u_int)); 7174462Salfredstatic int32_t *xdrmem_inline_aligned __P((XDR *, u_int)); 7274462Salfredstatic int32_t *xdrmem_inline_unaligned __P((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 1011902Swollmanxdrmem_create(xdrs, addr, size, op) 10274462Salfred XDR *xdrs; 10374462Salfred char *addr; 1041902Swollman u_int size; 1051902Swollman enum xdr_op op; 1061902Swollman{ 1071902Swollman 1081902Swollman xdrs->x_op = op; 10974462Salfred xdrs->x_ops = ((unsigned long)addr & (sizeof(int32_t) - 1)) 11074462Salfred ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; 1111902Swollman xdrs->x_private = xdrs->x_base = addr; 1121902Swollman xdrs->x_handy = size; 1131902Swollman} 1141902Swollman 11574462Salfred/*ARGSUSED*/ 1161902Swollmanstatic void 11774462Salfredxdrmem_destroy(xdrs) 11874462Salfred XDR *xdrs; 1191902Swollman{ 12021062Speter 1211902Swollman} 1221902Swollman 1231902Swollmanstatic bool_t 12421062Speterxdrmem_getlong_aligned(xdrs, lp) 12574462Salfred XDR *xdrs; 1261902Swollman long *lp; 1271902Swollman{ 1281902Swollman 12921062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 1301902Swollman return (FALSE); 13174462Salfred *lp = ntohl(*(u_int32_t *)xdrs->x_private); 13274462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1331902Swollman return (TRUE); 1341902Swollman} 1351902Swollman 1361902Swollmanstatic bool_t 13721062Speterxdrmem_putlong_aligned(xdrs, lp) 13874462Salfred XDR *xdrs; 13974462Salfred const long *lp; 1401902Swollman{ 1411902Swollman 14221062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 1431902Swollman return (FALSE); 14474462Salfred *(u_int32_t *)xdrs->x_private = htonl((u_int32_t)*lp); 14574462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 1461902Swollman return (TRUE); 1471902Swollman} 1481902Swollman 1491902Swollmanstatic bool_t 15021062Speterxdrmem_getlong_unaligned(xdrs, lp) 15174462Salfred XDR *xdrs; 15221062Speter long *lp; 15321062Speter{ 15474462Salfred u_int32_t l; 15521062Speter 15621062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 15721062Speter return (FALSE); 15874462Salfred memmove(&l, xdrs->x_private, sizeof(int32_t)); 15921062Speter *lp = ntohl(l); 16074462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 16121062Speter return (TRUE); 16221062Speter} 16321062Speter 16421062Speterstatic bool_t 16521062Speterxdrmem_putlong_unaligned(xdrs, lp) 16674462Salfred XDR *xdrs; 16774462Salfred const long *lp; 16821062Speter{ 16974462Salfred u_int32_t l; 17021062Speter 17121062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 17221062Speter return (FALSE); 17374462Salfred l = htonl((u_int32_t)*lp); 17474462Salfred memmove(xdrs->x_private, &l, sizeof(int32_t)); 17574462Salfred xdrs->x_private = (char *)xdrs->x_private + sizeof(int32_t); 17621062Speter return (TRUE); 17721062Speter} 17821062Speter 17921062Speterstatic bool_t 1801902Swollmanxdrmem_getbytes(xdrs, addr, len) 18174462Salfred XDR *xdrs; 18274462Salfred char *addr; 18374462Salfred u_int len; 1841902Swollman{ 1851902Swollman 1861902Swollman if ((xdrs->x_handy -= len) < 0) 1871902Swollman return (FALSE); 18874462Salfred memmove(addr, xdrs->x_private, len); 18974462Salfred xdrs->x_private = (char *)xdrs->x_private + len; 1901902Swollman return (TRUE); 1911902Swollman} 1921902Swollman 1931902Swollmanstatic bool_t 1941902Swollmanxdrmem_putbytes(xdrs, addr, len) 19574462Salfred XDR *xdrs; 19674462Salfred const char *addr; 19774462Salfred u_int len; 1981902Swollman{ 1991902Swollman 2001902Swollman if ((xdrs->x_handy -= len) < 0) 2011902Swollman return (FALSE); 20274462Salfred memmove(xdrs->x_private, addr, len); 20374462Salfred xdrs->x_private = (char *)xdrs->x_private + len; 2041902Swollman return (TRUE); 2051902Swollman} 2061902Swollman 2071902Swollmanstatic u_int 2081902Swollmanxdrmem_getpos(xdrs) 20974462Salfred XDR *xdrs; 2101902Swollman{ 2111902Swollman 21221062Speter /* XXX w/64-bit pointers, u_int not enough! */ 21374462Salfred return (u_int)((u_long)xdrs->x_private - (u_long)xdrs->x_base); 2141902Swollman} 2151902Swollman 2161902Swollmanstatic bool_t 2171902Swollmanxdrmem_setpos(xdrs, pos) 21874462Salfred XDR *xdrs; 2191902Swollman u_int pos; 2201902Swollman{ 22174462Salfred char *newaddr = xdrs->x_base + pos; 22274462Salfred char *lastaddr = (char *)xdrs->x_private + xdrs->x_handy; 2231902Swollman 2241902Swollman if ((long)newaddr > (long)lastaddr) 2251902Swollman return (FALSE); 2261902Swollman xdrs->x_private = newaddr; 22774462Salfred xdrs->x_handy = (int)((long)lastaddr - (long)newaddr); 2281902Swollman return (TRUE); 2291902Swollman} 2301902Swollman 23121062Speterstatic int32_t * 23221062Speterxdrmem_inline_aligned(xdrs, len) 23374462Salfred XDR *xdrs; 23474462Salfred u_int len; 2351902Swollman{ 23621062Speter int32_t *buf = 0; 2371902Swollman 2381902Swollman if (xdrs->x_handy >= len) { 2391902Swollman xdrs->x_handy -= len; 24074462Salfred buf = (int32_t *)xdrs->x_private; 24174462Salfred xdrs->x_private = (char *)xdrs->x_private + len; 2421902Swollman } 2431902Swollman return (buf); 2441902Swollman} 24521062Speter 24674462Salfred/* ARGSUSED */ 24721062Speterstatic int32_t * 24821062Speterxdrmem_inline_unaligned(xdrs, len) 24974462Salfred XDR *xdrs; 25074462Salfred u_int len; 25121062Speter{ 25274462Salfred 25321062Speter return (0); 25421062Speter} 255