/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * rpcb_stat.c * Allows for gathering of statistics * * Copyright (c) 1990 by Sun Microsystems, Inc. */ #include #include #include #include #include #ifdef PORTMAP #include #endif #include #include "rpcbind.h" static rpcb_stat_byvers inf; void rpcbs_init() { } void rpcbs_procinfo(rtype, proc) u_long rtype; u_long proc; { switch (rtype + 2) { #ifdef PORTMAP case PMAPVERS: /* version 2 */ if (proc > rpcb_highproc_2) return; break; #endif case RPCBVERS: /* version 3 */ if (proc > rpcb_highproc_3) return; break; case RPCBVERS4: /* version 4 */ if (proc > rpcb_highproc_4) return; break; default: return; } inf[rtype].info[proc]++; return; } void rpcbs_set(rtype, success) u_long rtype; bool_t success; { if ((rtype >= RPCBVERS_STAT) || (success == FALSE)) return; inf[rtype].setinfo++; return; } void rpcbs_unset(rtype, success) u_long rtype; bool_t success; { if ((rtype >= RPCBVERS_STAT) || (success == FALSE)) return; inf[rtype].unsetinfo++; return; } void rpcbs_getaddr(rtype, prog, vers, netid, uaddr) u_long rtype; u_long prog; u_long vers; char *netid; char *uaddr; { rpcbs_addrlist *al; struct netconfig *nconf; if (rtype >= RPCBVERS_STAT) return; for (al = inf[rtype].addrinfo; al; al = al->next) { if(al->netid == NULL) return; if ((al->prog == prog) && (al->vers == vers) && (strcmp(al->netid, netid) == 0)) { if ((uaddr == NULL) || (uaddr[0] == NULL)) al->failure++; else al->success++; return; } } nconf = rpcbind_get_conf(netid); if (nconf == NULL) { return; } al = (rpcbs_addrlist *) malloc(sizeof (rpcbs_addrlist)); if (al == NULL) { return; } al->prog = prog; al->vers = vers; al->netid = nconf->nc_netid; if ((uaddr == NULL) || (uaddr[0] == NULL)) { al->failure = 1; al->success = 0; } else { al->failure = 0; al->success = 1; } al->next = inf[rtype].addrinfo; inf[rtype].addrinfo = al; } void rpcbs_rmtcall(rtype, rpcbproc, prog, vers, proc, netid, rbl) u_long rtype; u_long rpcbproc; /* rpcbind proc number on which this was called */ u_long prog; u_long vers; u_long proc; char *netid; rpcblist_ptr rbl; { rpcbs_rmtcalllist *rl; struct netconfig *nconf; if (rtype > RPCBVERS_STAT) return; for (rl = inf[rtype].rmtinfo; rl; rl = rl->next) { if(rl->netid == NULL) return; if ((rl->prog == prog) && (rl->vers == vers) && (rl->proc == proc) && (strcmp(rl->netid, netid) == 0)) { if ((rbl == NULL) || (rbl->rpcb_map.r_vers != vers)) rl->failure++; else rl->success++; if (rpcbproc == RPCBPROC_INDIRECT) rl->indirect++; return; } } nconf = rpcbind_get_conf(netid); if (nconf == NULL) { return; } rl = (rpcbs_rmtcalllist *) malloc(sizeof (rpcbs_rmtcalllist)); if (rl == NULL) { return; } rl->prog = prog; rl->vers = vers; rl->proc = proc; rl->netid = nconf->nc_netid; if ((rbl == NULL) || (rbl->rpcb_map.r_vers != vers)) { rl->failure = 1; rl->success = 0; } else { rl->failure = 0; rl->success = 1; } rl->indirect = 1; rl->next = inf[rtype].rmtinfo; inf[rtype].rmtinfo = rl; return; } /* */ rpcb_stat_byvers * rpcbproc_getstat() { return (&inf); }