xref: /csrg-svn/lib/librpc/rpc/xdr_mem.c (revision 45097)
1*45097Smckusick /* @(#)xdr_mem.c	2.1 88/07/29 4.0 RPCSRC */
2*45097Smckusick /*
3*45097Smckusick  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4*45097Smckusick  * unrestricted use provided that this legend is included on all tape
5*45097Smckusick  * media and as a part of the software program in whole or part.  Users
6*45097Smckusick  * may copy or modify Sun RPC without charge, but are not authorized
7*45097Smckusick  * to license or distribute it to anyone else except as part of a product or
8*45097Smckusick  * program developed by the user.
9*45097Smckusick  *
10*45097Smckusick  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11*45097Smckusick  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12*45097Smckusick  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
13*45097Smckusick  *
14*45097Smckusick  * Sun RPC is provided with no support and without any obligation on the
15*45097Smckusick  * part of Sun Microsystems, Inc. to assist in its use, correction,
16*45097Smckusick  * modification or enhancement.
17*45097Smckusick  *
18*45097Smckusick  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19*45097Smckusick  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20*45097Smckusick  * OR ANY PART THEREOF.
21*45097Smckusick  *
22*45097Smckusick  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23*45097Smckusick  * or profits or other special, indirect and consequential damages, even if
24*45097Smckusick  * Sun has been advised of the possibility of such damages.
25*45097Smckusick  *
26*45097Smckusick  * Sun Microsystems, Inc.
27*45097Smckusick  * 2550 Garcia Avenue
28*45097Smckusick  * Mountain View, California  94043
29*45097Smckusick  */
30*45097Smckusick #if !defined(lint) && defined(SCCSIDS)
31*45097Smckusick static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
32*45097Smckusick #endif
33*45097Smckusick 
34*45097Smckusick /*
35*45097Smckusick  * xdr_mem.h, XDR implementation using memory buffers.
36*45097Smckusick  *
37*45097Smckusick  * Copyright (C) 1984, Sun Microsystems, Inc.
38*45097Smckusick  *
39*45097Smckusick  * If you have some data to be interpreted as external data representation
40*45097Smckusick  * or to be converted to external data representation in a memory buffer,
41*45097Smckusick  * then this is the package for you.
42*45097Smckusick  *
43*45097Smckusick  */
44*45097Smckusick 
45*45097Smckusick 
46*45097Smckusick #include <rpc/types.h>
47*45097Smckusick #include <rpc/xdr.h>
48*45097Smckusick #include <netinet/in.h>
49*45097Smckusick 
50*45097Smckusick static bool_t	xdrmem_getlong();
51*45097Smckusick static bool_t	xdrmem_putlong();
52*45097Smckusick static bool_t	xdrmem_getbytes();
53*45097Smckusick static bool_t	xdrmem_putbytes();
54*45097Smckusick static u_int	xdrmem_getpos();
55*45097Smckusick static bool_t	xdrmem_setpos();
56*45097Smckusick static long *	xdrmem_inline();
57*45097Smckusick static void	xdrmem_destroy();
58*45097Smckusick 
59*45097Smckusick static struct	xdr_ops xdrmem_ops = {
60*45097Smckusick 	xdrmem_getlong,
61*45097Smckusick 	xdrmem_putlong,
62*45097Smckusick 	xdrmem_getbytes,
63*45097Smckusick 	xdrmem_putbytes,
64*45097Smckusick 	xdrmem_getpos,
65*45097Smckusick 	xdrmem_setpos,
66*45097Smckusick 	xdrmem_inline,
67*45097Smckusick 	xdrmem_destroy
68*45097Smckusick };
69*45097Smckusick 
70*45097Smckusick /*
71*45097Smckusick  * The procedure xdrmem_create initializes a stream descriptor for a
72*45097Smckusick  * memory buffer.
73*45097Smckusick  */
74*45097Smckusick void
xdrmem_create(xdrs,addr,size,op)75*45097Smckusick xdrmem_create(xdrs, addr, size, op)
76*45097Smckusick 	register XDR *xdrs;
77*45097Smckusick 	caddr_t addr;
78*45097Smckusick 	u_int size;
79*45097Smckusick 	enum xdr_op op;
80*45097Smckusick {
81*45097Smckusick 
82*45097Smckusick 	xdrs->x_op = op;
83*45097Smckusick 	xdrs->x_ops = &xdrmem_ops;
84*45097Smckusick 	xdrs->x_private = xdrs->x_base = addr;
85*45097Smckusick 	xdrs->x_handy = size;
86*45097Smckusick }
87*45097Smckusick 
88*45097Smckusick static void
xdrmem_destroy()89*45097Smckusick xdrmem_destroy(/*xdrs*/)
90*45097Smckusick 	/*XDR *xdrs;*/
91*45097Smckusick {
92*45097Smckusick }
93*45097Smckusick 
94*45097Smckusick static bool_t
xdrmem_getlong(xdrs,lp)95*45097Smckusick xdrmem_getlong(xdrs, lp)
96*45097Smckusick 	register XDR *xdrs;
97*45097Smckusick 	long *lp;
98*45097Smckusick {
99*45097Smckusick 
100*45097Smckusick 	if ((xdrs->x_handy -= sizeof(long)) < 0)
101*45097Smckusick 		return (FALSE);
102*45097Smckusick 	*lp = (long)ntohl((u_long)(*((long *)(xdrs->x_private))));
103*45097Smckusick 	xdrs->x_private += sizeof(long);
104*45097Smckusick 	return (TRUE);
105*45097Smckusick }
106*45097Smckusick 
107*45097Smckusick static bool_t
xdrmem_putlong(xdrs,lp)108*45097Smckusick xdrmem_putlong(xdrs, lp)
109*45097Smckusick 	register XDR *xdrs;
110*45097Smckusick 	long *lp;
111*45097Smckusick {
112*45097Smckusick 
113*45097Smckusick 	if ((xdrs->x_handy -= sizeof(long)) < 0)
114*45097Smckusick 		return (FALSE);
115*45097Smckusick 	*(long *)xdrs->x_private = (long)htonl((u_long)(*lp));
116*45097Smckusick 	xdrs->x_private += sizeof(long);
117*45097Smckusick 	return (TRUE);
118*45097Smckusick }
119*45097Smckusick 
120*45097Smckusick static bool_t
xdrmem_getbytes(xdrs,addr,len)121*45097Smckusick xdrmem_getbytes(xdrs, addr, len)
122*45097Smckusick 	register XDR *xdrs;
123*45097Smckusick 	caddr_t addr;
124*45097Smckusick 	register u_int len;
125*45097Smckusick {
126*45097Smckusick 
127*45097Smckusick 	if ((xdrs->x_handy -= len) < 0)
128*45097Smckusick 		return (FALSE);
129*45097Smckusick 	bcopy(xdrs->x_private, addr, len);
130*45097Smckusick 	xdrs->x_private += len;
131*45097Smckusick 	return (TRUE);
132*45097Smckusick }
133*45097Smckusick 
134*45097Smckusick static bool_t
xdrmem_putbytes(xdrs,addr,len)135*45097Smckusick xdrmem_putbytes(xdrs, addr, len)
136*45097Smckusick 	register XDR *xdrs;
137*45097Smckusick 	caddr_t addr;
138*45097Smckusick 	register u_int len;
139*45097Smckusick {
140*45097Smckusick 
141*45097Smckusick 	if ((xdrs->x_handy -= len) < 0)
142*45097Smckusick 		return (FALSE);
143*45097Smckusick 	bcopy(addr, xdrs->x_private, len);
144*45097Smckusick 	xdrs->x_private += len;
145*45097Smckusick 	return (TRUE);
146*45097Smckusick }
147*45097Smckusick 
148*45097Smckusick static u_int
xdrmem_getpos(xdrs)149*45097Smckusick xdrmem_getpos(xdrs)
150*45097Smckusick 	register XDR *xdrs;
151*45097Smckusick {
152*45097Smckusick 
153*45097Smckusick 	return ((u_int)xdrs->x_private - (u_int)xdrs->x_base);
154*45097Smckusick }
155*45097Smckusick 
156*45097Smckusick static bool_t
xdrmem_setpos(xdrs,pos)157*45097Smckusick xdrmem_setpos(xdrs, pos)
158*45097Smckusick 	register XDR *xdrs;
159*45097Smckusick 	u_int pos;
160*45097Smckusick {
161*45097Smckusick 	register caddr_t newaddr = xdrs->x_base + pos;
162*45097Smckusick 	register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
163*45097Smckusick 
164*45097Smckusick 	if ((long)newaddr > (long)lastaddr)
165*45097Smckusick 		return (FALSE);
166*45097Smckusick 	xdrs->x_private = newaddr;
167*45097Smckusick 	xdrs->x_handy = (int)lastaddr - (int)newaddr;
168*45097Smckusick 	return (TRUE);
169*45097Smckusick }
170*45097Smckusick 
171*45097Smckusick static long *
xdrmem_inline(xdrs,len)172*45097Smckusick xdrmem_inline(xdrs, len)
173*45097Smckusick 	register XDR *xdrs;
174*45097Smckusick 	int len;
175*45097Smckusick {
176*45097Smckusick 	long *buf = 0;
177*45097Smckusick 
178*45097Smckusick 	if (xdrs->x_handy >= len) {
179*45097Smckusick 		xdrs->x_handy -= len;
180*45097Smckusick 		buf = (long *) xdrs->x_private;
181*45097Smckusick 		xdrs->x_private += len;
182*45097Smckusick 	}
183*45097Smckusick 	return (buf);
184*45097Smckusick }
185