⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipaddr.c

📁 Snmp(简单网管协议)软件包。
💻 C
字号:
/* *  IP MIB group implementation - ip.c * */#include <config.h>#include "mibincl.h"#if defined(IFNET_NEEDS_KERNEL) && !defined(_KERNEL)#define _KERNEL 1#define _I_DEFINED_KERNEL#endif#if HAVE_SYS_PARAM_H#include <sys/param.h>#endif#include <sys/socket.h>#if HAVE_STRING_H#include <string.h>#endif#if HAVE_SYS_SYSCTL_H#ifdef _I_DEFINED_KERNEL#undef _KERNEL#endif#include <sys/sysctl.h>#ifdef _I_DEFINED_KERNEL#define _KERNEL 1#endif#endif#if HAVE_SYS_SYSMP_H#include <sys/sysmp.h>#endif#if HAVE_SYS_TCPIPSTATS_H#include <sys/tcpipstats.h>#endif#include <net/if.h>#if HAVE_NET_IF_VAR_H#include <net/if_var.h>#endif#ifdef _I_DEFINED_KERNEL#undef _KERNEL#endif#if HAVE_NETINET_IN_SYSTM_H#include <netinet/in_systm.h>#endif#if HAVE_SYS_HASHING_H#include <sys/hashing.h>#endif#if HAVE_NETINET_IN_VAR_H#include <netinet/in_var.h>#endif#include <netinet/ip.h>#if HAVE_NETINET_IP_VAR_H#include <netinet/ip_var.h>#endif#if HAVE_INET_MIB2_H#include <inet/mib2.h>#endif#if HAVE_SYS_STREAM_H#include <sys/stream.h>#endif#include <net/route.h>#if HAVE_SYSLOG_H#include <syslog.h>#endif#ifdef solaris2#include "kernel_sunos5.h"#else#include "kernel.h"#endif#include "system.h"#include "auto_nlist.h"#ifdef MIB_IPCOUNTER_SYMBOL#include <sys/mib.h>#include <netinet/mib_kern.h>#endif /* MIB_IPCOUNTER_SYMBOL */#include "util_funcs.h"#include "ipAddr.h"#include "interfaces.h"#ifndef IPADDR_TABLE_CACHE_TIMEOUT#define IPADDR_TABLE_CACHE_TIMEOUT MIB_STATS_CACHE_TIMEOUT#endif       mib_table_t ipAddr_table;extern mib_table_t interface_table;	/*********************	 *	 *  Kernel & interface information,	 *   and internal forward declarations	 *	 *********************/#include "if_fields.h"IFADDR_TYPE* search_ipAddr(oid*, int, int, int *);int load_ipAddr_table( mib_table_t );int ipAddr_compare(const void*, const void *);	/*********************	 *	 *  Initialisation	 *	 *********************/struct variable2 ipAddr_variables[] = {    {IPADADDR,      ASN_IPADDRESS, RONLY, var_ipAddrEntry, 1, {1}},    {IPADIFINDEX,   ASN_INTEGER,   RONLY, var_ipAddrEntry, 1, {2}},    {IPADNETMASK,   ASN_IPADDRESS, RONLY, var_ipAddrEntry, 1, {3}},    {IPADBCASTADDR, ASN_INTEGER,   RONLY, var_ipAddrEntry, 1, {4}},    {IPADREASMMAX,  ASN_INTEGER,   RONLY, var_ipAddrEntry, 1, {5}},};oid ipAddr_variables_oid[] = { SNMP_OID_MIB2,4,20,1 };voidinit_ipAddr( void ){    REGISTER_MIB("mibII/ipAddr", ipAddr_variables, variable2, ipAddr_variables_oid);    ipAddr_table = Initialise_Table( sizeof( struct if_entry* ),				     IPADDR_TABLE_CACHE_TIMEOUT,				     load_ipAddr_table, ipAddr_compare );}	/*********************	 *	 *   Main variable handling routine	 *	 *********************/u_char *var_ipAddrEntry(struct variable *vp,	     oid *name,	     size_t *length,	     int exact,	     size_t *var_len,	     WriteMethod **write_method){    int i, idx;    oid newname[MAX_OID_LEN], *op;    u_char *cp;    IFADDR_TYPE* ipAddrEntry;		/*		 * Check the name given in the request,		 *  and indentify the index part of it		 */    switch (snmp_oid_compare(name, MIN(*length, vp->namelen),			     vp->name, vp->namelen)) {	case -1:	/* name given is earlier than this table */		if ( exact )		    return NULL;		op = NULL;		i = 0;		break;	case 0:		/* name given matches this table */		op = &name[vp->namelen];		i  = *length - vp->namelen;		break;	case 1:		/* name given is later than this table */		return NULL;	default:	/* Can't happen */		return NULL;    }    		/*		 *  Search for the relevant IP address entry,		 *   either the index just identified,		 *   or the next one, depending on whether		 *   this is an exact match or not.		 */    ipAddrEntry = search_ipAddr( op, i, exact, &idx );    if ( !ipAddrEntry )	return NULL;		/*		 * We've found something we can use.		 *  Update the 'newname' with the relevant index		 */    memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid));    cp = (u_char *)&(SOCKADDR(ipAddrEntry->IPADDR_ADDRESS_FIELD));    op = newname + vp->namelen;    *op++ = *cp++;    *op++ = *cp++;    *op++ = *cp++;    *op++ = *cp++;       memcpy( (char *)name,(char *)newname, ((int)vp->namelen + 4) * sizeof(oid));    *length = vp->namelen + 4;    *write_method = 0;    *var_len = sizeof(long_return);    switch (vp->magic) {	case IPADADDR:	    long_return = SOCKADDR(ipAddrEntry->IPADDR_ADDRESS_FIELD);	    return(u_char *) &long_return;	case IPADIFINDEX:	    long_return = idx;	    return(u_char *) &long_return;	case IPADNETMASK:	    long_return = SOCKADDR(ipAddrEntry->IPADDR_NETMASK_FIELD);	    return(u_char *) &long_return;	case IPADBCASTADDR:	    long_return = SOCKADDR(ipAddrEntry->IPADDR_BCAST_FIELD) & 1;	    return(u_char *) &long_return;	case IPADREASMMAX:	    return NULL;	default:	    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ipAddrEntry\n", vp->magic));    }    return  NULL;}	/*********************	 *	 *  System-independent implementation functions	 *    (N.B: the system-specifics are	 *	handled by the interface group)	 *	 *********************/		/*		 *  The list of IP Address entries is simply		 *    a list of pointers to the various		 *    interface entries, sorted by Address.		 */intload_ipAddr_table( mib_table_t t ){    int max_idx, i;    struct if_entry *ifTable, *pentry;    ifTable = Retrieve_Table_Data( interface_table, &max_idx );    if ( ifTable == NULL )	return -1;    for ( i = 1 ; i <= max_idx ; i++ ) {	pentry = &(ifTable[i]);	if (Add_Entry( t, (void*)&pentry) < 0 )	    break;    }    return 0;}		/*		 *  Search the list of IP Address entries and return		 *    the appropriate one for this query		 */IFADDR_TYPE* search_ipAddr(oid* idx, int idx_len, int exact, int *ret_idx){    static struct if_entry entry, *pentry;    IFADDR_TYPE ipaddr;    int i, max_i;    char *cp;    oid  *op;    if ( exact && idx_len != 4 )	return NULL;    entry.ifaddr = &ipaddr;    SOCKADDR(entry.ifaddr->IPADDR_ADDRESS_FIELD) = 0;    max_i = SNMP_MIN( idx_len, 4 );    cp = (u_char *)&(SOCKADDR(entry.ifaddr->IPADDR_ADDRESS_FIELD));    op = idx;    for ( i = 0 ; i< max_i ; i++ )	*cp++ = *op++;    pentry = &entry;    if ( Search_Table( ipAddr_table, (void*)&pentry, exact ) == 0 ) {	*ret_idx = pentry->index;	return (pentry->ifaddr);    }    else	return NULL;}		/*		 *  Compare two Interface entries by IP Address		 */intipAddr_compare(const void* first, const void* second){    const struct if_entry *if1 = *(const struct if_entry **) first;    const struct if_entry *if2 = *(const struct if_entry **) second;    if ( if1 == NULL || if1->ifaddr == NULL)	return 1;    if ( if2 == NULL || if2->ifaddr == NULL)	return -1;    return (SOCKADDR(if1->ifaddr->IPADDR_ADDRESS_FIELD) -	    SOCKADDR(if2->ifaddr->IPADDR_ADDRESS_FIELD));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -