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

📄 interfaces.c

📁 包含一下内容: * An extensible agent * An SNMP library * tools to request or set information from SNMP a
💻 C
📖 第 1 页 / 共 4 页
字号:
	    }	    if (i != Index) return(-1);     /* Error, doesn't exist */	}#ifdef freebsd2	    if (saveifnet.if_type != IFT_ETHER)	    {		return(0);	/* Not an ethernet if */	    }#endif	/*	 *  the arpcom structure is an extended ifnet structure which	 *  contains the ethernet address.	 */#ifndef linux#if !(defined(netbsd1) || defined(bsdi2) || defined(openbsd2))      klookup((unsigned long)saveifnetaddr, (char *)&arpcom, sizeof arpcom);#else  /* netbsd1 or bsdi2 or openbsd2 */#if defined(netbsd1) || defined(openbsd2)#define if_addrlist if_addrlist.tqh_first#define ifa_next    ifa_list.tqe_next#endif        ifaddraddr = (unsigned long)saveifnet.if_addrlist;        while (ifaddraddr) {          klookup(ifaddraddr, (char *)&ifaddr, sizeof ifaddr);          klookup((unsigned long)ifaddr.ifa_addr, (char *)&sadl, sizeof sadl);          if (sadl.sdl_family == AF_LINK &&              (saveifnet.if_type == IFT_ETHER ||               saveifnet.if_type == IFT_ISO88025 ||               saveifnet.if_type == IFT_FDDI)) {            memcpy(arpcom.ac_enaddr, sadl.sdl_data + sadl.sdl_nlen,                   sizeof(arpcom.ac_enaddr));          break;          }          ifaddraddr = (unsigned long)ifaddr.ifa_next;        }#endif /* netbsd1 or bsdi2 or openbsd2 */#else /* linux */	memcpy(arpcom.ac_enaddr, saveifnetaddr->if_hwaddr, 6);#endif	if (strncmp("lo", saveName, 2) == 0) {	    /*	     *  Loopback doesn't have a HW addr, so return 00:00:00:00:00:00	     */	    memset(EtherAddr, 0, sizeof(arpcom.ac_enaddr));	} else {#if defined(mips) || defined(hpux) || defined(osf4) || defined(osf3)          memcpy( EtherAddr,(char *) arpcom.ac_enaddr, sizeof (arpcom.ac_enaddr));#else          memcpy( EtherAddr,(char *) &arpcom.ac_enaddr, sizeof (arpcom.ac_enaddr));#endif	}	return(0);	/* DONE */}#else /* solaris2 */static int Interface_Scan_Get_Count (void){	int i, sd;	if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)	  return (0);	if (ioctl(sd, SIOCGIFNUM, &i) == -1) {	  close(sd);	  return (0);	} else {	  close(sd);	  return (i);	}}intInterface_Index_By_Name(char *Name, 			int Len){	int i, sd, ret;	char buf[1024];	struct ifconf ifconf;	struct ifreq *ifrp;	if (Name == 0)	  return (0);	if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)	  return (0);	ifconf.ifc_buf = buf;	ifconf.ifc_len = sizeof(buf);	if (ioctl(sd, SIOCGIFCONF, &ifconf) == -1) {	  ret = 0;	  goto Return;	}	for (i = 1, ifrp = ifconf.ifc_req, ret = 0;	     (char *)ifrp < (char *)ifconf.ifc_buf + ifconf.ifc_len; i++, ifrp++)	  if (strncmp(Name, ifrp->ifr_name, Len) == 0) {	    ret = i;	    break;	  } else	    ret = 0;      Return:	close(sd);	return (ret);	/* DONE */}#endif /* solaris2 */#else /* HAVE_NET_IF_MIB_H *//* * This code attempts to do the right thing for FreeBSD.  Note that * the statistics could be gathered through use of of the * net.route.0.link.iflist.0 sysctl (which we already use to get the * hardware address of the interfaces), rather than using the ifmib * code, but eventually I will implement dot3Stats and we will have to * use the ifmib interface.  ifmib is also a much more natural way of * mapping the SNMP MIB onto sysctl(3). */#include <net/if.h>#include <net/if_dl.h>#include <net/if_mib.h>#include <net/route.h>static int header_interfaces(struct variable *, oid *, size_t *, int, size_t *,                             WriteMethod **write);static int header_ifEntry(struct variable *, oid *, size_t *, int, size_t *,                             WriteMethod **write);u_char	*var_ifEntry(struct variable *, oid *, size_t *, int, size_t *,                              WriteMethod **write);static	char *physaddrbuf;static	int nphysaddrs;struct	sockaddr_dl **physaddrs;void init_interfaces_setup(void){	int naddrs, ilen, bit;	static int mib[6] 		= { CTL_NET, PF_ROUTE, 0, AF_LINK, NET_RT_IFLIST, 0 };	char *cp;	size_t len;	struct rt_msghdr *rtm;	struct if_msghdr *ifm;	struct ifa_msghdr *ifam;	struct sockaddr *sa;	naddrs = 0;	if (physaddrs)		free(physaddrs);	if (physaddrbuf)		free(physaddrbuf);	physaddrbuf = 0;	physaddrs = 0;	nphysaddrs = 0;	len = 0;	if (sysctl(mib, 6, 0, &len, 0, 0) < 0)		return;	cp = physaddrbuf = malloc(len);	if (physaddrbuf == 0)		return;	if (sysctl(mib, 6, physaddrbuf, &len, 0, 0) < 0) {		free(physaddrbuf);		physaddrbuf = 0;		return;	}loop:	ilen = len;	cp = physaddrbuf;	while (ilen > 0) {		rtm = (struct rt_msghdr *)cp;		if (rtm->rtm_version != RTM_VERSION 		    || rtm->rtm_type != RTM_IFINFO) {			free(physaddrs);			physaddrs = 0;			free(physaddrbuf);			physaddrbuf = 0;		}		ifm = (struct if_msghdr *)rtm;		ilen -= ifm->ifm_msglen;		cp += ifm->ifm_msglen;		rtm = (struct rt_msghdr *)cp;		while (ilen > 0 && rtm->rtm_type == RTM_NEWADDR) {			int is_alias = 0;			ifam = (struct ifa_msghdr *)rtm;			ilen -= sizeof(*ifam);			cp += sizeof(*ifam);			sa = (struct sockaddr *)cp;#define ROUND(x) (((x) + sizeof(long) - 1) & ~sizeof(long))			for (bit = 1; bit && ilen > 0; bit <<= 1) {				if (!(ifam->ifam_addrs & bit))					continue;				ilen -= ROUND(sa->sa_len);				cp += ROUND(sa->sa_len);				if (bit == RTA_IFA) {					if (physaddrs)#define satosdl(sa) ((struct sockaddr_dl *)(sa))						physaddrs[naddrs++] 							= satosdl(sa);					else						naddrs++;				}				sa = (struct sockaddr *)cp;			}			rtm = (struct rt_msghdr *)cp;		}	}	if (physaddrs) {		nphysaddrs = naddrs;		return;	}	physaddrs = malloc(naddrs * sizeof(*physaddrs));	if (physaddrs == 0)		return;	naddrs = 0;	goto loop;	}static intget_phys_address(int iindex, char **ap, int *len){	int i;	int once = 1;	do {		for (i = 0; i < nphysaddrs; i++) {			if (physaddrs[i]->sdl_index == iindex)				break;		}		if (i < nphysaddrs)			break;		init_interfaces_setup();	} while (once--);	if (i < nphysaddrs) {		*ap = LLADDR(physaddrs[i]);		*len = physaddrs[i]->sdl_alen;		return 0;	}	return -1;}static intInterface_Scan_Get_Count (void){    static int count_oid[5] = { CTL_NET, PF_LINK, NETLINK_GENERIC, 				IFMIB_SYSTEM, IFMIB_IFCOUNT };    size_t len;    int count;    len = sizeof count;    if (sysctl(count_oid, 5, &count, &len, (void *)0, (size_t)0) < 0)	    return -1;    return count;}u_char *var_ifEntry(struct variable *vp,	    oid *name,	    size_t *length,	    int exact,	    size_t *var_len,	    WriteMethod **write_method){	int interface;	static int sname[6] = { CTL_NET, PF_LINK, NETLINK_GENERIC,			       IFMIB_IFDATA, 0, IFDATA_GENERAL };	static struct ifmibdata ifmd;	size_t len;	char *cp;	interface = header_ifEntry(vp, name, length, exact, var_len,				   write_method);	if (interface == MATCH_FAILED)		return NULL;	sname[4] = interface;	len = sizeof ifmd;	if (sysctl(sname, 6, &ifmd, &len, 0, 0) < 0)		return NULL;		switch (vp->magic) {	case IFINDEX:		long_return = interface;		return (u_char *) &long_return;	case IFDESCR:		cp = ifmd.ifmd_name;		*var_len = strlen(cp);		return (u_char *)cp;	case IFTYPE:		long_return = ifmd.ifmd_data.ifi_type;		return (u_char *) &long_return;	case IFMTU:		long_return = (long) ifmd.ifmd_data.ifi_mtu;		return (u_char *) &long_return;	case IFSPEED:		long_return = ifmd.ifmd_data.ifi_baudrate;		return (u_char *) &long_return;	case IFPHYSADDRESS:	{		char *cp;		if (get_phys_address(interface, &cp, var_len))			return NULL;		else			return cp;	}	case IFADMINSTATUS:		long_return = ifmd.ifmd_flags & IFF_UP ? 1 : 2;		return (u_char *) &long_return;	case IFOPERSTATUS:		long_return = ifmd.ifmd_flags & IFF_RUNNING ? 1 : 2;		return (u_char *) &long_return;	case IFLASTCHANGE:		if (ifmd.ifmd_data.ifi_lastchange.tv_sec == 0 &&		    ifmd.ifmd_data.ifi_lastchange.tv_usec == 0) {			long_return = 0;		else if (ifmd.ifmd_data.ifi_lastchange.tv_sec < starttime.tv_sec)		    long_return = 0;		} else {		    long_return = (u_long)			((ifmd.ifmd_data.ifi_lastchange.tv_sec - starttime.tv_sec) * 100			 + ((ifmd.ifmd_data.ifi_lastchange.tv_usec - starttime.tv_usec) / 10000));		}		return (u_char *) &long_return;	case IFINOCTETS:		long_return = (u_long)  ifmd.ifmd_data.ifi_ibytes;		return (u_char *) &long_return;	case IFINUCASTPKTS:		long_return = (u_long)  ifmd.ifmd_data.ifi_ipackets;		long_return -= (u_long) ifmd.ifmd_data.ifi_imcasts;		return (u_char *) &long_return;	case IFINNUCASTPKTS:		long_return = (u_long)  ifmd.ifmd_data.ifi_imcasts;		return (u_char *) &long_return;	case IFINDISCARDS:		long_return = (u_long)  ifmd.ifmd_data.ifi_iqdrops;		return (u_char *) &long_return;	case IFINERRORS:		long_return = ifmd.ifmd_data.ifi_ierrors;		return (u_char *) &long_return;	case IFINUNKNOWNPROTOS:		long_return = (u_long)  ifmd.ifmd_data.ifi_noproto;		return (u_char *) &long_return;	case IFOUTOCTETS:		long_return = (u_long)  ifmd.ifmd_data.ifi_obytes;		return (u_char *) &long_return;	case IFOUTUCASTPKTS:		long_return = (u_long)  ifmd.ifmd_data.ifi_opackets;		long_return -= (u_long) ifmd.ifmd_data.ifi_omcasts;		return (u_char *) &long_return;	case IFOUTNUCASTPKTS:		long_return = (u_long)  ifmd.ifmd_data.ifi_omcasts;		return (u_char *) &long_return;	case IFOUTDISCARDS:		long_return = ifmd.ifmd_snd_drops;		return (u_char *) &long_return;	case IFOUTERRORS:		long_return = ifmd.ifmd_data.ifi_oerrors;		return (u_char *) &long_return;	case IFOUTQLEN:		long_return = ifmd.ifmd_snd_len;		return (u_char *) &long_return;	case IFSPECIFIC:		*var_len = nullOidLen;		return (u_char *) nullOid;	default:		DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ifEntry\n", vp->magic));	}	return NULL;}#endif /* HAVE_NET_IF_MIB_H */#endif#else /* WIN32 */#include <iphlpapi.h>static intheader_ifEntry(struct variable *vp,	       oid *name,	       size_t *length,	       int exact,	       size_t *var_len,	       WriteMethod **write_method){#define IFENTRY_NAME_LENGTH	10    oid newname[MAX_OID_LEN];    register int	ifIndex;    int result, count;    DWORD status = NO_ERROR;    DWORD statusRetry = NO_ERROR;    DWORD dwActualSize = 0;    PMIB_IFTABLE pIfTable = NULL;     DEBUGMSGTL(("mibII/interfaces", "var_ifEntry: "));    DEBUGMSGOID(("mibII/interfaces", name, *length));    DEBUGMSG(("mibII/interfaces"," %d\n", exact));        memcpy( (char *)newname,(char *)vp->name, (int)vp->namelen * sizeof(oid));    /* find "next" ifIndex */    /* *****Check if caching is NECESSARY****************** */    /* query for buffer size needed */    status = GetIfTable(pIfTable, &dwActualSize, TRUE);    if (status == ERROR_INSUFFICIENT_BUFFER)    {        /* need more space */        pIfTable = (PMIB_IFTABLE) malloc(dwActualSize);        if(pIfTable != NULL){                 /* Get the sorted IF table */            GetIfTable(pIfTable, &dwActualSize, TRUE);        }    }    count = pIfTable->dwNumEntries;    for(ifIndex = 0; ifIndex < count; ifIndex++){      	newname[IFENTRY_NAME_LENGTH] = (oid)pIfTable->table[ifIndex].dwIndex;	      result = snmp_oid_compare(name, *length, newname, (int)vp->namelen + 1);	      if ((exact && (result == 0)) || (!exact && (result < 0)))	         break;    }    if (ifIndex > count) {        DEBUGMSGTL(("mibII/interfaces", "... index out of range\n"));        return MATCH_FAILED;    }    memcpy( (char *)name,(char *)newname, ((int)vp->namelen + 1) * sizeof(oid));    *length = vp->namelen + 1;    *write_method = 0;    *var_len = sizeof(long);	/* default to 'long' results */    DEBUGMSGTL(("mibII/interfaces", "... get I/F stats "));    DEBUGMSGOID(("mibII/interfaces", name, *length));    DEBUGMSG(("mibII/interfaces","\n"));    count = pIfTable->table[ifIndex].dwIndex;    free(pIfTable);    return count;}u_char *var_interfaces(struct variable *vp,	       oid *name,	       size_t *length,	       int exact,	       size_t *var_len,	       WriteMethod **write_method){  if (header_generic(vp, name, length, exact, var_len, write_method) == MATCH_FAILED )    return NULL;  switch (vp->magic)    {    case IFNUMBER:      GetNumberOfInterfaces(&long_return);      return (u_char *)&long_return;    default:      DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_interfaces\n", vp->magic));    }  return NULL;}u_char *var_ifEntry(struct variable *vp,	    oid *name,	    size_t *length,	    int exact,	    size_t *var_len,	    WriteMethod **write_method){    int ifIndex;    static char Name[16];    conf_if_list *if_ptr = conf_list;    MIB_IFROW ifRow;    ifIndex = header_ifEntry(vp, name, length, exact, var_len, write_method);    if ( ifIndex == MATCH_FAILED )	      return NULL;    ifRow.dwIndex = ifIndex;    /* Get the If Table Row by passing index as argument */    if(GetIfEntry(&ifRow) != NO_ERROR)      return NULL;    switch (vp->magic){	case IFINDEX:	    long_return = ifIndex;	    return (u_char *) &long_return;	case IFDESCR:	    *var_len = ifRow.dwDescrLen;	    return (u_char *)ifRow.bDescr;	case IFTYPE:	    long_return = ifRow.dwType;	    return (u_char *) &long_return;	case IFMTU: 	    long_return = (long) ifRow.dwMtu;	    return (u_char *) &long_return;	case IFSPEED:      long_return = (long) ifRow.dwSpeed;	    return (u_char *) &long_return;	case IFPHYSADDRESS:	    *var_len = ifRow.dwPhysAddrLen;      memcpy(return_buf, ifRow.bPhysAddr, *var_len);	    return(u_char *) return_buf;	case IFADMINSTATUS:	    long_return = ifRow.dwAdminStatus;	    return (u_char *) &long_return;	case IFOPERSTATUS:	    long_return = ifRow.dwOperStatus;	    return (u_char *) &long_return;	case IFLASTCHANGE:          long_return = ifRow.dwLastChange;           return (u_char *) &long_return;	case IFINOCTETS:	    long_return = ifRow.dwInOctets;	    return (u_char *) &long_return;	case IFINUCASTPKTS:	    long_return = ifRow.dwInUcastPkts;	    return (u_char *) &long_return;	case IFINNUCASTPKTS:	    long_return = ifRow.dwInNUcastPkts; 	    return (u_char *) &long_return;	case IFINDISCARDS:      long_return = ifRow.dwInDiscards; 	    return (u_char *) &long_return;	case IFINERRORS:	    long_return = ifRow.dwInErrors;	    return (u_char *) &long_return;	case IFINUNKNOWNPROTOS:	    long_return = ifRow.dwInUnknownProtos;	    return (u_char *) &long_return;	case IFOUTOCTETS:	    long_return = ifRow.dwOutOctets;	    return (u_char *) &long_return;	case IFOUTUCASTPKTS:	    long_return = ifRow.dwOutUcastPkts;	    return (u_char *) &long_return;	case IFOUTNUCASTPKTS:	    long_return = ifRow.dwOutNUcastPkts;	    return (u_char *) &long_return;	case IFOUTDISCARDS:      long_return = ifRow.dwOutDiscards;      return (u_char *) &long_return;	case IFOUTERRORS:      long_return = ifRow.dwOutErrors;      return (u_char *) &long_return;	case IFOUTQLEN:      long_return = ifRow.dwOutQLen;      return (u_char *) &long_return;	case IFSPECIFIC:	    *var_len = nullOidLen;	    return (u_char *) nullOid;	default:	    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ifEntry\n", vp->magic));    }    return NULL;}#endif  /* WIN32 */

⌨️ 快捷键说明

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