xref: /freebsd/lib/libc/xdr/xdr_mem.c (revision 1ad08a09e9732e9e6e44f069c55f4abe27ed392a)
1eae561b3SGarrett Wollman /*
2eae561b3SGarrett Wollman  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
3eae561b3SGarrett Wollman  * unrestricted use provided that this legend is included on all tape
4eae561b3SGarrett Wollman  * media and as a part of the software program in whole or part.  Users
5eae561b3SGarrett Wollman  * may copy or modify Sun RPC without charge, but are not authorized
6eae561b3SGarrett Wollman  * to license or distribute it to anyone else except as part of a product or
7eae561b3SGarrett Wollman  * program developed by the user.
8eae561b3SGarrett Wollman  *
9eae561b3SGarrett Wollman  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
10eae561b3SGarrett Wollman  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
11eae561b3SGarrett Wollman  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
12eae561b3SGarrett Wollman  *
13eae561b3SGarrett Wollman  * Sun RPC is provided with no support and without any obligation on the
14eae561b3SGarrett Wollman  * part of Sun Microsystems, Inc. to assist in its use, correction,
15eae561b3SGarrett Wollman  * modification or enhancement.
16eae561b3SGarrett Wollman  *
17eae561b3SGarrett Wollman  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
18eae561b3SGarrett Wollman  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
19eae561b3SGarrett Wollman  * OR ANY PART THEREOF.
20eae561b3SGarrett Wollman  *
21eae561b3SGarrett Wollman  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
22eae561b3SGarrett Wollman  * or profits or other special, indirect and consequential damages, even if
23eae561b3SGarrett Wollman  * Sun has been advised of the possibility of such damages.
24eae561b3SGarrett Wollman  *
25eae561b3SGarrett Wollman  * Sun Microsystems, Inc.
26eae561b3SGarrett Wollman  * 2550 Garcia Avenue
27eae561b3SGarrett Wollman  * Mountain View, California  94043
28eae561b3SGarrett Wollman  */
29eae561b3SGarrett Wollman 
30eae561b3SGarrett Wollman #if defined(LIBC_SCCS) && !defined(lint)
31eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";*/
32eae561b3SGarrett Wollman /*static char *sccsid = "from: @(#)xdr_mem.c	2.1 88/07/29 4.0 RPCSRC";*/
331ad08a09SPeter Wemm static char *rcsid = "$Id: xdr_mem.c,v 1.3 1995/10/22 14:53:55 phk Exp $";
34eae561b3SGarrett Wollman #endif
35eae561b3SGarrett Wollman 
36eae561b3SGarrett Wollman /*
37eae561b3SGarrett Wollman  * xdr_mem.h, XDR implementation using memory buffers.
38eae561b3SGarrett Wollman  *
39eae561b3SGarrett Wollman  * Copyright (C) 1984, Sun Microsystems, Inc.
40eae561b3SGarrett Wollman  *
41eae561b3SGarrett Wollman  * If you have some data to be interpreted as external data representation
42eae561b3SGarrett Wollman  * or to be converted to external data representation in a memory buffer,
43eae561b3SGarrett Wollman  * then this is the package for you.
44eae561b3SGarrett Wollman  *
45eae561b3SGarrett Wollman  */
46eae561b3SGarrett Wollman 
4729285d6cSPoul-Henning Kamp #include <string.h>
48eae561b3SGarrett Wollman #include <rpc/types.h>
49eae561b3SGarrett Wollman #include <rpc/xdr.h>
50eae561b3SGarrett Wollman #include <netinet/in.h>
51eae561b3SGarrett Wollman 
521ad08a09SPeter Wemm static bool_t	xdrmem_getlong_aligned();
531ad08a09SPeter Wemm static bool_t	xdrmem_putlong_aligned();
541ad08a09SPeter Wemm static bool_t	xdrmem_getlong_unaligned();
551ad08a09SPeter Wemm static bool_t	xdrmem_putlong_unaligned();
56eae561b3SGarrett Wollman static bool_t	xdrmem_getbytes();
57eae561b3SGarrett Wollman static bool_t	xdrmem_putbytes();
581ad08a09SPeter Wemm static u_int	xdrmem_getpos(); /* XXX w/64-bit pointers, u_int not enough! */
59eae561b3SGarrett Wollman static bool_t	xdrmem_setpos();
601ad08a09SPeter Wemm static int32_t *xdrmem_inline_aligned();
611ad08a09SPeter Wemm static int32_t *xdrmem_inline_unaligned();
62eae561b3SGarrett Wollman static void	xdrmem_destroy();
63eae561b3SGarrett Wollman 
641ad08a09SPeter Wemm static struct	xdr_ops xdrmem_ops_aligned = {
651ad08a09SPeter Wemm 	xdrmem_getlong_aligned,
661ad08a09SPeter Wemm 	xdrmem_putlong_aligned,
67eae561b3SGarrett Wollman 	xdrmem_getbytes,
68eae561b3SGarrett Wollman 	xdrmem_putbytes,
69eae561b3SGarrett Wollman 	xdrmem_getpos,
70eae561b3SGarrett Wollman 	xdrmem_setpos,
711ad08a09SPeter Wemm 	xdrmem_inline_aligned,
721ad08a09SPeter Wemm 	xdrmem_destroy
731ad08a09SPeter Wemm };
741ad08a09SPeter Wemm 
751ad08a09SPeter Wemm static struct	xdr_ops xdrmem_ops_unaligned = {
761ad08a09SPeter Wemm 	xdrmem_getlong_unaligned,
771ad08a09SPeter Wemm 	xdrmem_putlong_unaligned,
781ad08a09SPeter Wemm 	xdrmem_getbytes,
791ad08a09SPeter Wemm 	xdrmem_putbytes,
801ad08a09SPeter Wemm 	xdrmem_getpos,
811ad08a09SPeter Wemm 	xdrmem_setpos,
821ad08a09SPeter Wemm 	xdrmem_inline_unaligned,
83eae561b3SGarrett Wollman 	xdrmem_destroy
84eae561b3SGarrett Wollman };
85eae561b3SGarrett Wollman 
86eae561b3SGarrett Wollman /*
87eae561b3SGarrett Wollman  * The procedure xdrmem_create initializes a stream descriptor for a
88eae561b3SGarrett Wollman  * memory buffer.
89eae561b3SGarrett Wollman  */
90eae561b3SGarrett Wollman void
91eae561b3SGarrett Wollman xdrmem_create(xdrs, addr, size, op)
92eae561b3SGarrett Wollman 	register XDR *xdrs;
93eae561b3SGarrett Wollman 	caddr_t addr;
94eae561b3SGarrett Wollman 	u_int size;
95eae561b3SGarrett Wollman 	enum xdr_op op;
96eae561b3SGarrett Wollman {
97eae561b3SGarrett Wollman 
98eae561b3SGarrett Wollman 	xdrs->x_op = op;
991ad08a09SPeter Wemm 	xdrs->x_ops = ((size_t)addr & (sizeof(int32_t) - 1))
1001ad08a09SPeter Wemm 		? &xdrmem_ops_unaligned : &xdrmem_ops_aligned;
101eae561b3SGarrett Wollman 	xdrs->x_private = xdrs->x_base = addr;
102eae561b3SGarrett Wollman 	xdrs->x_handy = size;
103eae561b3SGarrett Wollman }
104eae561b3SGarrett Wollman 
105eae561b3SGarrett Wollman static void
106eae561b3SGarrett Wollman xdrmem_destroy(/*xdrs*/)
107eae561b3SGarrett Wollman 	/*XDR *xdrs;*/
108eae561b3SGarrett Wollman {
1091ad08a09SPeter Wemm 
110eae561b3SGarrett Wollman }
111eae561b3SGarrett Wollman 
112eae561b3SGarrett Wollman static bool_t
1131ad08a09SPeter Wemm xdrmem_getlong_aligned(xdrs, lp)
114eae561b3SGarrett Wollman 	register XDR *xdrs;
115eae561b3SGarrett Wollman 	long *lp;
116eae561b3SGarrett Wollman {
117eae561b3SGarrett Wollman 
1181ad08a09SPeter Wemm 	if ((xdrs->x_handy -= sizeof(int32_t)) < 0)
119eae561b3SGarrett Wollman 		return (FALSE);
1201ad08a09SPeter Wemm 	*lp = ntohl(*(int32_t *)(xdrs->x_private));
1211ad08a09SPeter Wemm 	xdrs->x_private += sizeof(int32_t);
122eae561b3SGarrett Wollman 	return (TRUE);
123eae561b3SGarrett Wollman }
124eae561b3SGarrett Wollman 
125eae561b3SGarrett Wollman static bool_t
1261ad08a09SPeter Wemm xdrmem_putlong_aligned(xdrs, lp)
127eae561b3SGarrett Wollman 	register XDR *xdrs;
128eae561b3SGarrett Wollman 	long *lp;
129eae561b3SGarrett Wollman {
130eae561b3SGarrett Wollman 
1311ad08a09SPeter Wemm 	if ((xdrs->x_handy -= sizeof(int32_t)) < 0)
132eae561b3SGarrett Wollman 		return (FALSE);
1331ad08a09SPeter Wemm 	*(int32_t *)xdrs->x_private = htonl(*lp);
1341ad08a09SPeter Wemm 	xdrs->x_private += sizeof(int32_t);
1351ad08a09SPeter Wemm 	return (TRUE);
1361ad08a09SPeter Wemm }
1371ad08a09SPeter Wemm 
1381ad08a09SPeter Wemm static bool_t
1391ad08a09SPeter Wemm xdrmem_getlong_unaligned(xdrs, lp)
1401ad08a09SPeter Wemm 	register XDR *xdrs;
1411ad08a09SPeter Wemm 	long *lp;
1421ad08a09SPeter Wemm {
1431ad08a09SPeter Wemm 	int32_t l;
1441ad08a09SPeter Wemm 
1451ad08a09SPeter Wemm 	if ((xdrs->x_handy -= sizeof(int32_t)) < 0)
1461ad08a09SPeter Wemm 		return (FALSE);
1471ad08a09SPeter Wemm 	memcpy(&l, xdrs->x_private, sizeof(int32_t));
1481ad08a09SPeter Wemm 	*lp = ntohl(l);
1491ad08a09SPeter Wemm 	xdrs->x_private += sizeof(int32_t);
1501ad08a09SPeter Wemm 	return (TRUE);
1511ad08a09SPeter Wemm }
1521ad08a09SPeter Wemm 
1531ad08a09SPeter Wemm static bool_t
1541ad08a09SPeter Wemm xdrmem_putlong_unaligned(xdrs, lp)
1551ad08a09SPeter Wemm 	register XDR *xdrs;
1561ad08a09SPeter Wemm 	long *lp;
1571ad08a09SPeter Wemm {
1581ad08a09SPeter Wemm 	int32_t l;
1591ad08a09SPeter Wemm 
1601ad08a09SPeter Wemm 	if ((xdrs->x_handy -= sizeof(int32_t)) < 0)
1611ad08a09SPeter Wemm 		return (FALSE);
1621ad08a09SPeter Wemm 	l = htonl(*lp);
1631ad08a09SPeter Wemm 	memcpy(xdrs->x_private, &l, sizeof(int32_t));
1641ad08a09SPeter Wemm 	xdrs->x_private += sizeof(int32_t);
165eae561b3SGarrett Wollman 	return (TRUE);
166eae561b3SGarrett Wollman }
167eae561b3SGarrett Wollman 
168eae561b3SGarrett Wollman static bool_t
169eae561b3SGarrett Wollman xdrmem_getbytes(xdrs, addr, len)
170eae561b3SGarrett Wollman 	register XDR *xdrs;
171eae561b3SGarrett Wollman 	caddr_t addr;
172eae561b3SGarrett Wollman 	register u_int len;
173eae561b3SGarrett Wollman {
174eae561b3SGarrett Wollman 
175eae561b3SGarrett Wollman 	if ((xdrs->x_handy -= len) < 0)
176eae561b3SGarrett Wollman 		return (FALSE);
1771ad08a09SPeter Wemm 	memcpy(addr, xdrs->x_private, len);
178eae561b3SGarrett Wollman 	xdrs->x_private += len;
179eae561b3SGarrett Wollman 	return (TRUE);
180eae561b3SGarrett Wollman }
181eae561b3SGarrett Wollman 
182eae561b3SGarrett Wollman static bool_t
183eae561b3SGarrett Wollman xdrmem_putbytes(xdrs, addr, len)
184eae561b3SGarrett Wollman 	register XDR *xdrs;
185eae561b3SGarrett Wollman 	caddr_t addr;
186eae561b3SGarrett Wollman 	register u_int len;
187eae561b3SGarrett Wollman {
188eae561b3SGarrett Wollman 
189eae561b3SGarrett Wollman 	if ((xdrs->x_handy -= len) < 0)
190eae561b3SGarrett Wollman 		return (FALSE);
1911ad08a09SPeter Wemm 	memcpy(xdrs->x_private, addr, len);
192eae561b3SGarrett Wollman 	xdrs->x_private += len;
193eae561b3SGarrett Wollman 	return (TRUE);
194eae561b3SGarrett Wollman }
195eae561b3SGarrett Wollman 
196eae561b3SGarrett Wollman static u_int
197eae561b3SGarrett Wollman xdrmem_getpos(xdrs)
198eae561b3SGarrett Wollman 	register XDR *xdrs;
199eae561b3SGarrett Wollman {
200eae561b3SGarrett Wollman 
2011ad08a09SPeter Wemm 	/* XXX w/64-bit pointers, u_int not enough! */
2021ad08a09SPeter Wemm 	return ((u_long)xdrs->x_private - (u_long)xdrs->x_base);
203eae561b3SGarrett Wollman }
204eae561b3SGarrett Wollman 
205eae561b3SGarrett Wollman static bool_t
206eae561b3SGarrett Wollman xdrmem_setpos(xdrs, pos)
207eae561b3SGarrett Wollman 	register XDR *xdrs;
208eae561b3SGarrett Wollman 	u_int pos;
209eae561b3SGarrett Wollman {
210eae561b3SGarrett Wollman 	register caddr_t newaddr = xdrs->x_base + pos;
211eae561b3SGarrett Wollman 	register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
212eae561b3SGarrett Wollman 
213eae561b3SGarrett Wollman 	if ((long)newaddr > (long)lastaddr)
214eae561b3SGarrett Wollman 		return (FALSE);
215eae561b3SGarrett Wollman 	xdrs->x_private = newaddr;
2161ad08a09SPeter Wemm 	xdrs->x_handy = (long)lastaddr - (long)newaddr;
217eae561b3SGarrett Wollman 	return (TRUE);
218eae561b3SGarrett Wollman }
219eae561b3SGarrett Wollman 
2201ad08a09SPeter Wemm static int32_t *
2211ad08a09SPeter Wemm xdrmem_inline_aligned(xdrs, len)
222eae561b3SGarrett Wollman 	register XDR *xdrs;
223eae561b3SGarrett Wollman 	int len;
224eae561b3SGarrett Wollman {
2251ad08a09SPeter Wemm 	int32_t *buf = 0;
226eae561b3SGarrett Wollman 
227eae561b3SGarrett Wollman 	if (xdrs->x_handy >= len) {
228eae561b3SGarrett Wollman 		xdrs->x_handy -= len;
2291ad08a09SPeter Wemm 		buf = (int32_t *) xdrs->x_private;
230eae561b3SGarrett Wollman 		xdrs->x_private += len;
231eae561b3SGarrett Wollman 	}
232eae561b3SGarrett Wollman 	return (buf);
233eae561b3SGarrett Wollman }
2341ad08a09SPeter Wemm 
2351ad08a09SPeter Wemm static int32_t *
2361ad08a09SPeter Wemm xdrmem_inline_unaligned(xdrs, len)
2371ad08a09SPeter Wemm 	register XDR *xdrs;
2381ad08a09SPeter Wemm 	int len;
2391ad08a09SPeter Wemm {
2401ad08a09SPeter Wemm 
2411ad08a09SPeter Wemm 	return (0);
2421ad08a09SPeter Wemm }
243