4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
31 * Portions of this source code were derived from Berkeley 4.3 BSD
32 * under license from the Regents of the University of California.
36 * xdr_mem.c, XDR implementation using memory buffers.
38 * If you have some data to be interpreted as external data representation
39 * or to be converted to external data representation in a memory buffer,
40 * then this is the package for you.
43 #include <sys/param.h>
44 #include <sys/types.h>
45 #include <sys/systm.h>
47 #include <rpc/types.h>
50 static struct xdr_ops
*xdrmem_ops(void);
53 * The procedure xdrmem_create initializes a stream descriptor for a
57 xdrmem_create(XDR
*xdrs
, caddr_t addr
, uint_t size
, enum xdr_op op
)
60 xdrs
->x_ops
= xdrmem_ops();
61 xdrs
->x_private
= xdrs
->x_base
= addr
;
63 xdrs
->x_public
= NULL
;
68 xdrmem_destroy(XDR
*xdrs
)
73 xdrmem_getint32(XDR
*xdrs
, int32_t *int32p
)
75 if ((xdrs
->x_handy
-= (int)sizeof (int32_t)) < 0)
77 /* LINTED pointer alignment */
78 *int32p
= (int32_t)ntohl((uint32_t)(*((int32_t *)(xdrs
->x_private
))));
79 xdrs
->x_private
+= sizeof (int32_t);
84 xdrmem_putint32(XDR
*xdrs
, int32_t *int32p
)
86 if ((xdrs
->x_handy
-= (int)sizeof (int32_t)) < 0)
88 /* LINTED pointer alignment */
89 *(int32_t *)xdrs
->x_private
= (int32_t)htonl((uint32_t)(*int32p
));
90 xdrs
->x_private
+= sizeof (int32_t);
95 xdrmem_getbytes(XDR
*xdrs
, caddr_t addr
, int len
)
97 if ((xdrs
->x_handy
-= len
) < 0)
99 bcopy(xdrs
->x_private
, addr
, len
);
100 xdrs
->x_private
+= len
;
105 xdrmem_putbytes(XDR
*xdrs
, caddr_t addr
, int len
)
107 if ((xdrs
->x_handy
-= len
) < 0)
109 bcopy(addr
, xdrs
->x_private
, len
);
110 xdrs
->x_private
+= len
;
115 xdrmem_getpos(XDR
*xdrs
)
117 return ((uint_t
)((uintptr_t)xdrs
->x_private
- (uintptr_t)xdrs
->x_base
));
121 xdrmem_setpos(XDR
*xdrs
, uint_t pos
)
123 caddr_t newaddr
= xdrs
->x_base
+ pos
;
124 caddr_t lastaddr
= xdrs
->x_private
+ xdrs
->x_handy
;
127 if (newaddr
> lastaddr
)
129 xdrs
->x_private
= newaddr
;
130 diff
= lastaddr
- newaddr
;
131 xdrs
->x_handy
= (int)diff
;
135 static rpc_inline_t
*
136 xdrmem_inline(XDR
*xdrs
, int len
)
138 rpc_inline_t
*buf
= NULL
;
140 if (xdrs
->x_handy
>= len
) {
141 xdrs
->x_handy
-= len
;
142 /* LINTED pointer alignment */
143 buf
= (rpc_inline_t
*)xdrs
->x_private
;
144 xdrs
->x_private
+= len
;
150 xdrmem_control(XDR
*xdrs
, int request
, void *info
)
158 case XDR_GET_BYTES_AVAIL
:
159 xptr
= (xdr_bytesrec
*)info
;
160 xptr
->xc_is_last_record
= TRUE
;
161 xptr
->xc_num_avail
= xdrs
->x_handy
;
166 * Return the next 4 byte unit in the XDR stream.
168 if (xdrs
->x_handy
< sizeof (int32_t))
170 int32p
= (int32_t *)info
;
171 *int32p
= (int32_t)ntohl((uint32_t)
172 (*((int32_t *)(xdrs
->x_private
))));
177 * Skip the next N bytes in the XDR stream.
179 int32p
= (int32_t *)info
;
180 len
= RNDUP((int)(*int32p
));
181 if ((xdrs
->x_handy
-= len
) < 0)
183 xdrs
->x_private
+= len
;
190 static struct xdr_ops
*
193 static struct xdr_ops ops
;
195 if (ops
.x_getint32
== NULL
) {
196 ops
.x_getbytes
= xdrmem_getbytes
;
197 ops
.x_putbytes
= xdrmem_putbytes
;
198 ops
.x_getpostn
= xdrmem_getpos
;
199 ops
.x_setpostn
= xdrmem_setpos
;
200 ops
.x_inline
= xdrmem_inline
;
201 ops
.x_destroy
= xdrmem_destroy
;
202 ops
.x_control
= xdrmem_control
;
203 ops
.x_getint32
= xdrmem_getint32
;
204 ops
.x_putint32
= xdrmem_putint32
;