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