1251877Speter/*
2251877Speter * $NetBSD: rpcb_stat.c,v 1.2 2000/07/04 20:27:40 matt Exp $
3251877Speter */
4251877Speter/*-
5251877Speter * SPDX-License-Identifier: BSD-3-Clause
6251877Speter *
7251877Speter * Copyright (c) 2009, Sun Microsystems, Inc.
8251877Speter * All rights reserved.
9251877Speter *
10251877Speter * Redistribution and use in source and binary forms, with or without
11251877Speter * modification, are permitted provided that the following conditions are met:
12251877Speter * - Redistributions of source code must retain the above copyright notice,
13251877Speter *   this list of conditions and the following disclaimer.
14251877Speter * - Redistributions in binary form must reproduce the above copyright notice,
15251877Speter *   this list of conditions and the following disclaimer in the documentation
16251877Speter *   and/or other materials provided with the distribution.
17251877Speter * - Neither the name of Sun Microsystems, Inc. nor the names of its
18251877Speter *   contributors may be used to endorse or promote products derived
19251877Speter *   from this software without specific prior written permission.
20251877Speter *
21251877Speter * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22251877Speter * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23251877Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24251877Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25251877Speter * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26251877Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27251877Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28251877Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29251877Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30251877Speter * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31251877Speter * POSSIBILITY OF SUCH DAMAGE.
32251877Speter */
33251877Speter/*
34251877Speter * rpcb_stat.c
35251877Speter * Allows for gathering of statistics
36251877Speter *
37251877Speter * Copyright (c) 1990 by Sun Microsystems, Inc.
38251877Speter */
39251877Speter
40251877Speter#include <netconfig.h>
41251877Speter#include <rpc/rpc.h>
42251877Speter#include <rpc/rpcb_prot.h>
43251877Speter#include <sys/stat.h>
44251877Speter#ifdef PORTMAP
45251877Speter#include <rpc/pmap_prot.h>
46251877Speter#endif
47251877Speter#include <stdlib.h>
48251877Speter#include <string.h>
49251877Speter#include "rpcbind.h"
50251877Speter
51251877Speterstatic rpcb_stat_byvers inf;
52251877Speter
53251877Spetervoid
54251877Speterrpcbs_init(void)
55251877Speter{
56251877Speter
57251877Speter}
58251877Speter
59251877Spetervoid
60251877Speterrpcbs_procinfo(rpcvers_t rtype, rpcproc_t proc)
61251877Speter{
62251877Speter	switch (rtype + 2) {
63251877Speter#ifdef PORTMAP
64251877Speter	case PMAPVERS:		/* version 2 */
65251877Speter		if (proc > rpcb_highproc_2)
66251877Speter			return;
67251877Speter		break;
68251877Speter#endif
69251877Speter	case RPCBVERS:		/* version 3 */
70251877Speter		if (proc > rpcb_highproc_3)
71251877Speter			return;
72251877Speter		break;
73251877Speter	case RPCBVERS4:		/* version 4 */
74251877Speter		if (proc > rpcb_highproc_4)
75251877Speter			return;
76251877Speter		break;
77251877Speter	default: return;
78251877Speter	}
79251877Speter	inf[rtype].info[proc]++;
80251877Speter}
81251877Speter
82251877Spetervoid
83251877Speterrpcbs_set(rpcvers_t rtype, bool_t success)
84251877Speter{
85251877Speter	if ((rtype >= RPCBVERS_STAT) || (success == FALSE))
86251877Speter		return;
87251877Speter	inf[rtype].setinfo++;
88251877Speter}
89251877Speter
90251877Spetervoid
91251877Speterrpcbs_unset(rpcvers_t rtype, bool_t success)
92251877Speter{
93251877Speter	if ((rtype >= RPCBVERS_STAT) || (success == FALSE))
94251877Speter		return;
95251877Speter	inf[rtype].unsetinfo++;
96251877Speter}
97251877Speter
98251877Spetervoid
99251877Speterrpcbs_getaddr(rpcvers_t rtype, rpcprog_t prog, rpcvers_t vers, char *netid,
100251877Speter	      char *uaddr)
101251877Speter{
102251877Speter	rpcbs_addrlist *al;
103251877Speter	struct netconfig *nconf;
104251877Speter
105251877Speter	if (rtype >= RPCBVERS_STAT)
106251877Speter		return;
107251877Speter	for (al = inf[rtype].addrinfo; al; al = al->next) {
108253895Speter
109253895Speter		if(al->netid == NULL)
110253895Speter			return;
111251877Speter		if ((al->prog == prog) && (al->vers == vers) &&
112251877Speter		    (strcmp(al->netid, netid) == 0)) {
113251877Speter			if ((uaddr == NULL) || (uaddr[0] == 0))
114251877Speter				al->failure++;
115251877Speter			else
116251877Speter				al->success++;
117251877Speter			return;
118251877Speter		}
119251877Speter	}
120251877Speter	nconf = rpcbind_get_conf(netid);
121251877Speter	if (nconf == NULL) {
122251877Speter		return;
123251877Speter	}
124251877Speter	al = (rpcbs_addrlist *) malloc(sizeof (rpcbs_addrlist));
125251877Speter	if (al == NULL) {
126251877Speter		return;
127251877Speter	}
128251877Speter	al->prog = prog;
129251877Speter	al->vers = vers;
130251877Speter	al->netid = nconf->nc_netid;
131251877Speter	if ((uaddr == NULL) || (uaddr[0] == 0)) {
132251877Speter		al->failure = 1;
133251877Speter		al->success = 0;
134251877Speter	} else {
135251877Speter		al->failure = 0;
136251877Speter		al->success = 1;
137251877Speter	}
138251877Speter	al->next = inf[rtype].addrinfo;
139251877Speter	inf[rtype].addrinfo = al;
140251877Speter}
141251877Speter
142251877Spetervoid
143251877Speterrpcbs_rmtcall(rpcvers_t rtype, rpcproc_t rpcbproc, rpcprog_t prog,
144251877Speter	      rpcvers_t vers, rpcproc_t proc, char *netid, rpcblist_ptr rbl)
145251877Speter{
146251877Speter	rpcbs_rmtcalllist *rl;
147251877Speter	struct netconfig *nconf;
148251877Speter
149251877Speter	if (rtype >= RPCBVERS_STAT)
150251877Speter		return;
151251877Speter	for (rl = inf[rtype].rmtinfo; rl; rl = rl->next) {
152251877Speter
153251877Speter		if(rl->netid == NULL)
154251877Speter			return;
155251877Speter
156251877Speter		if ((rl->prog == prog) && (rl->vers == vers) &&
157251877Speter		    (rl->proc == proc) &&
158251877Speter		    (strcmp(rl->netid, netid) == 0)) {
159251877Speter			if ((rbl == NULL) ||
160251877Speter			    (rbl->rpcb_map.r_vers != vers))
161251877Speter				rl->failure++;
162251877Speter			else
163251877Speter				rl->success++;
164251877Speter			if (rpcbproc == RPCBPROC_INDIRECT)
165251877Speter				rl->indirect++;
166251877Speter			return;
167251877Speter		}
168251877Speter	}
169251877Speter	nconf = rpcbind_get_conf(netid);
170251877Speter	if (nconf == NULL) {
171251877Speter		return;
172251877Speter	}
173251877Speter	rl = (rpcbs_rmtcalllist *) malloc(sizeof (rpcbs_rmtcalllist));
174251877Speter	if (rl == NULL) {
175251877Speter		return;
176251877Speter	}
177251877Speter	rl->prog = prog;
178251877Speter	rl->vers = vers;
179251877Speter	rl->proc = proc;
180251877Speter	rl->netid = nconf->nc_netid;
181251877Speter	if ((rbl == NULL) ||
182251877Speter		    (rbl->rpcb_map.r_vers != vers)) {
183251877Speter		rl->failure = 1;
184251877Speter		rl->success = 0;
185251877Speter	} else {
186251877Speter		rl->failure = 0;
187251877Speter		rl->success = 1;
188251877Speter	}
189251877Speter	rl->indirect = 1;
190251877Speter	rl->next = inf[rtype].rmtinfo;
191251877Speter	inf[rtype].rmtinfo = rl;
192251877Speter}
193251877Speter
194251877Spetervoid *
195251877Speterrpcbproc_getstat(void *arg __unused, struct svc_req *req __unused,
196251877Speter    SVCXPRT *xprt __unused, rpcvers_t versnum __unused)
197251877Speter{
198251877Speter	return (void *)&inf;
199251877Speter}
200251877Speter