174462Salfred/* $NetBSD: rpcb_svc.c,v 1.1 2000/06/02 23:15:41 fvdl Exp $ */ 274462Salfred/* $FreeBSD$ */ 374462Salfred 474462Salfred/* 574462Salfred * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 674462Salfred * unrestricted use provided that this legend is included on all tape 774462Salfred * media and as a part of the software program in whole or part. Users 874462Salfred * may copy or modify Sun RPC without charge, but are not authorized 974462Salfred * to license or distribute it to anyone else except as part of a product or 1074462Salfred * program developed by the user. 1174462Salfred * 1274462Salfred * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 1374462Salfred * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 1474462Salfred * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 1574462Salfred * 1674462Salfred * Sun RPC is provided with no support and without any obligation on the 1774462Salfred * part of Sun Microsystems, Inc. to assist in its use, correction, 1874462Salfred * modification or enhancement. 1974462Salfred * 2074462Salfred * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 2174462Salfred * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 2274462Salfred * OR ANY PART THEREOF. 2374462Salfred * 2474462Salfred * In no event will Sun Microsystems, Inc. be liable for any lost revenue 2574462Salfred * or profits or other special, indirect and consequential damages, even if 2674462Salfred * Sun has been advised of the possibility of such damages. 2774462Salfred * 2874462Salfred * Sun Microsystems, Inc. 2974462Salfred * 2550 Garcia Avenue 3074462Salfred * Mountain View, California 94043 3174462Salfred */ 3274462Salfred/* 3374462Salfred * Copyright (c) 1986 - 1991 by Sun Microsystems, Inc. 3474462Salfred */ 3574462Salfred 3674462Salfred/* #ident "@(#)rpcb_svc.c 1.16 93/07/05 SMI" */ 3774462Salfred 3874462Salfred/* 3974462Salfred * rpcb_svc.c 4074462Salfred * The server procedure for the version 3 rpcbind (TLI). 4174462Salfred * 4274462Salfred * It maintains a separate list of all the registered services with the 4374462Salfred * version 3 of rpcbind. 4474462Salfred */ 4574462Salfred#include <sys/types.h> 4674462Salfred#include <rpc/rpc.h> 4774462Salfred#include <rpc/rpcb_prot.h> 4874462Salfred#include <netconfig.h> 4974462Salfred#include <syslog.h> 5074462Salfred#include <stdlib.h> 5174462Salfred#include <stdio.h> 5274462Salfred#include <string.h> 5374462Salfred 5474462Salfred#include "rpcbind.h" 5574462Salfred 56173412Skevlostatic void *rpcbproc_getaddr_3_local(void *, struct svc_req *, SVCXPRT *, 57173412Skevlo rpcvers_t); 58173412Skevlostatic void *rpcbproc_dump_3_local(void *, struct svc_req *, SVCXPRT *, 59173412Skevlo rpcvers_t); 6074462Salfred 6174462Salfred/* 6274462Salfred * Called by svc_getreqset. There is a separate server handle for 6374462Salfred * every transport that it waits on. 6474462Salfred */ 6574462Salfredvoid 6674462Salfredrpcb_service_3(struct svc_req *rqstp, SVCXPRT *transp) 6774462Salfred{ 6874462Salfred union { 6974462Salfred RPCB rpcbproc_set_3_arg; 7074462Salfred RPCB rpcbproc_unset_3_arg; 7174462Salfred RPCB rpcbproc_getaddr_3_local_arg; 7274462Salfred struct rpcb_rmtcallargs rpcbproc_callit_3_arg; 7374462Salfred char *rpcbproc_uaddr2taddr_3_arg; 7474462Salfred struct netbuf rpcbproc_taddr2uaddr_3_arg; 7574462Salfred } argument; 7674462Salfred char *result; 7774462Salfred xdrproc_t xdr_argument, xdr_result; 78173412Skevlo void *(*local)(void *, struct svc_req *, SVCXPRT *, rpcvers_t); 7974462Salfred 8074462Salfred rpcbs_procinfo(RPCBVERS_3_STAT, rqstp->rq_proc); 8174462Salfred 8274462Salfred switch (rqstp->rq_proc) { 8374462Salfred case NULLPROC: 8474462Salfred /* 8574462Salfred * Null proc call 8674462Salfred */ 8774462Salfred#ifdef RPCBIND_DEBUG 8874462Salfred if (debugging) 8974462Salfred fprintf(stderr, "RPCBPROC_NULL\n"); 9074462Salfred#endif 9174462Salfred /* This call just logs, no actual checks */ 9274462Salfred check_access(transp, rqstp->rq_proc, NULL, RPCBVERS); 9374462Salfred (void) svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL); 9474462Salfred return; 9574462Salfred 9674462Salfred case RPCBPROC_SET: 9774462Salfred xdr_argument = (xdrproc_t )xdr_rpcb; 9874462Salfred xdr_result = (xdrproc_t )xdr_bool; 9974462Salfred local = rpcbproc_set_com; 10074462Salfred break; 10174462Salfred 10274462Salfred case RPCBPROC_UNSET: 10374462Salfred xdr_argument = (xdrproc_t)xdr_rpcb; 10474462Salfred xdr_result = (xdrproc_t)xdr_bool; 10574462Salfred local = rpcbproc_unset_com; 10674462Salfred break; 10774462Salfred 10874462Salfred case RPCBPROC_GETADDR: 10974462Salfred xdr_argument = (xdrproc_t)xdr_rpcb; 11074462Salfred xdr_result = (xdrproc_t)xdr_wrapstring; 11174462Salfred local = rpcbproc_getaddr_3_local; 11274462Salfred break; 11374462Salfred 11474462Salfred case RPCBPROC_DUMP: 11574462Salfred#ifdef RPCBIND_DEBUG 11674462Salfred if (debugging) 11774462Salfred fprintf(stderr, "RPCBPROC_DUMP\n"); 11874462Salfred#endif 11974462Salfred xdr_argument = (xdrproc_t)xdr_void; 12074462Salfred xdr_result = (xdrproc_t)xdr_rpcblist_ptr; 12174462Salfred local = rpcbproc_dump_3_local; 12274462Salfred break; 12374462Salfred 12474462Salfred case RPCBPROC_CALLIT: 12574462Salfred rpcbproc_callit_com(rqstp, transp, rqstp->rq_proc, RPCBVERS); 12674462Salfred return; 12774462Salfred 12874462Salfred case RPCBPROC_GETTIME: 12974462Salfred#ifdef RPCBIND_DEBUG 13074462Salfred if (debugging) 13174462Salfred fprintf(stderr, "RPCBPROC_GETTIME\n"); 13274462Salfred#endif 13374462Salfred xdr_argument = (xdrproc_t)xdr_void; 13474462Salfred xdr_result = (xdrproc_t)xdr_u_long; 13574462Salfred local = rpcbproc_gettime_com; 13674462Salfred break; 13774462Salfred 13874462Salfred case RPCBPROC_UADDR2TADDR: 13974462Salfred#ifdef RPCBIND_DEBUG 14074462Salfred if (debugging) 14174462Salfred fprintf(stderr, "RPCBPROC_UADDR2TADDR\n"); 14274462Salfred#endif 14374462Salfred xdr_argument = (xdrproc_t)xdr_wrapstring; 14474462Salfred xdr_result = (xdrproc_t)xdr_netbuf; 14574462Salfred local = rpcbproc_uaddr2taddr_com; 14674462Salfred break; 14774462Salfred 14874462Salfred case RPCBPROC_TADDR2UADDR: 14974462Salfred#ifdef RPCBIND_DEBUG 15074462Salfred if (debugging) 15174462Salfred fprintf(stderr, "RPCBPROC_TADDR2UADDR\n"); 15274462Salfred#endif 15374462Salfred xdr_argument = (xdrproc_t)xdr_netbuf; 15474462Salfred xdr_result = (xdrproc_t)xdr_wrapstring; 15574462Salfred local = rpcbproc_taddr2uaddr_com; 15674462Salfred break; 15774462Salfred 15874462Salfred default: 15974462Salfred svcerr_noproc(transp); 16074462Salfred return; 16174462Salfred } 16274462Salfred (void) memset((char *)&argument, 0, sizeof (argument)); 16374462Salfred if (!svc_getargs(transp, (xdrproc_t) xdr_argument, 16474462Salfred (char *) &argument)) { 16574462Salfred svcerr_decode(transp); 16674462Salfred if (debugging) 16774462Salfred (void) fprintf(stderr, "rpcbind: could not decode\n"); 16874462Salfred return; 16974462Salfred } 17074462Salfred if (!check_access(transp, rqstp->rq_proc, &argument, RPCBVERS)) { 17174462Salfred svcerr_weakauth(transp); 17274462Salfred goto done; 17374462Salfred } 17474462Salfred result = (*local)(&argument, rqstp, transp, RPCBVERS); 17574462Salfred if (result != NULL && !svc_sendreply(transp, (xdrproc_t)xdr_result, 17674462Salfred result)) { 17774462Salfred svcerr_systemerr(transp); 17874462Salfred if (debugging) { 17974462Salfred (void) fprintf(stderr, "rpcbind: svc_sendreply\n"); 18074462Salfred if (doabort) { 18174462Salfred rpcbind_abort(); 18274462Salfred } 18374462Salfred } 18474462Salfred } 18574462Salfreddone: 18674462Salfred if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *) 18774462Salfred &argument)) { 18874462Salfred if (debugging) { 18974462Salfred (void) fprintf(stderr, "unable to free arguments\n"); 19074462Salfred if (doabort) { 19174462Salfred rpcbind_abort(); 19274462Salfred } 19374462Salfred } 19474462Salfred } 19574462Salfred} 19674462Salfred 19774462Salfred/* 19874462Salfred * Lookup the mapping for a program, version and return its 19974462Salfred * address. Assuming that the caller wants the address of the 20074462Salfred * server running on the transport on which the request came. 20174462Salfred * 20274462Salfred * We also try to resolve the universal address in terms of 20374462Salfred * address of the caller. 20474462Salfred */ 20574462Salfred/* ARGSUSED */ 20674462Salfredstatic void * 207104592Salfredrpcbproc_getaddr_3_local(void *arg, struct svc_req *rqstp __unused, 208104592Salfred SVCXPRT *transp __unused, rpcvers_t versnum __unused) 20974462Salfred{ 21074462Salfred RPCB *regp = (RPCB *)arg; 21174462Salfred#ifdef RPCBIND_DEBUG 21274462Salfred if (debugging) { 21374462Salfred char *uaddr; 21474462Salfred 21574462Salfred uaddr = taddr2uaddr(rpcbind_get_conf(transp->xp_netid), 21674462Salfred svc_getrpccaller(transp)); 21774462Salfred fprintf(stderr, "RPCB_GETADDR req for (%lu, %lu, %s) from %s: ", 21874462Salfred (unsigned long)regp->r_prog, (unsigned long)regp->r_vers, 21974462Salfred regp->r_netid, uaddr); 22074462Salfred free(uaddr); 22174462Salfred } 22274462Salfred#endif 22374462Salfred return (rpcbproc_getaddr_com(regp, rqstp, transp, RPCBVERS, 22474462Salfred RPCB_ALLVERS)); 22574462Salfred} 22674462Salfred 22774462Salfred/* ARGSUSED */ 22874462Salfredstatic void * 229104592Salfredrpcbproc_dump_3_local(void *arg __unused, struct svc_req *rqstp __unused, 230104592Salfred SVCXPRT *transp __unused, rpcvers_t versnum __unused) 23174462Salfred{ 23274462Salfred return ((void *)&list_rbl); 23374462Salfred} 234