1 /*
2 * CDDL HEADER START
3 *
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
7 * with the License.
8 *
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.
13 *
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]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30 /*
31 * Portions of this source code were derived from Berkeley 4.3 BSD
32 * under license from the Regents of the University of California.
33 */
34
35 /*
36 * rpcb_prot.c
37 * XDR routines for the rpcbinder version 3.
38 */
39
40 #pragma ident "%Z%%M% %I% %E% SMI"
41
42 #if !defined(lint) && defined(SCCSIDS)
43 static char sccsid[] = "@(#)rpcb_prot.c 1.9 89/04/21 Copyr 1984 Sun Micro";
44 #endif
45
46
47 #include <rpc/rpc.h>
48 #include <rpc/types.h>
49 #include <rpc/xdr.h>
50 #include <rpc/rpcb_prot.h>
51
52
53 bool_t
xdr_rpcb(XDR * xdrs,RPCB * objp)54 xdr_rpcb(XDR *xdrs, RPCB *objp)
55 {
56 if (!xdr_rpcprog(xdrs, &objp->r_prog))
57 return (FALSE);
58 if (!xdr_rpcvers(xdrs, &objp->r_vers))
59 return (FALSE);
60 if (!xdr_string(xdrs, &objp->r_netid, ~0))
61 return (FALSE);
62 if (!xdr_string(xdrs, &objp->r_addr, ~0))
63 return (FALSE);
64 if (!xdr_string(xdrs, &objp->r_owner, ~0))
65 return (FALSE);
66 return (TRUE);
67 }
68
69 /*
70 * XDR remote call arguments
71 * written for XDR_ENCODE direction only
72 */
73 bool_t
xdr_rpcb_rmtcallargs(XDR * xdrs,struct rpcb_rmtcallargs * objp)74 xdr_rpcb_rmtcallargs(XDR *xdrs, struct rpcb_rmtcallargs *objp)
75 {
76 u_int lenposition, argposition, position;
77
78 if (!xdr_rpcprog(xdrs, &objp->prog))
79 return (FALSE);
80 if (!xdr_rpcvers(xdrs, &objp->vers))
81 return (FALSE);
82 if (!xdr_rpcproc(xdrs, &objp->proc))
83 return (FALSE);
84 /*
85 * All the jugglery for just getting the size of the arguments
86 */
87 lenposition = XDR_GETPOS(xdrs);
88 if (!xdr_u_int(xdrs, &(objp->arglen)))
89 return (FALSE);
90 argposition = XDR_GETPOS(xdrs);
91 if (!(*(objp->xdr_args))(xdrs, objp->args_ptr))
92 return (FALSE);
93 position = XDR_GETPOS(xdrs);
94 objp->arglen = (u_int)position - (u_int)argposition;
95 XDR_SETPOS(xdrs, lenposition);
96 if (!xdr_u_int(xdrs, &(objp->arglen)))
97 return (FALSE);
98 XDR_SETPOS(xdrs, position);
99 return (TRUE);
100 }
101
102 /*
103 * XDR remote call results
104 * written for XDR_DECODE direction only
105 */
106 bool_t
xdr_rpcb_rmtcallres(XDR * xdrs,struct rpcb_rmtcallres * objp)107 xdr_rpcb_rmtcallres(XDR *xdrs, struct rpcb_rmtcallres *objp)
108 {
109 if (!xdr_string(xdrs, &objp->addr_ptr, ~0))
110 return (FALSE);
111 if (!xdr_u_int(xdrs, &objp->resultslen))
112 return (FALSE);
113 return ((*(objp->xdr_results))(xdrs, objp->results_ptr));
114 }
115
116 bool_t
xdr_netbuf(XDR * xdrs,struct netbuf * objp)117 xdr_netbuf(XDR *xdrs, struct netbuf *objp)
118 {
119 /*
120 * If we're decoding and the caller has already allocated a buffer,
121 * throw away maxlen, since it doesn't apply to the caller's
122 * buffer. xdr_bytes will return an error if the buffer isn't big
123 * enough.
124 */
125 if (xdrs->x_op == XDR_DECODE && objp->buf != NULL) {
126 u_int maxlen;
127
128 if (!xdr_u_int(xdrs, &maxlen))
129 return (FALSE);
130 } else {
131 if (!xdr_u_int(xdrs, (u_int *)&objp->maxlen))
132 return (FALSE);
133 }
134 return (xdr_bytes(xdrs, (char **)&(objp->buf),
135 (u_int *)&(objp->len), objp->maxlen));
136 }
137