xdr_mem.c revision 11669
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";*/ 3311669Sphkstatic char *rcsid = "$Id: xdr_mem.c,v 1.2 1995/05/30 05:42:06 rgrimes Exp $"; 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 521902Swollmanstatic bool_t xdrmem_getlong(); 531902Swollmanstatic bool_t xdrmem_putlong(); 541902Swollmanstatic bool_t xdrmem_getbytes(); 551902Swollmanstatic bool_t xdrmem_putbytes(); 561902Swollmanstatic u_int xdrmem_getpos(); 571902Swollmanstatic bool_t xdrmem_setpos(); 581902Swollmanstatic long * xdrmem_inline(); 591902Swollmanstatic void xdrmem_destroy(); 601902Swollman 611902Swollmanstatic struct xdr_ops xdrmem_ops = { 621902Swollman xdrmem_getlong, 631902Swollman xdrmem_putlong, 641902Swollman xdrmem_getbytes, 651902Swollman xdrmem_putbytes, 661902Swollman xdrmem_getpos, 671902Swollman xdrmem_setpos, 681902Swollman xdrmem_inline, 691902Swollman xdrmem_destroy 701902Swollman}; 711902Swollman 721902Swollman/* 731902Swollman * The procedure xdrmem_create initializes a stream descriptor for a 748870Srgrimes * memory buffer. 751902Swollman */ 761902Swollmanvoid 771902Swollmanxdrmem_create(xdrs, addr, size, op) 781902Swollman register XDR *xdrs; 791902Swollman caddr_t addr; 801902Swollman u_int size; 811902Swollman enum xdr_op op; 821902Swollman{ 831902Swollman 841902Swollman xdrs->x_op = op; 851902Swollman xdrs->x_ops = &xdrmem_ops; 861902Swollman xdrs->x_private = xdrs->x_base = addr; 871902Swollman xdrs->x_handy = size; 881902Swollman} 891902Swollman 901902Swollmanstatic void 911902Swollmanxdrmem_destroy(/*xdrs*/) 921902Swollman /*XDR *xdrs;*/ 931902Swollman{ 941902Swollman} 951902Swollman 961902Swollmanstatic bool_t 971902Swollmanxdrmem_getlong(xdrs, lp) 981902Swollman register XDR *xdrs; 991902Swollman long *lp; 1001902Swollman{ 1011902Swollman 1021902Swollman if ((xdrs->x_handy -= sizeof(long)) < 0) 1031902Swollman return (FALSE); 1041902Swollman *lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private)))); 1051902Swollman xdrs->x_private += sizeof(long); 1061902Swollman return (TRUE); 1071902Swollman} 1081902Swollman 1091902Swollmanstatic bool_t 1101902Swollmanxdrmem_putlong(xdrs, lp) 1111902Swollman register XDR *xdrs; 1121902Swollman long *lp; 1131902Swollman{ 1141902Swollman 1151902Swollman if ((xdrs->x_handy -= sizeof(long)) < 0) 1161902Swollman return (FALSE); 1171902Swollman *(long *)xdrs->x_private = (long)htonl((u_long)(*lp)); 1181902Swollman xdrs->x_private += sizeof(long); 1191902Swollman return (TRUE); 1201902Swollman} 1211902Swollman 1221902Swollmanstatic bool_t 1231902Swollmanxdrmem_getbytes(xdrs, addr, len) 1241902Swollman register XDR *xdrs; 1251902Swollman caddr_t addr; 1261902Swollman register u_int len; 1271902Swollman{ 1281902Swollman 1291902Swollman if ((xdrs->x_handy -= len) < 0) 1301902Swollman return (FALSE); 1311902Swollman bcopy(xdrs->x_private, addr, len); 1321902Swollman xdrs->x_private += len; 1331902Swollman return (TRUE); 1341902Swollman} 1351902Swollman 1361902Swollmanstatic bool_t 1371902Swollmanxdrmem_putbytes(xdrs, addr, len) 1381902Swollman register XDR *xdrs; 1391902Swollman caddr_t addr; 1401902Swollman register u_int len; 1411902Swollman{ 1421902Swollman 1431902Swollman if ((xdrs->x_handy -= len) < 0) 1441902Swollman return (FALSE); 1451902Swollman bcopy(addr, xdrs->x_private, len); 1461902Swollman xdrs->x_private += len; 1471902Swollman return (TRUE); 1481902Swollman} 1491902Swollman 1501902Swollmanstatic u_int 1511902Swollmanxdrmem_getpos(xdrs) 1521902Swollman register XDR *xdrs; 1531902Swollman{ 1541902Swollman 1551902Swollman return ((u_int)xdrs->x_private - (u_int)xdrs->x_base); 1561902Swollman} 1571902Swollman 1581902Swollmanstatic bool_t 1591902Swollmanxdrmem_setpos(xdrs, pos) 1601902Swollman register XDR *xdrs; 1611902Swollman u_int pos; 1621902Swollman{ 1631902Swollman register caddr_t newaddr = xdrs->x_base + pos; 1641902Swollman register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; 1651902Swollman 1661902Swollman if ((long)newaddr > (long)lastaddr) 1671902Swollman return (FALSE); 1681902Swollman xdrs->x_private = newaddr; 1691902Swollman xdrs->x_handy = (int)lastaddr - (int)newaddr; 1701902Swollman return (TRUE); 1711902Swollman} 1721902Swollman 1731902Swollmanstatic long * 1741902Swollmanxdrmem_inline(xdrs, len) 1751902Swollman register XDR *xdrs; 1761902Swollman int len; 1771902Swollman{ 1781902Swollman long *buf = 0; 1791902Swollman 1801902Swollman if (xdrs->x_handy >= len) { 1811902Swollman xdrs->x_handy -= len; 1821902Swollman buf = (long *) xdrs->x_private; 1831902Swollman xdrs->x_private += len; 1841902Swollman } 1851902Swollman return (buf); 1861902Swollman} 187