174462Salfred/*
274462Salfred * $NetBSD: rpcb_stat.c,v 1.2 2000/07/04 20:27:40 matt Exp $
374462Salfred * $FreeBSD$
474462Salfred */
574462Salfred/*
674462Salfred * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
774462Salfred * unrestricted use provided that this legend is included on all tape
874462Salfred * media and as a part of the software program in whole or part.  Users
974462Salfred * may copy or modify Sun RPC without charge, but are not authorized
1074462Salfred * to license or distribute it to anyone else except as part of a product or
1174462Salfred * program developed by the user.
1274462Salfred *
1374462Salfred * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
1474462Salfred * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
1574462Salfred * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
1674462Salfred *
1774462Salfred * Sun RPC is provided with no support and without any obligation on the
1874462Salfred * part of Sun Microsystems, Inc. to assist in its use, correction,
1974462Salfred * modification or enhancement.
2074462Salfred *
2174462Salfred * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
2274462Salfred * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
2374462Salfred * OR ANY PART THEREOF.
2474462Salfred *
2574462Salfred * In no event will Sun Microsystems, Inc. be liable for any lost revenue
2674462Salfred * or profits or other special, indirect and consequential damages, even if
2774462Salfred * Sun has been advised of the possibility of such damages.
2874462Salfred *
2974462Salfred * Sun Microsystems, Inc.
3074462Salfred * 2550 Garcia Avenue
3174462Salfred * Mountain View, California  94043
3274462Salfred */
3374462Salfred/* #pragma ident   "@(#)rpcb_stat.c 1.7     94/04/25 SMI" */
3474462Salfred
3574462Salfred/*
3674462Salfred * rpcb_stat.c
3774462Salfred * Allows for gathering of statistics
3874462Salfred *
3974462Salfred * Copyright (c) 1990 by Sun Microsystems, Inc.
4074462Salfred */
4174462Salfred
4274462Salfred#include <stdio.h>
4374462Salfred#include <netconfig.h>
4474462Salfred#include <rpc/rpc.h>
4574462Salfred#include <rpc/rpcb_prot.h>
4674462Salfred#include <sys/stat.h>
4774462Salfred#ifdef PORTMAP
4874462Salfred#include <rpc/pmap_prot.h>
4974462Salfred#endif
5074462Salfred#include <stdlib.h>
5174462Salfred#include <string.h>
5274462Salfred#include "rpcbind.h"
5374462Salfred
5474462Salfredstatic rpcb_stat_byvers inf;
5574462Salfred
5674462Salfredvoid
57224001Sdelphijrpcbs_init(void)
5874462Salfred{
5974462Salfred
6074462Salfred}
6174462Salfred
6274462Salfredvoid
6374462Salfredrpcbs_procinfo(rpcvers_t rtype, rpcproc_t proc)
6474462Salfred{
6574462Salfred	switch (rtype + 2) {
6674462Salfred#ifdef PORTMAP
6774462Salfred	case PMAPVERS:		/* version 2 */
6874462Salfred		if (proc > rpcb_highproc_2)
6974462Salfred			return;
7074462Salfred		break;
7174462Salfred#endif
7274462Salfred	case RPCBVERS:		/* version 3 */
7374462Salfred		if (proc > rpcb_highproc_3)
7474462Salfred			return;
7574462Salfred		break;
7674462Salfred	case RPCBVERS4:		/* version 4 */
7774462Salfred		if (proc > rpcb_highproc_4)
7874462Salfred			return;
7974462Salfred		break;
8074462Salfred	default: return;
8174462Salfred	}
8274462Salfred	inf[rtype].info[proc]++;
8374462Salfred	return;
8474462Salfred}
8574462Salfred
8674462Salfredvoid
8774462Salfredrpcbs_set(rpcvers_t rtype, bool_t success)
8874462Salfred{
8974462Salfred	if ((rtype >= RPCBVERS_STAT) || (success == FALSE))
9074462Salfred		return;
9174462Salfred	inf[rtype].setinfo++;
9274462Salfred	return;
9374462Salfred}
9474462Salfred
9574462Salfredvoid
9674462Salfredrpcbs_unset(rpcvers_t rtype, bool_t success)
9774462Salfred{
9874462Salfred	if ((rtype >= RPCBVERS_STAT) || (success == FALSE))
9974462Salfred		return;
10074462Salfred	inf[rtype].unsetinfo++;
10174462Salfred	return;
10274462Salfred}
10374462Salfred
10474462Salfredvoid
10574462Salfredrpcbs_getaddr(rpcvers_t rtype, rpcprog_t prog, rpcvers_t vers, char *netid,
10674462Salfred	      char *uaddr)
10774462Salfred{
10874462Salfred	rpcbs_addrlist *al;
10974462Salfred	struct netconfig *nconf;
11074462Salfred
11174462Salfred	if (rtype >= RPCBVERS_STAT)
11274462Salfred		return;
11374462Salfred	for (al = inf[rtype].addrinfo; al; al = al->next) {
11474462Salfred
11574462Salfred		if(al->netid == NULL)
11674462Salfred			return;
11774462Salfred		if ((al->prog == prog) && (al->vers == vers) &&
11874462Salfred		    (strcmp(al->netid, netid) == 0)) {
119121656Smbr			if ((uaddr == NULL) || (uaddr[0] == 0))
12074462Salfred				al->failure++;
12174462Salfred			else
12274462Salfred				al->success++;
12374462Salfred			return;
12474462Salfred		}
12574462Salfred	}
12674462Salfred	nconf = rpcbind_get_conf(netid);
12774462Salfred	if (nconf == NULL) {
12874462Salfred		return;
12974462Salfred	}
13074462Salfred	al = (rpcbs_addrlist *) malloc(sizeof (rpcbs_addrlist));
13174462Salfred	if (al == NULL) {
13274462Salfred		return;
13374462Salfred	}
13474462Salfred	al->prog = prog;
13574462Salfred	al->vers = vers;
13674462Salfred	al->netid = nconf->nc_netid;
137121656Smbr	if ((uaddr == NULL) || (uaddr[0] == 0)) {
13874462Salfred		al->failure = 1;
13974462Salfred		al->success = 0;
14074462Salfred	} else {
14174462Salfred		al->failure = 0;
14274462Salfred		al->success = 1;
14374462Salfred	}
14474462Salfred	al->next = inf[rtype].addrinfo;
14574462Salfred	inf[rtype].addrinfo = al;
14674462Salfred}
14774462Salfred
14874462Salfredvoid
14974462Salfredrpcbs_rmtcall(rpcvers_t rtype, rpcproc_t rpcbproc, rpcprog_t prog,
15074462Salfred	      rpcvers_t vers, rpcproc_t proc, char *netid, rpcblist_ptr rbl)
15174462Salfred{
15274462Salfred	rpcbs_rmtcalllist *rl;
15374462Salfred	struct netconfig *nconf;
15474462Salfred
15574462Salfred	if (rtype > RPCBVERS_STAT)
15674462Salfred		return;
15774462Salfred	for (rl = inf[rtype].rmtinfo; rl; rl = rl->next) {
15874462Salfred
15974462Salfred		if(rl->netid == NULL)
16074462Salfred			return;
16174462Salfred
16274462Salfred		if ((rl->prog == prog) && (rl->vers == vers) &&
16374462Salfred		    (rl->proc == proc) &&
16474462Salfred		    (strcmp(rl->netid, netid) == 0)) {
16574462Salfred			if ((rbl == NULL) ||
16674462Salfred			    (rbl->rpcb_map.r_vers != vers))
16774462Salfred				rl->failure++;
16874462Salfred			else
16974462Salfred				rl->success++;
17074462Salfred			if (rpcbproc == RPCBPROC_INDIRECT)
17174462Salfred				rl->indirect++;
17274462Salfred			return;
17374462Salfred		}
17474462Salfred	}
17574462Salfred	nconf = rpcbind_get_conf(netid);
17674462Salfred	if (nconf == NULL) {
17774462Salfred		return;
17874462Salfred	}
17974462Salfred	rl = (rpcbs_rmtcalllist *) malloc(sizeof (rpcbs_rmtcalllist));
18074462Salfred	if (rl == NULL) {
18174462Salfred		return;
18274462Salfred	}
18374462Salfred	rl->prog = prog;
18474462Salfred	rl->vers = vers;
18574462Salfred	rl->proc = proc;
18674462Salfred	rl->netid = nconf->nc_netid;
18774462Salfred	if ((rbl == NULL) ||
18874462Salfred		    (rbl->rpcb_map.r_vers != vers)) {
18974462Salfred		rl->failure = 1;
19074462Salfred		rl->success = 0;
19174462Salfred	} else {
19274462Salfred		rl->failure = 0;
19374462Salfred		rl->success = 1;
19474462Salfred	}
19574462Salfred	rl->indirect = 1;
19674462Salfred	rl->next = inf[rtype].rmtinfo;
19774462Salfred	inf[rtype].rmtinfo = rl;
19874462Salfred	return;
19974462Salfred}
20074462Salfred
20174462Salfredvoid *
202104592Salfredrpcbproc_getstat(void *arg __unused, struct svc_req *req __unused,
203104592Salfred    SVCXPRT *xprt __unused, rpcvers_t versnum __unused)
20474462Salfred{
20574462Salfred	return (void *)&inf;
20674462Salfred}
207