]>
Commit | Line | Data |
---|---|---|
28f540f4 RM |
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. | |
e7fd8a39 | 9 | * |
28f540f4 RM |
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. | |
e7fd8a39 | 13 | * |
28f540f4 RM |
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. | |
e7fd8a39 | 17 | * |
28f540f4 RM |
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. | |
e7fd8a39 | 21 | * |
28f540f4 RM |
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. | |
e7fd8a39 | 25 | * |
28f540f4 RM |
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 | ||
e7fd8a39 UD |
46 | #include <string.h> |
47 | #include <rpc/rpc.h> | |
48 | ||
49 | static bool_t xdrmem_getlong (XDR *, long *); | |
50 | static bool_t xdrmem_putlong (XDR *, long *); | |
51 | static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int); | |
52 | static bool_t xdrmem_putbytes (XDR *, caddr_t, u_int); | |
53 | static u_int xdrmem_getpos (XDR *); | |
54 | static bool_t xdrmem_setpos (XDR *, u_int); | |
55 | static long *xdrmem_inline (XDR *, int); | |
56 | static void xdrmem_destroy (XDR *); | |
57 | ||
58 | static const struct xdr_ops xdrmem_ops = | |
59 | { | |
60 | xdrmem_getlong, | |
61 | xdrmem_putlong, | |
62 | xdrmem_getbytes, | |
63 | xdrmem_putbytes, | |
64 | xdrmem_getpos, | |
65 | xdrmem_setpos, | |
66 | xdrmem_inline, | |
67 | xdrmem_destroy | |
28f540f4 RM |
68 | }; |
69 | ||
70 | /* | |
71 | * The procedure xdrmem_create initializes a stream descriptor for a | |
e7fd8a39 | 72 | * memory buffer. |
28f540f4 RM |
73 | */ |
74 | void | |
e7fd8a39 UD |
75 | xdrmem_create (xdrs, addr, size, op) |
76 | XDR *xdrs; | |
77 | caddr_t addr; | |
78 | u_int size; | |
79 | enum xdr_op op; | |
28f540f4 RM |
80 | { |
81 | ||
e7fd8a39 UD |
82 | xdrs->x_op = op; |
83 | xdrs->x_ops = &xdrmem_ops; | |
84 | xdrs->x_private = xdrs->x_base = addr; | |
85 | xdrs->x_handy = size; | |
28f540f4 RM |
86 | } |
87 | ||
88 | static void | |
e7fd8a39 | 89 | xdrmem_destroy (XDR *xdrs) |
28f540f4 RM |
90 | { |
91 | } | |
92 | ||
93 | static bool_t | |
e7fd8a39 UD |
94 | xdrmem_getlong (xdrs, lp) |
95 | XDR *xdrs; | |
96 | long *lp; | |
28f540f4 RM |
97 | { |
98 | ||
e7fd8a39 UD |
99 | if ((xdrs->x_handy -= 4) < 0) |
100 | return FALSE; | |
101 | *lp = (int32_t) ntohl ((*((int32_t *) (xdrs->x_private)))); | |
102 | xdrs->x_private += 4; | |
103 | return TRUE; | |
28f540f4 RM |
104 | } |
105 | ||
106 | static bool_t | |
e7fd8a39 UD |
107 | xdrmem_putlong (xdrs, lp) |
108 | XDR *xdrs; | |
109 | long *lp; | |
28f540f4 RM |
110 | { |
111 | ||
e7fd8a39 UD |
112 | if ((xdrs->x_handy -= 4) < 0) |
113 | return FALSE; | |
114 | *(int32_t *) xdrs->x_private = htonl (*lp); | |
115 | xdrs->x_private += 4; | |
116 | return TRUE; | |
28f540f4 RM |
117 | } |
118 | ||
119 | static bool_t | |
e7fd8a39 UD |
120 | xdrmem_getbytes (xdrs, addr, len) |
121 | XDR *xdrs; | |
122 | caddr_t addr; | |
123 | u_int len; | |
28f540f4 RM |
124 | { |
125 | ||
e7fd8a39 UD |
126 | if ((xdrs->x_handy -= len) < 0) |
127 | return FALSE; | |
128 | bcopy (xdrs->x_private, addr, len); | |
129 | xdrs->x_private += len; | |
130 | return TRUE; | |
28f540f4 RM |
131 | } |
132 | ||
133 | static bool_t | |
e7fd8a39 UD |
134 | xdrmem_putbytes (xdrs, addr, len) |
135 | XDR *xdrs; | |
136 | caddr_t addr; | |
137 | u_int len; | |
28f540f4 RM |
138 | { |
139 | ||
e7fd8a39 UD |
140 | if ((xdrs->x_handy -= len) < 0) |
141 | return FALSE; | |
142 | bcopy (addr, xdrs->x_private, len); | |
143 | xdrs->x_private += len; | |
144 | return TRUE; | |
28f540f4 RM |
145 | } |
146 | ||
147 | static u_int | |
e7fd8a39 UD |
148 | xdrmem_getpos (xdrs) |
149 | XDR *xdrs; | |
28f540f4 RM |
150 | { |
151 | ||
e7fd8a39 | 152 | return (u_long) xdrs->x_private - (u_long) xdrs->x_base; |
28f540f4 RM |
153 | } |
154 | ||
155 | static bool_t | |
e7fd8a39 UD |
156 | xdrmem_setpos (xdrs, pos) |
157 | XDR *xdrs; | |
158 | u_int pos; | |
28f540f4 | 159 | { |
e7fd8a39 UD |
160 | caddr_t newaddr = xdrs->x_base + pos; |
161 | caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; | |
162 | ||
163 | if ((long) newaddr > (long) lastaddr) | |
164 | return FALSE; | |
165 | xdrs->x_private = newaddr; | |
166 | xdrs->x_handy = (long) lastaddr - (long) newaddr; | |
167 | return TRUE; | |
28f540f4 RM |
168 | } |
169 | ||
170 | static long * | |
e7fd8a39 UD |
171 | xdrmem_inline (xdrs, len) |
172 | XDR *xdrs; | |
173 | int len; | |
28f540f4 | 174 | { |
e7fd8a39 UD |
175 | long *buf = 0; |
176 | ||
177 | if (xdrs->x_handy >= len) | |
178 | { | |
179 | xdrs->x_handy -= len; | |
180 | buf = (long *) xdrs->x_private; | |
181 | xdrs->x_private += len; | |
182 | } | |
183 | return buf; | |
28f540f4 | 184 | } |