1 /* $NetBSD: rpc_callmsg.c,v 1.16 2000/07/14 08:40:42 fvdl Exp $ */
4 * Copyright (c) 2009, Sun Microsystems, Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 * - Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * - Neither the name of Sun Microsystems, Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
31 #if defined(LIBC_SCCS) && !defined(lint)
32 static char *sccsid2
= "@(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro";
33 static char *sccsid
= "@(#)rpc_callmsg.c 2.1 88/07/29 4.0 RPCSRC";
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
41 * Copyright (C) 1984, Sun Microsystems, Inc.
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/malloc.h>
55 xdr_callmsg(XDR
*xdrs
, struct rpc_msg
*cmsg
)
57 enum msg_type
*prm_direction
;
59 struct opaque_auth
*oa
;
61 if (xdrs
->x_op
== XDR_ENCODE
) {
62 if (cmsg
->rm_call
.cb_cred
.oa_length
> MAX_AUTH_BYTES
) {
65 if (cmsg
->rm_call
.cb_verf
.oa_length
> MAX_AUTH_BYTES
) {
68 buf
= XDR_INLINE(xdrs
, 8 * BYTES_PER_XDR_UNIT
69 + RNDUP(cmsg
->rm_call
.cb_cred
.oa_length
)
70 + 2 * BYTES_PER_XDR_UNIT
71 + RNDUP(cmsg
->rm_call
.cb_verf
.oa_length
));
73 IXDR_PUT_INT32(buf
, cmsg
->rm_xid
);
74 IXDR_PUT_ENUM(buf
, cmsg
->rm_direction
);
75 if (cmsg
->rm_direction
!= CALL
) {
78 IXDR_PUT_INT32(buf
, cmsg
->rm_call
.cb_rpcvers
);
79 if (cmsg
->rm_call
.cb_rpcvers
!= RPC_MSG_VERSION
) {
82 IXDR_PUT_INT32(buf
, cmsg
->rm_call
.cb_prog
);
83 IXDR_PUT_INT32(buf
, cmsg
->rm_call
.cb_vers
);
84 IXDR_PUT_INT32(buf
, cmsg
->rm_call
.cb_proc
);
85 oa
= &cmsg
->rm_call
.cb_cred
;
86 IXDR_PUT_ENUM(buf
, oa
->oa_flavor
);
87 IXDR_PUT_INT32(buf
, oa
->oa_length
);
89 memcpy(buf
, oa
->oa_base
, oa
->oa_length
);
90 buf
+= RNDUP(oa
->oa_length
) / sizeof (int32_t);
92 oa
= &cmsg
->rm_call
.cb_verf
;
93 IXDR_PUT_ENUM(buf
, oa
->oa_flavor
);
94 IXDR_PUT_INT32(buf
, oa
->oa_length
);
96 memcpy(buf
, oa
->oa_base
, oa
->oa_length
);
98 buf += RNDUP(oa->oa_length) / sizeof (int32_t);
104 if (xdrs
->x_op
== XDR_DECODE
) {
105 buf
= XDR_INLINE(xdrs
, 8 * BYTES_PER_XDR_UNIT
);
107 cmsg
->rm_xid
= IXDR_GET_UINT32(buf
);
108 cmsg
->rm_direction
= IXDR_GET_ENUM(buf
, enum msg_type
);
109 if (cmsg
->rm_direction
!= CALL
) {
112 cmsg
->rm_call
.cb_rpcvers
= IXDR_GET_UINT32(buf
);
113 if (cmsg
->rm_call
.cb_rpcvers
!= RPC_MSG_VERSION
) {
116 cmsg
->rm_call
.cb_prog
= IXDR_GET_UINT32(buf
);
117 cmsg
->rm_call
.cb_vers
= IXDR_GET_UINT32(buf
);
118 cmsg
->rm_call
.cb_proc
= IXDR_GET_UINT32(buf
);
119 oa
= &cmsg
->rm_call
.cb_cred
;
120 oa
->oa_flavor
= IXDR_GET_ENUM(buf
, enum_t
);
121 oa
->oa_length
= (u_int
)IXDR_GET_UINT32(buf
);
123 if (oa
->oa_length
> MAX_AUTH_BYTES
) {
126 if (oa
->oa_base
== NULL
) {
127 oa
->oa_base
= (caddr_t
)
128 mem_alloc(oa
->oa_length
);
129 if (oa
->oa_base
== NULL
)
132 buf
= XDR_INLINE(xdrs
, RNDUP(oa
->oa_length
));
134 if (xdr_opaque(xdrs
, oa
->oa_base
,
135 oa
->oa_length
) == FALSE
) {
139 memcpy(oa
->oa_base
, buf
,
142 buf += RNDUP(oa->oa_length) /
147 oa
= &cmsg
->rm_call
.cb_verf
;
148 buf
= XDR_INLINE(xdrs
, 2 * BYTES_PER_XDR_UNIT
);
150 if (xdr_enum(xdrs
, &oa
->oa_flavor
) == FALSE
||
151 xdr_u_int(xdrs
, &oa
->oa_length
) == FALSE
) {
155 oa
->oa_flavor
= IXDR_GET_ENUM(buf
, enum_t
);
156 oa
->oa_length
= (u_int
)IXDR_GET_UINT32(buf
);
159 if (oa
->oa_length
> MAX_AUTH_BYTES
) {
162 if (oa
->oa_base
== NULL
) {
163 oa
->oa_base
= (caddr_t
)
164 mem_alloc(oa
->oa_length
);
165 if (oa
->oa_base
== NULL
)
168 buf
= XDR_INLINE(xdrs
, RNDUP(oa
->oa_length
));
170 if (xdr_opaque(xdrs
, oa
->oa_base
,
171 oa
->oa_length
) == FALSE
) {
175 memcpy(oa
->oa_base
, buf
,
178 buf += RNDUP(oa->oa_length) /
186 prm_direction
= &cmsg
->rm_direction
;
188 xdr_uint32_t(xdrs
, &(cmsg
->rm_xid
)) &&
189 xdr_enum(xdrs
, (enum_t
*) prm_direction
) &&
190 (cmsg
->rm_direction
== CALL
) &&
191 xdr_uint32_t(xdrs
, &(cmsg
->rm_call
.cb_rpcvers
)) &&
192 (cmsg
->rm_call
.cb_rpcvers
== RPC_MSG_VERSION
) &&
193 xdr_uint32_t(xdrs
, &(cmsg
->rm_call
.cb_prog
)) &&
194 xdr_uint32_t(xdrs
, &(cmsg
->rm_call
.cb_vers
)) &&
195 xdr_uint32_t(xdrs
, &(cmsg
->rm_call
.cb_proc
)) &&
196 xdr_opaque_auth(xdrs
, &(cmsg
->rm_call
.cb_cred
)) )
197 return (xdr_opaque_auth(xdrs
, &(cmsg
->rm_call
.cb_verf
)));