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