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