xdr_mem.c revision 50476
11902Swollman/* 21902Swollman * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 31902Swollman * unrestricted use provided that this legend is included on all tape 41902Swollman * media and as a part of the software program in whole or part. Users 51902Swollman * may copy or modify Sun RPC without charge, but are not authorized 61902Swollman * to license or distribute it to anyone else except as part of a product or 71902Swollman * program developed by the user. 88870Srgrimes * 91902Swollman * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 101902Swollman * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 111902Swollman * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 128870Srgrimes * 131902Swollman * Sun RPC is provided with no support and without any obligation on the 141902Swollman * part of Sun Microsystems, Inc. to assist in its use, correction, 151902Swollman * modification or enhancement. 168870Srgrimes * 171902Swollman * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 181902Swollman * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 191902Swollman * OR ANY PART THEREOF. 208870Srgrimes * 211902Swollman * In no event will Sun Microsystems, Inc. be liable for any lost revenue 221902Swollman * or profits or other special, indirect and consequential damages, even if 231902Swollman * Sun has been advised of the possibility of such damages. 248870Srgrimes * 251902Swollman * Sun Microsystems, Inc. 261902Swollman * 2550 Garcia Avenue 271902Swollman * Mountain View, California 94043 281902Swollman */ 291902Swollman 301902Swollman#if defined(LIBC_SCCS) && !defined(lint) 311902Swollman/*static char *sccsid = "from: @(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";*/ 321902Swollman/*static char *sccsid = "from: @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC";*/ 3350476Speterstatic char *rcsid = "$FreeBSD: head/lib/libc/xdr/xdr_mem.c 50476 1999-08-28 00:22:10Z peter $"; 341902Swollman#endif 351902Swollman 361902Swollman/* 371902Swollman * xdr_mem.h, XDR implementation using memory buffers. 381902Swollman * 391902Swollman * Copyright (C) 1984, Sun Microsystems, Inc. 401902Swollman * 411902Swollman * If you have some data to be interpreted as external data representation 421902Swollman * or to be converted to external data representation in a memory buffer, 431902Swollman * then this is the package for you. 441902Swollman * 451902Swollman */ 461902Swollman 4711669Sphk#include <string.h> 481902Swollman#include <rpc/types.h> 491902Swollman#include <rpc/xdr.h> 501902Swollman#include <netinet/in.h> 511902Swollman 5221062Speterstatic bool_t xdrmem_getlong_aligned(); 5321062Speterstatic bool_t xdrmem_putlong_aligned(); 5421062Speterstatic bool_t xdrmem_getlong_unaligned(); 5521062Speterstatic bool_t xdrmem_putlong_unaligned(); 561902Swollmanstatic bool_t xdrmem_getbytes(); 571902Swollmanstatic bool_t xdrmem_putbytes(); 5821062Speterstatic u_int xdrmem_getpos(); /* XXX w/64-bit pointers, u_int not enough! */ 591902Swollmanstatic bool_t xdrmem_setpos(); 6021062Speterstatic int32_t *xdrmem_inline_aligned(); 6121062Speterstatic int32_t *xdrmem_inline_unaligned(); 621902Swollmanstatic void xdrmem_destroy(); 631902Swollman 6421062Speterstatic struct xdr_ops xdrmem_ops_aligned = { 6521062Speter xdrmem_getlong_aligned, 6621062Speter xdrmem_putlong_aligned, 671902Swollman xdrmem_getbytes, 681902Swollman xdrmem_putbytes, 691902Swollman xdrmem_getpos, 701902Swollman xdrmem_setpos, 7121062Speter xdrmem_inline_aligned, 721902Swollman xdrmem_destroy 731902Swollman}; 741902Swollman 7521062Speterstatic struct xdr_ops xdrmem_ops_unaligned = { 7621062Speter xdrmem_getlong_unaligned, 7721062Speter xdrmem_putlong_unaligned, 7821062Speter xdrmem_getbytes, 7921062Speter xdrmem_putbytes, 8021062Speter xdrmem_getpos, 8121062Speter xdrmem_setpos, 8221062Speter xdrmem_inline_unaligned, 8321062Speter xdrmem_destroy 8421062Speter}; 8521062Speter 861902Swollman/* 871902Swollman * The procedure xdrmem_create initializes a stream descriptor for a 888870Srgrimes * memory buffer. 891902Swollman */ 901902Swollmanvoid 911902Swollmanxdrmem_create(xdrs, addr, size, op) 921902Swollman register XDR *xdrs; 931902Swollman caddr_t addr; 941902Swollman u_int size; 951902Swollman enum xdr_op op; 961902Swollman{ 971902Swollman 981902Swollman xdrs->x_op = op; 9921062Speter xdrs->x_ops = ((size_t)addr & (sizeof(int32_t) - 1)) 10021062Speter ? &xdrmem_ops_unaligned : &xdrmem_ops_aligned; 1011902Swollman xdrs->x_private = xdrs->x_base = addr; 1021902Swollman xdrs->x_handy = size; 1031902Swollman} 1041902Swollman 1051902Swollmanstatic void 1061902Swollmanxdrmem_destroy(/*xdrs*/) 1071902Swollman /*XDR *xdrs;*/ 1081902Swollman{ 10921062Speter 1101902Swollman} 1111902Swollman 1121902Swollmanstatic bool_t 11321062Speterxdrmem_getlong_aligned(xdrs, lp) 1141902Swollman register XDR *xdrs; 1151902Swollman long *lp; 1161902Swollman{ 1171902Swollman 11821062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 1191902Swollman return (FALSE); 12021062Speter *lp = ntohl(*(int32_t *)(xdrs->x_private)); 12121062Speter xdrs->x_private += sizeof(int32_t); 1221902Swollman return (TRUE); 1231902Swollman} 1241902Swollman 1251902Swollmanstatic bool_t 12621062Speterxdrmem_putlong_aligned(xdrs, lp) 1271902Swollman register XDR *xdrs; 1281902Swollman long *lp; 1291902Swollman{ 1301902Swollman 13121062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 1321902Swollman return (FALSE); 13321062Speter *(int32_t *)xdrs->x_private = htonl(*lp); 13421062Speter xdrs->x_private += sizeof(int32_t); 1351902Swollman return (TRUE); 1361902Swollman} 1371902Swollman 1381902Swollmanstatic bool_t 13921062Speterxdrmem_getlong_unaligned(xdrs, lp) 14021062Speter register XDR *xdrs; 14121062Speter long *lp; 14221062Speter{ 14321062Speter int32_t l; 14421062Speter 14521062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 14621062Speter return (FALSE); 14721062Speter memcpy(&l, xdrs->x_private, sizeof(int32_t)); 14821062Speter *lp = ntohl(l); 14921062Speter xdrs->x_private += sizeof(int32_t); 15021062Speter return (TRUE); 15121062Speter} 15221062Speter 15321062Speterstatic bool_t 15421062Speterxdrmem_putlong_unaligned(xdrs, lp) 15521062Speter register XDR *xdrs; 15621062Speter long *lp; 15721062Speter{ 15821062Speter int32_t l; 15921062Speter 16021062Speter if ((xdrs->x_handy -= sizeof(int32_t)) < 0) 16121062Speter return (FALSE); 16221062Speter l = htonl(*lp); 16321062Speter memcpy(xdrs->x_private, &l, sizeof(int32_t)); 16421062Speter xdrs->x_private += sizeof(int32_t); 16521062Speter return (TRUE); 16621062Speter} 16721062Speter 16821062Speterstatic bool_t 1691902Swollmanxdrmem_getbytes(xdrs, addr, len) 1701902Swollman register XDR *xdrs; 1711902Swollman caddr_t addr; 1721902Swollman register u_int len; 1731902Swollman{ 1741902Swollman 1751902Swollman if ((xdrs->x_handy -= len) < 0) 1761902Swollman return (FALSE); 17721062Speter memcpy(addr, xdrs->x_private, len); 1781902Swollman xdrs->x_private += len; 1791902Swollman return (TRUE); 1801902Swollman} 1811902Swollman 1821902Swollmanstatic bool_t 1831902Swollmanxdrmem_putbytes(xdrs, addr, len) 1841902Swollman register XDR *xdrs; 1851902Swollman caddr_t addr; 1861902Swollman register u_int len; 1871902Swollman{ 1881902Swollman 1891902Swollman if ((xdrs->x_handy -= len) < 0) 1901902Swollman return (FALSE); 19121062Speter memcpy(xdrs->x_private, addr, len); 1921902Swollman xdrs->x_private += len; 1931902Swollman return (TRUE); 1941902Swollman} 1951902Swollman 1961902Swollmanstatic u_int 1971902Swollmanxdrmem_getpos(xdrs) 1981902Swollman register XDR *xdrs; 1991902Swollman{ 2001902Swollman 20121062Speter /* XXX w/64-bit pointers, u_int not enough! */ 20221062Speter return ((u_long)xdrs->x_private - (u_long)xdrs->x_base); 2031902Swollman} 2041902Swollman 2051902Swollmanstatic bool_t 2061902Swollmanxdrmem_setpos(xdrs, pos) 2071902Swollman register XDR *xdrs; 2081902Swollman u_int pos; 2091902Swollman{ 2101902Swollman register caddr_t newaddr = xdrs->x_base + pos; 2111902Swollman register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; 2121902Swollman 2131902Swollman if ((long)newaddr > (long)lastaddr) 2141902Swollman return (FALSE); 2151902Swollman xdrs->x_private = newaddr; 21621062Speter xdrs->x_handy = (long)lastaddr - (long)newaddr; 2171902Swollman return (TRUE); 2181902Swollman} 2191902Swollman 22021062Speterstatic int32_t * 22121062Speterxdrmem_inline_aligned(xdrs, len) 2221902Swollman register XDR *xdrs; 2231902Swollman int len; 2241902Swollman{ 22521062Speter int32_t *buf = 0; 2261902Swollman 2271902Swollman if (xdrs->x_handy >= len) { 2281902Swollman xdrs->x_handy -= len; 22921062Speter buf = (int32_t *) xdrs->x_private; 2301902Swollman xdrs->x_private += len; 2311902Swollman } 2321902Swollman return (buf); 2331902Swollman} 23421062Speter 23521062Speterstatic int32_t * 23621062Speterxdrmem_inline_unaligned(xdrs, len) 23721062Speter register XDR *xdrs; 23821062Speter int len; 23921062Speter{ 24021062Speter 24121062Speter return (0); 24221062Speter} 243