1dfdcada3SDoug Rabson /* $NetBSD: rpcb_prot.c,v 1.3 2000/07/14 08:40:42 fvdl Exp $ */ 2dfdcada3SDoug Rabson 32e322d37SHiroki Sato /*- 4*51369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 5*51369649SPedro F. Giffuni * 62e322d37SHiroki Sato * Copyright (c) 2009, Sun Microsystems, Inc. 72e322d37SHiroki Sato * All rights reserved. 8dfdcada3SDoug Rabson * 92e322d37SHiroki Sato * Redistribution and use in source and binary forms, with or without 102e322d37SHiroki Sato * modification, are permitted provided that the following conditions are met: 112e322d37SHiroki Sato * - Redistributions of source code must retain the above copyright notice, 122e322d37SHiroki Sato * this list of conditions and the following disclaimer. 132e322d37SHiroki Sato * - Redistributions in binary form must reproduce the above copyright notice, 142e322d37SHiroki Sato * this list of conditions and the following disclaimer in the documentation 152e322d37SHiroki Sato * and/or other materials provided with the distribution. 162e322d37SHiroki Sato * - Neither the name of Sun Microsystems, Inc. nor the names of its 172e322d37SHiroki Sato * contributors may be used to endorse or promote products derived 182e322d37SHiroki Sato * from this software without specific prior written permission. 19dfdcada3SDoug Rabson * 202e322d37SHiroki Sato * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 212e322d37SHiroki Sato * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 222e322d37SHiroki Sato * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 232e322d37SHiroki Sato * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 242e322d37SHiroki Sato * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 252e322d37SHiroki Sato * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 262e322d37SHiroki Sato * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 272e322d37SHiroki Sato * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 282e322d37SHiroki Sato * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 292e322d37SHiroki Sato * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 302e322d37SHiroki Sato * POSSIBILITY OF SUCH DAMAGE. 31dfdcada3SDoug Rabson */ 32dfdcada3SDoug Rabson /* 33dfdcada3SDoug Rabson * Copyright (c) 1986-1991 by Sun Microsystems Inc. 34dfdcada3SDoug Rabson */ 35dfdcada3SDoug Rabson 36dfdcada3SDoug Rabson /* #ident "@(#)rpcb_prot.c 1.13 94/04/24 SMI" */ 37dfdcada3SDoug Rabson 38dfdcada3SDoug Rabson #if defined(LIBC_SCCS) && !defined(lint) 39dfdcada3SDoug Rabson static char sccsid[] = "@(#)rpcb_prot.c 1.9 89/04/21 Copyr 1984 Sun Micro"; 40dfdcada3SDoug Rabson #endif 41dfdcada3SDoug Rabson #include <sys/cdefs.h> 42dfdcada3SDoug Rabson __FBSDID("$FreeBSD$"); 43dfdcada3SDoug Rabson 44dfdcada3SDoug Rabson /* 45dfdcada3SDoug Rabson * rpcb_prot.c 46dfdcada3SDoug Rabson * XDR routines for the rpcbinder version 3. 47dfdcada3SDoug Rabson * 48dfdcada3SDoug Rabson * Copyright (C) 1984, 1988, Sun Microsystems, Inc. 49dfdcada3SDoug Rabson */ 50dfdcada3SDoug Rabson 51dfdcada3SDoug Rabson #include <sys/param.h> 52dfdcada3SDoug Rabson #include <sys/systm.h> 53dfdcada3SDoug Rabson #include <sys/kernel.h> 54dfdcada3SDoug Rabson #include <sys/malloc.h> 55dfdcada3SDoug Rabson 56dfdcada3SDoug Rabson #include <rpc/rpc.h> 576448ec89SXin LI #include <rpc/rpc_com.h> 58dfdcada3SDoug Rabson #include <rpc/rpcb_prot.h> 59dfdcada3SDoug Rabson 60dfdcada3SDoug Rabson bool_t 6171066861SDoug Rabson xdr_portmap(XDR *xdrs, struct portmap *regs) 62dfdcada3SDoug Rabson { 63dfdcada3SDoug Rabson 64dfdcada3SDoug Rabson if (xdr_u_long(xdrs, ®s->pm_prog) && 65dfdcada3SDoug Rabson xdr_u_long(xdrs, ®s->pm_vers) && 66dfdcada3SDoug Rabson xdr_u_long(xdrs, ®s->pm_prot)) 67dfdcada3SDoug Rabson return (xdr_u_long(xdrs, ®s->pm_port)); 68dfdcada3SDoug Rabson return (FALSE); 69dfdcada3SDoug Rabson } 70dfdcada3SDoug Rabson 71dfdcada3SDoug Rabson bool_t 72dfdcada3SDoug Rabson xdr_rpcb(XDR *xdrs, RPCB *objp) 73dfdcada3SDoug Rabson { 74dfdcada3SDoug Rabson if (!xdr_uint32_t(xdrs, &objp->r_prog)) { 75dfdcada3SDoug Rabson return (FALSE); 76dfdcada3SDoug Rabson } 77dfdcada3SDoug Rabson if (!xdr_uint32_t(xdrs, &objp->r_vers)) { 78dfdcada3SDoug Rabson return (FALSE); 79dfdcada3SDoug Rabson } 806448ec89SXin LI if (!xdr_string(xdrs, &objp->r_netid, RPC_MAXDATASIZE)) { 81dfdcada3SDoug Rabson return (FALSE); 82dfdcada3SDoug Rabson } 836448ec89SXin LI if (!xdr_string(xdrs, &objp->r_addr, RPC_MAXDATASIZE)) { 84dfdcada3SDoug Rabson return (FALSE); 85dfdcada3SDoug Rabson } 866448ec89SXin LI if (!xdr_string(xdrs, &objp->r_owner, RPC_MAXDATASIZE)) { 87dfdcada3SDoug Rabson return (FALSE); 88dfdcada3SDoug Rabson } 89dfdcada3SDoug Rabson return (TRUE); 90dfdcada3SDoug Rabson } 91dfdcada3SDoug Rabson 92dfdcada3SDoug Rabson /* 93dfdcada3SDoug Rabson * rpcblist_ptr implements a linked list. The RPCL definition from 94dfdcada3SDoug Rabson * rpcb_prot.x is: 95dfdcada3SDoug Rabson * 96dfdcada3SDoug Rabson * struct rpcblist { 97dfdcada3SDoug Rabson * rpcb rpcb_map; 98dfdcada3SDoug Rabson * struct rpcblist *rpcb_next; 99dfdcada3SDoug Rabson * }; 100dfdcada3SDoug Rabson * typedef rpcblist *rpcblist_ptr; 101dfdcada3SDoug Rabson * 102dfdcada3SDoug Rabson * Recall that "pointers" in XDR are encoded as a boolean, indicating whether 103dfdcada3SDoug Rabson * there's any data behind the pointer, followed by the data (if any exists). 104dfdcada3SDoug Rabson * The boolean can be interpreted as ``more data follows me''; if FALSE then 105dfdcada3SDoug Rabson * nothing follows the boolean; if TRUE then the boolean is followed by an 106dfdcada3SDoug Rabson * actual struct rpcb, and another rpcblist_ptr (declared in RPCL as "struct 107dfdcada3SDoug Rabson * rpcblist *"). 108dfdcada3SDoug Rabson * 109dfdcada3SDoug Rabson * This could be implemented via the xdr_pointer type, though this would 110dfdcada3SDoug Rabson * result in one recursive call per element in the list. Rather than do that 111dfdcada3SDoug Rabson * we can ``unwind'' the recursion into a while loop and use xdr_reference to 112dfdcada3SDoug Rabson * serialize the rpcb elements. 113dfdcada3SDoug Rabson */ 114dfdcada3SDoug Rabson 115dfdcada3SDoug Rabson bool_t 116dfdcada3SDoug Rabson xdr_rpcblist_ptr(XDR *xdrs, rpcblist_ptr *rp) 117dfdcada3SDoug Rabson { 118dfdcada3SDoug Rabson /* 119dfdcada3SDoug Rabson * more_elements is pre-computed in case the direction is 120dfdcada3SDoug Rabson * XDR_ENCODE or XDR_FREE. more_elements is overwritten by 121dfdcada3SDoug Rabson * xdr_bool when the direction is XDR_DECODE. 122dfdcada3SDoug Rabson */ 123dfdcada3SDoug Rabson bool_t more_elements; 124dfdcada3SDoug Rabson int freeing = (xdrs->x_op == XDR_FREE); 125dfdcada3SDoug Rabson rpcblist_ptr next; 126dfdcada3SDoug Rabson rpcblist_ptr next_copy; 127dfdcada3SDoug Rabson 128dfdcada3SDoug Rabson next = NULL; 129dfdcada3SDoug Rabson for (;;) { 130dfdcada3SDoug Rabson more_elements = (bool_t)(*rp != NULL); 131dfdcada3SDoug Rabson if (! xdr_bool(xdrs, &more_elements)) { 132dfdcada3SDoug Rabson return (FALSE); 133dfdcada3SDoug Rabson } 134dfdcada3SDoug Rabson if (! more_elements) { 135dfdcada3SDoug Rabson return (TRUE); /* we are done */ 136dfdcada3SDoug Rabson } 137dfdcada3SDoug Rabson /* 138dfdcada3SDoug Rabson * the unfortunate side effect of non-recursion is that in 139dfdcada3SDoug Rabson * the case of freeing we must remember the next object 140dfdcada3SDoug Rabson * before we free the current object ... 141dfdcada3SDoug Rabson */ 142dfdcada3SDoug Rabson if (freeing && *rp) 143dfdcada3SDoug Rabson next = (*rp)->rpcb_next; 144dfdcada3SDoug Rabson if (! xdr_reference(xdrs, (caddr_t *)rp, 145dfdcada3SDoug Rabson (u_int)sizeof (RPCBLIST), (xdrproc_t)xdr_rpcb)) { 146dfdcada3SDoug Rabson return (FALSE); 147dfdcada3SDoug Rabson } 148dfdcada3SDoug Rabson if (freeing) { 149dfdcada3SDoug Rabson next_copy = next; 150dfdcada3SDoug Rabson rp = &next_copy; 151dfdcada3SDoug Rabson /* 152dfdcada3SDoug Rabson * Note that in the subsequent iteration, next_copy 153dfdcada3SDoug Rabson * gets nulled out by the xdr_reference 154dfdcada3SDoug Rabson * but next itself survives. 155dfdcada3SDoug Rabson */ 156dfdcada3SDoug Rabson } else if (*rp) { 157dfdcada3SDoug Rabson rp = &((*rp)->rpcb_next); 158dfdcada3SDoug Rabson } 159dfdcada3SDoug Rabson } 160dfdcada3SDoug Rabson /*NOTREACHED*/ 161dfdcada3SDoug Rabson } 162dfdcada3SDoug Rabson 163dfdcada3SDoug Rabson #if 0 164dfdcada3SDoug Rabson /* 165dfdcada3SDoug Rabson * xdr_rpcblist() is specified to take a RPCBLIST **, but is identical in 166dfdcada3SDoug Rabson * functionality to xdr_rpcblist_ptr(). 167dfdcada3SDoug Rabson */ 168dfdcada3SDoug Rabson bool_t 169dfdcada3SDoug Rabson xdr_rpcblist(XDR *xdrs, RPCBLIST **rp) 170dfdcada3SDoug Rabson { 171dfdcada3SDoug Rabson bool_t dummy; 172dfdcada3SDoug Rabson 173dfdcada3SDoug Rabson dummy = xdr_rpcblist_ptr(xdrs, (rpcblist_ptr *)rp); 174dfdcada3SDoug Rabson return (dummy); 175dfdcada3SDoug Rabson } 176dfdcada3SDoug Rabson #endif 177dfdcada3SDoug Rabson 178dfdcada3SDoug Rabson bool_t 179dfdcada3SDoug Rabson xdr_rpcb_entry(XDR *xdrs, rpcb_entry *objp) 180dfdcada3SDoug Rabson { 1816448ec89SXin LI if (!xdr_string(xdrs, &objp->r_maddr, RPC_MAXDATASIZE)) { 182dfdcada3SDoug Rabson return (FALSE); 183dfdcada3SDoug Rabson } 1846448ec89SXin LI if (!xdr_string(xdrs, &objp->r_nc_netid, RPC_MAXDATASIZE)) { 185dfdcada3SDoug Rabson return (FALSE); 186dfdcada3SDoug Rabson } 187dfdcada3SDoug Rabson if (!xdr_uint32_t(xdrs, &objp->r_nc_semantics)) { 188dfdcada3SDoug Rabson return (FALSE); 189dfdcada3SDoug Rabson } 1906448ec89SXin LI if (!xdr_string(xdrs, &objp->r_nc_protofmly, RPC_MAXDATASIZE)) { 191dfdcada3SDoug Rabson return (FALSE); 192dfdcada3SDoug Rabson } 1936448ec89SXin LI if (!xdr_string(xdrs, &objp->r_nc_proto, RPC_MAXDATASIZE)) { 194dfdcada3SDoug Rabson return (FALSE); 195dfdcada3SDoug Rabson } 196dfdcada3SDoug Rabson return (TRUE); 197dfdcada3SDoug Rabson } 198dfdcada3SDoug Rabson 199dfdcada3SDoug Rabson bool_t 200dfdcada3SDoug Rabson xdr_rpcb_entry_list_ptr(XDR *xdrs, rpcb_entry_list_ptr *rp) 201dfdcada3SDoug Rabson { 202dfdcada3SDoug Rabson /* 203dfdcada3SDoug Rabson * more_elements is pre-computed in case the direction is 204dfdcada3SDoug Rabson * XDR_ENCODE or XDR_FREE. more_elements is overwritten by 205dfdcada3SDoug Rabson * xdr_bool when the direction is XDR_DECODE. 206dfdcada3SDoug Rabson */ 207dfdcada3SDoug Rabson bool_t more_elements; 208dfdcada3SDoug Rabson int freeing = (xdrs->x_op == XDR_FREE); 209dfdcada3SDoug Rabson rpcb_entry_list_ptr next; 210dfdcada3SDoug Rabson rpcb_entry_list_ptr next_copy; 211dfdcada3SDoug Rabson 212dfdcada3SDoug Rabson next = NULL; 213dfdcada3SDoug Rabson for (;;) { 214dfdcada3SDoug Rabson more_elements = (bool_t)(*rp != NULL); 215dfdcada3SDoug Rabson if (! xdr_bool(xdrs, &more_elements)) { 216dfdcada3SDoug Rabson return (FALSE); 217dfdcada3SDoug Rabson } 218dfdcada3SDoug Rabson if (! more_elements) { 219dfdcada3SDoug Rabson return (TRUE); /* we are done */ 220dfdcada3SDoug Rabson } 221dfdcada3SDoug Rabson /* 222dfdcada3SDoug Rabson * the unfortunate side effect of non-recursion is that in 223dfdcada3SDoug Rabson * the case of freeing we must remember the next object 224dfdcada3SDoug Rabson * before we free the current object ... 225dfdcada3SDoug Rabson */ 226dfdcada3SDoug Rabson if (freeing) 227dfdcada3SDoug Rabson next = (*rp)->rpcb_entry_next; 228dfdcada3SDoug Rabson if (! xdr_reference(xdrs, (caddr_t *)rp, 229dfdcada3SDoug Rabson (u_int)sizeof (rpcb_entry_list), 230dfdcada3SDoug Rabson (xdrproc_t)xdr_rpcb_entry)) { 231dfdcada3SDoug Rabson return (FALSE); 232dfdcada3SDoug Rabson } 233dfdcada3SDoug Rabson if (freeing && *rp) { 234dfdcada3SDoug Rabson next_copy = next; 235dfdcada3SDoug Rabson rp = &next_copy; 236dfdcada3SDoug Rabson /* 237dfdcada3SDoug Rabson * Note that in the subsequent iteration, next_copy 238dfdcada3SDoug Rabson * gets nulled out by the xdr_reference 239dfdcada3SDoug Rabson * but next itself survives. 240dfdcada3SDoug Rabson */ 241dfdcada3SDoug Rabson } else if (*rp) { 242dfdcada3SDoug Rabson rp = &((*rp)->rpcb_entry_next); 243dfdcada3SDoug Rabson } 244dfdcada3SDoug Rabson } 245dfdcada3SDoug Rabson /*NOTREACHED*/ 246dfdcada3SDoug Rabson } 247