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