1dfdcada3SDoug Rabson /* $NetBSD: rpcb_clnt.c,v 1.6 2000/07/16 06:41:43 itojun Exp $ */ 2dfdcada3SDoug Rabson 32e322d37SHiroki Sato /*- 451369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 551369649SPedro F. Giffuni * 62e322d37SHiroki Sato * Copyright (c) 2010, Oracle America, 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 the "Oracle America, 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 #include <sys/cdefs.h> 37dfdcada3SDoug Rabson /* 38dfdcada3SDoug Rabson * rpcb_clnt.c 39dfdcada3SDoug Rabson * interface to rpcbind rpc service. 40dfdcada3SDoug Rabson * 41dfdcada3SDoug Rabson * Copyright (C) 1988, Sun Microsystems, Inc. 42dfdcada3SDoug Rabson */ 43dfdcada3SDoug Rabson 44dfdcada3SDoug Rabson #include "opt_inet6.h" 45dfdcada3SDoug Rabson 46dfdcada3SDoug Rabson #include <sys/param.h> 47dfdcada3SDoug Rabson #include <sys/systm.h> 48dfdcada3SDoug Rabson #include <sys/kernel.h> 49dfdcada3SDoug Rabson #include <sys/malloc.h> 50dfdcada3SDoug Rabson #include <sys/proc.h> 51dfdcada3SDoug Rabson #include <sys/socket.h> 52dfdcada3SDoug Rabson #include <sys/socketvar.h> 53dfdcada3SDoug Rabson 54dfdcada3SDoug Rabson #include <rpc/rpc.h> 55dfdcada3SDoug Rabson #include <rpc/rpcb_clnt.h> 56dfdcada3SDoug Rabson #include <rpc/rpcb_prot.h> 57dfdcada3SDoug Rabson 58ee31b83aSDoug Rabson #include <rpc/rpc_com.h> 59dfdcada3SDoug Rabson 60dfdcada3SDoug Rabson static struct timeval tottimeout = { 60, 0 }; 61dfdcada3SDoug Rabson static const char nullstring[] = "\000"; 62dfdcada3SDoug Rabson 63dfdcada3SDoug Rabson static CLIENT *local_rpcb(void); 64dfdcada3SDoug Rabson 65dfdcada3SDoug Rabson /* XXX */ 66dfdcada3SDoug Rabson #define IN4_LOCALHOST_STRING "127.0.0.1" 67dfdcada3SDoug Rabson #define IN6_LOCALHOST_STRING "::1" 68dfdcada3SDoug Rabson 69dfdcada3SDoug Rabson /* 70dfdcada3SDoug Rabson * This routine will return a client handle that is connected to the local 71dfdcada3SDoug Rabson * rpcbind. Returns NULL on error and free's everything. 72dfdcada3SDoug Rabson */ 73dfdcada3SDoug Rabson static CLIENT * 74e87d90a9SDimitry Andric local_rpcb(void) 75dfdcada3SDoug Rabson { 76dfdcada3SDoug Rabson CLIENT *client; 77dfdcada3SDoug Rabson struct socket *so; 78dfdcada3SDoug Rabson size_t tsize; 79dfdcada3SDoug Rabson struct sockaddr_un sun; 80dfdcada3SDoug Rabson int error; 81dfdcada3SDoug Rabson 82dfdcada3SDoug Rabson /* 83dfdcada3SDoug Rabson * Try connecting to the local rpcbind through a local socket 84dfdcada3SDoug Rabson * first. If this doesn't work, try all transports defined in 85dfdcada3SDoug Rabson * the netconfig file. 86dfdcada3SDoug Rabson */ 87dfdcada3SDoug Rabson memset(&sun, 0, sizeof sun); 88dfdcada3SDoug Rabson so = NULL; 89dfdcada3SDoug Rabson error = socreate(AF_LOCAL, &so, SOCK_STREAM, 0, curthread->td_ucred, 90dfdcada3SDoug Rabson curthread); 91dfdcada3SDoug Rabson if (error) 92*5aac61c5SGleb Smirnoff return (NULL); 93dfdcada3SDoug Rabson sun.sun_family = AF_LOCAL; 94dfdcada3SDoug Rabson strcpy(sun.sun_path, _PATH_RPCBINDSOCK); 95dfdcada3SDoug Rabson sun.sun_len = SUN_LEN(&sun); 96dfdcada3SDoug Rabson 97dfdcada3SDoug Rabson tsize = __rpc_get_t_size(AF_LOCAL, 0, 0); 98dfdcada3SDoug Rabson client = clnt_vc_create(so, (struct sockaddr *)&sun, (rpcprog_t)RPCBPROG, 997b67bd9fSRick Macklem (rpcvers_t)RPCBVERS, tsize, tsize, 1); 100dfdcada3SDoug Rabson 101dfdcada3SDoug Rabson if (client != NULL) { 102dfdcada3SDoug Rabson /* Mark the socket to be closed in destructor */ 103dfdcada3SDoug Rabson (void) CLNT_CONTROL(client, CLSET_FD_CLOSE, NULL); 104dfdcada3SDoug Rabson return client; 105dfdcada3SDoug Rabson } 106dfdcada3SDoug Rabson 107dfdcada3SDoug Rabson /* Nobody needs this socket anymore; free the descriptor. */ 108dfdcada3SDoug Rabson soclose(so); 109dfdcada3SDoug Rabson 110dfdcada3SDoug Rabson return (NULL); 111dfdcada3SDoug Rabson } 112dfdcada3SDoug Rabson 113dfdcada3SDoug Rabson /* 114dfdcada3SDoug Rabson * Set a mapping between program, version and address. 115dfdcada3SDoug Rabson * Calls the rpcbind service to do the mapping. 116dfdcada3SDoug Rabson */ 117dfdcada3SDoug Rabson bool_t 118dfdcada3SDoug Rabson rpcb_set(rpcprog_t program, rpcvers_t version, 119dfdcada3SDoug Rabson const struct netconfig *nconf, /* Network structure of transport */ 120dfdcada3SDoug Rabson const struct netbuf *address) /* Services netconfig address */ 121dfdcada3SDoug Rabson { 122dfdcada3SDoug Rabson CLIENT *client; 123dfdcada3SDoug Rabson bool_t rslt = FALSE; 124dfdcada3SDoug Rabson RPCB parms; 125dfdcada3SDoug Rabson #if 0 126dfdcada3SDoug Rabson char uidbuf[32]; 127dfdcada3SDoug Rabson #endif 128dfdcada3SDoug Rabson struct netconfig nconfcopy; 129dfdcada3SDoug Rabson struct netbuf addresscopy; 130dfdcada3SDoug Rabson 131dfdcada3SDoug Rabson /* parameter checking */ 132dfdcada3SDoug Rabson if (nconf == NULL) { 133dfdcada3SDoug Rabson rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; 134dfdcada3SDoug Rabson return (FALSE); 135dfdcada3SDoug Rabson } 136dfdcada3SDoug Rabson if (address == NULL) { 137dfdcada3SDoug Rabson rpc_createerr.cf_stat = RPC_UNKNOWNADDR; 138dfdcada3SDoug Rabson return (FALSE); 139dfdcada3SDoug Rabson } 140dfdcada3SDoug Rabson client = local_rpcb(); 141dfdcada3SDoug Rabson if (! client) { 142dfdcada3SDoug Rabson return (FALSE); 143dfdcada3SDoug Rabson } 144dfdcada3SDoug Rabson 145dfdcada3SDoug Rabson /* convert to universal */ 146dfdcada3SDoug Rabson /*LINTED const castaway*/ 147dfdcada3SDoug Rabson nconfcopy = *nconf; 148dfdcada3SDoug Rabson addresscopy = *address; 149dfdcada3SDoug Rabson parms.r_addr = taddr2uaddr(&nconfcopy, &addresscopy); 150dfdcada3SDoug Rabson if (!parms.r_addr) { 151dfdcada3SDoug Rabson CLNT_DESTROY(client); 152dfdcada3SDoug Rabson rpc_createerr.cf_stat = RPC_N2AXLATEFAILURE; 153dfdcada3SDoug Rabson return (FALSE); /* no universal address */ 154dfdcada3SDoug Rabson } 155dfdcada3SDoug Rabson parms.r_prog = program; 156dfdcada3SDoug Rabson parms.r_vers = version; 157dfdcada3SDoug Rabson parms.r_netid = nconf->nc_netid; 158dfdcada3SDoug Rabson #if 0 159dfdcada3SDoug Rabson /* 160dfdcada3SDoug Rabson * Though uid is not being used directly, we still send it for 161dfdcada3SDoug Rabson * completeness. For non-unix platforms, perhaps some other 162dfdcada3SDoug Rabson * string or an empty string can be sent. 163dfdcada3SDoug Rabson */ 164dfdcada3SDoug Rabson (void) snprintf(uidbuf, sizeof uidbuf, "%d", geteuid()); 165dfdcada3SDoug Rabson parms.r_owner = uidbuf; 166dfdcada3SDoug Rabson #else 167dfdcada3SDoug Rabson parms.r_owner = ""; 168dfdcada3SDoug Rabson #endif 169dfdcada3SDoug Rabson 170dfdcada3SDoug Rabson CLNT_CALL(client, (rpcproc_t)RPCBPROC_SET, (xdrproc_t) xdr_rpcb, 171dfdcada3SDoug Rabson (char *)(void *)&parms, (xdrproc_t) xdr_bool, 172dfdcada3SDoug Rabson (char *)(void *)&rslt, tottimeout); 173dfdcada3SDoug Rabson 174dfdcada3SDoug Rabson CLNT_DESTROY(client); 175dfdcada3SDoug Rabson free(parms.r_addr, M_RPC); 176dfdcada3SDoug Rabson return (rslt); 177dfdcada3SDoug Rabson } 178dfdcada3SDoug Rabson 179dfdcada3SDoug Rabson /* 180dfdcada3SDoug Rabson * Remove the mapping between program, version and netbuf address. 181dfdcada3SDoug Rabson * Calls the rpcbind service to do the un-mapping. 182dfdcada3SDoug Rabson * If netbuf is NULL, unset for all the transports, otherwise unset 183dfdcada3SDoug Rabson * only for the given transport. 184dfdcada3SDoug Rabson */ 185dfdcada3SDoug Rabson bool_t 186dfdcada3SDoug Rabson rpcb_unset(rpcprog_t program, rpcvers_t version, const struct netconfig *nconf) 187dfdcada3SDoug Rabson { 188dfdcada3SDoug Rabson CLIENT *client; 189dfdcada3SDoug Rabson bool_t rslt = FALSE; 190dfdcada3SDoug Rabson RPCB parms; 191dfdcada3SDoug Rabson #if 0 192dfdcada3SDoug Rabson char uidbuf[32]; 193dfdcada3SDoug Rabson #endif 194dfdcada3SDoug Rabson 195dfdcada3SDoug Rabson client = local_rpcb(); 196dfdcada3SDoug Rabson if (! client) { 197dfdcada3SDoug Rabson return (FALSE); 198dfdcada3SDoug Rabson } 199dfdcada3SDoug Rabson 200dfdcada3SDoug Rabson parms.r_prog = program; 201dfdcada3SDoug Rabson parms.r_vers = version; 202dfdcada3SDoug Rabson if (nconf) 203dfdcada3SDoug Rabson parms.r_netid = nconf->nc_netid; 204dfdcada3SDoug Rabson else { 205dfdcada3SDoug Rabson /*LINTED const castaway*/ 206dfdcada3SDoug Rabson parms.r_netid = (char *)(uintptr_t) &nullstring[0]; /* unsets all */ 207dfdcada3SDoug Rabson } 208dfdcada3SDoug Rabson /*LINTED const castaway*/ 209dfdcada3SDoug Rabson parms.r_addr = (char *)(uintptr_t) &nullstring[0]; 210dfdcada3SDoug Rabson #if 0 211dfdcada3SDoug Rabson (void) snprintf(uidbuf, sizeof uidbuf, "%d", geteuid()); 212dfdcada3SDoug Rabson parms.r_owner = uidbuf; 213dfdcada3SDoug Rabson #else 214dfdcada3SDoug Rabson parms.r_owner = ""; 215dfdcada3SDoug Rabson #endif 216dfdcada3SDoug Rabson 217dfdcada3SDoug Rabson CLNT_CALL(client, (rpcproc_t)RPCBPROC_UNSET, (xdrproc_t) xdr_rpcb, 218dfdcada3SDoug Rabson (char *)(void *)&parms, (xdrproc_t) xdr_bool, 219dfdcada3SDoug Rabson (char *)(void *)&rslt, tottimeout); 220dfdcada3SDoug Rabson 221dfdcada3SDoug Rabson CLNT_DESTROY(client); 222dfdcada3SDoug Rabson return (rslt); 223dfdcada3SDoug Rabson } 224