1dfdcada3SDoug Rabson /* $NetBSD: rpcb_prot.c,v 1.3 2000/07/14 08:40:42 fvdl Exp $ */ 2dfdcada3SDoug Rabson 3dfdcada3SDoug Rabson /* 4dfdcada3SDoug Rabson * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 5dfdcada3SDoug Rabson * unrestricted use provided that this legend is included on all tape 6dfdcada3SDoug Rabson * media and as a part of the software program in whole or part. Users 7dfdcada3SDoug Rabson * may copy or modify Sun RPC without charge, but are not authorized 8dfdcada3SDoug Rabson * to license or distribute it to anyone else except as part of a product or 9dfdcada3SDoug Rabson * program developed by the user. 10dfdcada3SDoug Rabson * 11dfdcada3SDoug Rabson * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 12dfdcada3SDoug Rabson * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 13dfdcada3SDoug Rabson * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 14dfdcada3SDoug Rabson * 15dfdcada3SDoug Rabson * Sun RPC is provided with no support and without any obligation on the 16dfdcada3SDoug Rabson * part of Sun Microsystems, Inc. to assist in its use, correction, 17dfdcada3SDoug Rabson * modification or enhancement. 18dfdcada3SDoug Rabson * 19dfdcada3SDoug Rabson * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 20dfdcada3SDoug Rabson * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 21dfdcada3SDoug Rabson * OR ANY PART THEREOF. 22dfdcada3SDoug Rabson * 23dfdcada3SDoug Rabson * In no event will Sun Microsystems, Inc. be liable for any lost revenue 24dfdcada3SDoug Rabson * or profits or other special, indirect and consequential damages, even if 25dfdcada3SDoug Rabson * Sun has been advised of the possibility of such damages. 26dfdcada3SDoug Rabson * 27dfdcada3SDoug Rabson * Sun Microsystems, Inc. 28dfdcada3SDoug Rabson * 2550 Garcia Avenue 29dfdcada3SDoug Rabson * Mountain View, California 94043 30dfdcada3SDoug Rabson */ 31dfdcada3SDoug Rabson /* 32dfdcada3SDoug Rabson * Copyright (c) 1986-1991 by Sun Microsystems Inc. 33dfdcada3SDoug Rabson */ 34dfdcada3SDoug Rabson 35dfdcada3SDoug Rabson /* #ident "@(#)rpcb_prot.c 1.13 94/04/24 SMI" */ 36dfdcada3SDoug Rabson 37dfdcada3SDoug Rabson #if defined(LIBC_SCCS) && !defined(lint) 38dfdcada3SDoug Rabson static char sccsid[] = "@(#)rpcb_prot.c 1.9 89/04/21 Copyr 1984 Sun Micro"; 39dfdcada3SDoug Rabson #endif 40dfdcada3SDoug Rabson #include <sys/cdefs.h> 41dfdcada3SDoug Rabson __FBSDID("$FreeBSD$"); 42dfdcada3SDoug Rabson 43dfdcada3SDoug Rabson /* 44dfdcada3SDoug Rabson * rpcb_prot.c 45dfdcada3SDoug Rabson * XDR routines for the rpcbinder version 3. 46dfdcada3SDoug Rabson * 47dfdcada3SDoug Rabson * Copyright (C) 1984, 1988, Sun Microsystems, Inc. 48dfdcada3SDoug Rabson */ 49dfdcada3SDoug Rabson 50dfdcada3SDoug Rabson #include <sys/param.h> 51dfdcada3SDoug Rabson #include <sys/systm.h> 52dfdcada3SDoug Rabson #include <sys/kernel.h> 53dfdcada3SDoug Rabson #include <sys/malloc.h> 54dfdcada3SDoug Rabson 55dfdcada3SDoug Rabson #include <rpc/rpc.h> 56dfdcada3SDoug Rabson #include <rpc/rpcb_prot.h> 57dfdcada3SDoug Rabson 58dfdcada3SDoug Rabson bool_t 59dfdcada3SDoug Rabson xdr_pmap(XDR *xdrs, struct pmap *regs) 60dfdcada3SDoug Rabson { 61dfdcada3SDoug Rabson 62dfdcada3SDoug Rabson if (xdr_u_long(xdrs, ®s->pm_prog) && 63dfdcada3SDoug Rabson xdr_u_long(xdrs, ®s->pm_vers) && 64dfdcada3SDoug Rabson xdr_u_long(xdrs, ®s->pm_prot)) 65dfdcada3SDoug Rabson return (xdr_u_long(xdrs, ®s->pm_port)); 66dfdcada3SDoug Rabson return (FALSE); 67dfdcada3SDoug Rabson } 68dfdcada3SDoug Rabson 69dfdcada3SDoug Rabson bool_t 70dfdcada3SDoug Rabson xdr_rpcb(XDR *xdrs, RPCB *objp) 71dfdcada3SDoug Rabson { 72dfdcada3SDoug Rabson if (!xdr_uint32_t(xdrs, &objp->r_prog)) { 73dfdcada3SDoug Rabson return (FALSE); 74dfdcada3SDoug Rabson } 75dfdcada3SDoug Rabson if (!xdr_uint32_t(xdrs, &objp->r_vers)) { 76dfdcada3SDoug Rabson return (FALSE); 77dfdcada3SDoug Rabson } 78dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_netid, (u_int)~0)) { 79dfdcada3SDoug Rabson return (FALSE); 80dfdcada3SDoug Rabson } 81dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_addr, (u_int)~0)) { 82dfdcada3SDoug Rabson return (FALSE); 83dfdcada3SDoug Rabson } 84dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_owner, (u_int)~0)) { 85dfdcada3SDoug Rabson return (FALSE); 86dfdcada3SDoug Rabson } 87dfdcada3SDoug Rabson return (TRUE); 88dfdcada3SDoug Rabson } 89dfdcada3SDoug Rabson 90dfdcada3SDoug Rabson /* 91dfdcada3SDoug Rabson * rpcblist_ptr implements a linked list. The RPCL definition from 92dfdcada3SDoug Rabson * rpcb_prot.x is: 93dfdcada3SDoug Rabson * 94dfdcada3SDoug Rabson * struct rpcblist { 95dfdcada3SDoug Rabson * rpcb rpcb_map; 96dfdcada3SDoug Rabson * struct rpcblist *rpcb_next; 97dfdcada3SDoug Rabson * }; 98dfdcada3SDoug Rabson * typedef rpcblist *rpcblist_ptr; 99dfdcada3SDoug Rabson * 100dfdcada3SDoug Rabson * Recall that "pointers" in XDR are encoded as a boolean, indicating whether 101dfdcada3SDoug Rabson * there's any data behind the pointer, followed by the data (if any exists). 102dfdcada3SDoug Rabson * The boolean can be interpreted as ``more data follows me''; if FALSE then 103dfdcada3SDoug Rabson * nothing follows the boolean; if TRUE then the boolean is followed by an 104dfdcada3SDoug Rabson * actual struct rpcb, and another rpcblist_ptr (declared in RPCL as "struct 105dfdcada3SDoug Rabson * rpcblist *"). 106dfdcada3SDoug Rabson * 107dfdcada3SDoug Rabson * This could be implemented via the xdr_pointer type, though this would 108dfdcada3SDoug Rabson * result in one recursive call per element in the list. Rather than do that 109dfdcada3SDoug Rabson * we can ``unwind'' the recursion into a while loop and use xdr_reference to 110dfdcada3SDoug Rabson * serialize the rpcb elements. 111dfdcada3SDoug Rabson */ 112dfdcada3SDoug Rabson 113dfdcada3SDoug Rabson bool_t 114dfdcada3SDoug Rabson xdr_rpcblist_ptr(XDR *xdrs, rpcblist_ptr *rp) 115dfdcada3SDoug Rabson { 116dfdcada3SDoug Rabson /* 117dfdcada3SDoug Rabson * more_elements is pre-computed in case the direction is 118dfdcada3SDoug Rabson * XDR_ENCODE or XDR_FREE. more_elements is overwritten by 119dfdcada3SDoug Rabson * xdr_bool when the direction is XDR_DECODE. 120dfdcada3SDoug Rabson */ 121dfdcada3SDoug Rabson bool_t more_elements; 122dfdcada3SDoug Rabson int freeing = (xdrs->x_op == XDR_FREE); 123dfdcada3SDoug Rabson rpcblist_ptr next; 124dfdcada3SDoug Rabson rpcblist_ptr next_copy; 125dfdcada3SDoug Rabson 126dfdcada3SDoug Rabson next = NULL; 127dfdcada3SDoug Rabson for (;;) { 128dfdcada3SDoug Rabson more_elements = (bool_t)(*rp != NULL); 129dfdcada3SDoug Rabson if (! xdr_bool(xdrs, &more_elements)) { 130dfdcada3SDoug Rabson return (FALSE); 131dfdcada3SDoug Rabson } 132dfdcada3SDoug Rabson if (! more_elements) { 133dfdcada3SDoug Rabson return (TRUE); /* we are done */ 134dfdcada3SDoug Rabson } 135dfdcada3SDoug Rabson /* 136dfdcada3SDoug Rabson * the unfortunate side effect of non-recursion is that in 137dfdcada3SDoug Rabson * the case of freeing we must remember the next object 138dfdcada3SDoug Rabson * before we free the current object ... 139dfdcada3SDoug Rabson */ 140dfdcada3SDoug Rabson if (freeing && *rp) 141dfdcada3SDoug Rabson next = (*rp)->rpcb_next; 142dfdcada3SDoug Rabson if (! xdr_reference(xdrs, (caddr_t *)rp, 143dfdcada3SDoug Rabson (u_int)sizeof (RPCBLIST), (xdrproc_t)xdr_rpcb)) { 144dfdcada3SDoug Rabson return (FALSE); 145dfdcada3SDoug Rabson } 146dfdcada3SDoug Rabson if (freeing) { 147dfdcada3SDoug Rabson next_copy = next; 148dfdcada3SDoug Rabson rp = &next_copy; 149dfdcada3SDoug Rabson /* 150dfdcada3SDoug Rabson * Note that in the subsequent iteration, next_copy 151dfdcada3SDoug Rabson * gets nulled out by the xdr_reference 152dfdcada3SDoug Rabson * but next itself survives. 153dfdcada3SDoug Rabson */ 154dfdcada3SDoug Rabson } else if (*rp) { 155dfdcada3SDoug Rabson rp = &((*rp)->rpcb_next); 156dfdcada3SDoug Rabson } 157dfdcada3SDoug Rabson } 158dfdcada3SDoug Rabson /*NOTREACHED*/ 159dfdcada3SDoug Rabson } 160dfdcada3SDoug Rabson 161dfdcada3SDoug Rabson #if 0 162dfdcada3SDoug Rabson /* 163dfdcada3SDoug Rabson * xdr_rpcblist() is specified to take a RPCBLIST **, but is identical in 164dfdcada3SDoug Rabson * functionality to xdr_rpcblist_ptr(). 165dfdcada3SDoug Rabson */ 166dfdcada3SDoug Rabson bool_t 167dfdcada3SDoug Rabson xdr_rpcblist(XDR *xdrs, RPCBLIST **rp) 168dfdcada3SDoug Rabson { 169dfdcada3SDoug Rabson bool_t dummy; 170dfdcada3SDoug Rabson 171dfdcada3SDoug Rabson dummy = xdr_rpcblist_ptr(xdrs, (rpcblist_ptr *)rp); 172dfdcada3SDoug Rabson return (dummy); 173dfdcada3SDoug Rabson } 174dfdcada3SDoug Rabson #endif 175dfdcada3SDoug Rabson 176dfdcada3SDoug Rabson bool_t 177dfdcada3SDoug Rabson xdr_rpcb_entry(XDR *xdrs, rpcb_entry *objp) 178dfdcada3SDoug Rabson { 179dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_maddr, (u_int)~0)) { 180dfdcada3SDoug Rabson return (FALSE); 181dfdcada3SDoug Rabson } 182dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_nc_netid, (u_int)~0)) { 183dfdcada3SDoug Rabson return (FALSE); 184dfdcada3SDoug Rabson } 185dfdcada3SDoug Rabson if (!xdr_uint32_t(xdrs, &objp->r_nc_semantics)) { 186dfdcada3SDoug Rabson return (FALSE); 187dfdcada3SDoug Rabson } 188dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_nc_protofmly, (u_int)~0)) { 189dfdcada3SDoug Rabson return (FALSE); 190dfdcada3SDoug Rabson } 191dfdcada3SDoug Rabson if (!xdr_string(xdrs, &objp->r_nc_proto, (u_int)~0)) { 192dfdcada3SDoug Rabson return (FALSE); 193dfdcada3SDoug Rabson } 194dfdcada3SDoug Rabson return (TRUE); 195dfdcada3SDoug Rabson } 196dfdcada3SDoug Rabson 197dfdcada3SDoug Rabson bool_t 198dfdcada3SDoug Rabson xdr_rpcb_entry_list_ptr(XDR *xdrs, rpcb_entry_list_ptr *rp) 199dfdcada3SDoug Rabson { 200dfdcada3SDoug Rabson /* 201dfdcada3SDoug Rabson * more_elements is pre-computed in case the direction is 202dfdcada3SDoug Rabson * XDR_ENCODE or XDR_FREE. more_elements is overwritten by 203dfdcada3SDoug Rabson * xdr_bool when the direction is XDR_DECODE. 204dfdcada3SDoug Rabson */ 205dfdcada3SDoug Rabson bool_t more_elements; 206dfdcada3SDoug Rabson int freeing = (xdrs->x_op == XDR_FREE); 207dfdcada3SDoug Rabson rpcb_entry_list_ptr next; 208dfdcada3SDoug Rabson rpcb_entry_list_ptr next_copy; 209dfdcada3SDoug Rabson 210dfdcada3SDoug Rabson next = NULL; 211dfdcada3SDoug Rabson for (;;) { 212dfdcada3SDoug Rabson more_elements = (bool_t)(*rp != NULL); 213dfdcada3SDoug Rabson if (! xdr_bool(xdrs, &more_elements)) { 214dfdcada3SDoug Rabson return (FALSE); 215dfdcada3SDoug Rabson } 216dfdcada3SDoug Rabson if (! more_elements) { 217dfdcada3SDoug Rabson return (TRUE); /* we are done */ 218dfdcada3SDoug Rabson } 219dfdcada3SDoug Rabson /* 220dfdcada3SDoug Rabson * the unfortunate side effect of non-recursion is that in 221dfdcada3SDoug Rabson * the case of freeing we must remember the next object 222dfdcada3SDoug Rabson * before we free the current object ... 223dfdcada3SDoug Rabson */ 224dfdcada3SDoug Rabson if (freeing) 225dfdcada3SDoug Rabson next = (*rp)->rpcb_entry_next; 226dfdcada3SDoug Rabson if (! xdr_reference(xdrs, (caddr_t *)rp, 227dfdcada3SDoug Rabson (u_int)sizeof (rpcb_entry_list), 228dfdcada3SDoug Rabson (xdrproc_t)xdr_rpcb_entry)) { 229dfdcada3SDoug Rabson return (FALSE); 230dfdcada3SDoug Rabson } 231dfdcada3SDoug Rabson if (freeing && *rp) { 232dfdcada3SDoug Rabson next_copy = next; 233dfdcada3SDoug Rabson rp = &next_copy; 234dfdcada3SDoug Rabson /* 235dfdcada3SDoug Rabson * Note that in the subsequent iteration, next_copy 236dfdcada3SDoug Rabson * gets nulled out by the xdr_reference 237dfdcada3SDoug Rabson * but next itself survives. 238dfdcada3SDoug Rabson */ 239dfdcada3SDoug Rabson } else if (*rp) { 240dfdcada3SDoug Rabson rp = &((*rp)->rpcb_entry_next); 241dfdcada3SDoug Rabson } 242dfdcada3SDoug Rabson } 243dfdcada3SDoug Rabson /*NOTREACHED*/ 244dfdcada3SDoug Rabson } 245