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