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