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

📄 interfaces.c

📁 包含一下内容: * An extensible agent * An SNMP library * tools to request or set information from SNMP a
💻 C
📖 第 1 页 / 共 4 页
字号:
	  if (if_list != 0)	    {	      free (if_list);	      if_list = 0;	    }	  if ((if_list = malloc (size)) == 0)	    {	      snmp_log(LOG_ERR,"out of memory allocating route table\n");	      return;	    }	  if_list_size = size;	}      else	{	  size = if_list_size;	}      if (sysctl (name, sizeof (name) / sizeof (int),		  if_list, &size, 0, 0) == -1)	{	  snmp_log(LOG_ERR,"sysctl get fail\n");	}      if_list_end = if_list + size;    }}u_char *var_ifEntry(struct variable *vp,	    oid *name,	    size_t *length,	    int exact,	    size_t *var_len,	    WriteMethod **write_method){  int interface;  struct if_msghdr if_msg;  static char if_name[100];  struct small_ifaddr sifa;  char * cp;  interface = header_ifEntry(vp, name, length, exact, var_len, write_method);  if ( interface == MATCH_FAILED )    return NULL;  if (Interface_Scan_By_Index(interface, &if_msg, if_name, &sifa) != 0)    return NULL;  switch (vp->magic) {  case IFINDEX:    long_return = interface;    return (u_char *) &long_return;  case IFDESCR:    cp = if_name;    *var_len = strlen (if_name);    return (u_char *) cp;  case IFTYPE:    long_return = (long) if_msg.ifm_data.ifi_type;    return (u_char *) &long_return;  case IFMTU:    long_return = (long) if_msg.ifm_data.ifi_mtu;    return (u_char *) &long_return;  case IFSPEED:#if STRUCT_IFNET_HAS_IF_BAUDRATE_IFS_VALUE     long_return = (u_long) if_msg.ifm_data.ifi_baudrate.ifs_value <<                           if_msg.ifm_data.ifi_baudrate.ifs_log2;#else    long_return = (u_long) if_msg.ifm_data.ifi_baudrate;#endif    return (u_char *) &long_return;  case IFPHYSADDRESS:    /* XXX */    return NULL;  case IFADMINSTATUS:    long_return = if_msg.ifm_flags & IFF_UP ? 1 : 2;    return (u_char *) &long_return;  case IFOPERSTATUS:    long_return = if_msg.ifm_flags & IFF_RUNNING ? 1 : 2;    return (u_char *) &long_return;    /* ifLastChange */  case IFINOCTETS:    long_return = (u_long) if_msg.ifm_data.ifi_ibytes;    return (u_char *) &long_return;  case IFINUCASTPKTS:    long_return = (u_long) if_msg.ifm_data.ifi_ipackets-if_msg.ifm_data.ifi_imcasts;    return (u_char *) &long_return;  case IFINNUCASTPKTS:    long_return = (u_long) if_msg.ifm_data.ifi_imcasts;    return (u_char *) &long_return;  case IFINDISCARDS:    long_return = (u_long) if_msg.ifm_data.ifi_iqdrops;    return (u_char *) &long_return;  case IFINERRORS:    long_return = (u_long) if_msg.ifm_data.ifi_ierrors;    return (u_char *) &long_return;  case IFINUNKNOWNPROTOS:    long_return = (u_long) if_msg.ifm_data.ifi_noproto;    return (u_char *) &long_return;  case IFOUTOCTETS:    long_return = (u_long) if_msg.ifm_data.ifi_obytes;    return (u_char *) &long_return;  case IFOUTUCASTPKTS:    long_return = (u_long) if_msg.ifm_data.ifi_opackets-if_msg.ifm_data.ifi_omcasts;    return (u_char *) &long_return;  case IFOUTNUCASTPKTS:    long_return = (u_long) if_msg.ifm_data.ifi_omcasts;    return (u_char *) &long_return;  case IFOUTDISCARDS:#ifdef if_odrops    long_return = (u_long) if_msg.ifm_data.ifi_odrops;#else#if NO_DUMMY_VALUES    return NULL;#endif    long_return = 0;#endif    return (u_char *) &long_return;  case IFOUTERRORS:    long_return = (u_long) if_msg.ifm_data.ifi_oerrors;    return (u_char *) &long_return;  case IFLASTCHANGE:#ifdef irix6      long_return = 0;#else    if (if_msg.ifm_data.ifi_lastchange.tv_sec == 0 &&	if_msg.ifm_data.ifi_lastchange.tv_usec == 0)      long_return = 0;    else if (if_msg.ifm_data.ifi_lastchange.tv_sec < starttime.tv_sec)      long_return = 0;    else {      long_return = (u_long)	((if_msg.ifm_data.ifi_lastchange.tv_sec - starttime.tv_sec) * 100	 + (if_msg.ifm_data.ifi_lastchange.tv_usec - starttime.tv_usec) / 10000);    }#endif    return (u_char *) &long_return;  default:    return 0;  }}int Interface_Scan_Next(short *Index,			char *Name,			struct ifnet *Retifnet,			struct in_ifaddr *Retin_ifaddr){  return 0;}#else /* not USE_SYSCTL_IFLIST */ 	/*********************	 *	 *  Kernel & interface information,	 *   and internal forward declarations	 *	 *********************/#ifndef HAVE_NET_IF_MIB_H#ifndef solaris2static int Interface_Scan_By_Index (int, char *, struct ifnet *, struct in_ifaddr *);static int Interface_Get_Ether_By_Index (int, u_char *);#endif	/*********************	 *	 *  System specific implementation functions	 *	 *********************/#ifndef solaris2#ifndef hpuxu_char *var_ifEntry(struct variable *vp,	    oid *name,	    size_t *length,	    int exact,	    size_t *var_len,	    WriteMethod **write_method){    static struct ifnet ifnet;    int interface;    static struct in_ifaddr in_ifaddr;    static char Name[16];    char *cp;    conf_if_list *if_ptr = conf_list;#if STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC    struct timeval now;#endif    interface = header_ifEntry(vp, name, length, exact, var_len, write_method);    if ( interface == MATCH_FAILED )	return NULL;    Interface_Scan_By_Index(interface, Name, &ifnet, &in_ifaddr);    while (if_ptr && strcmp(Name, if_ptr->name)) if_ptr = if_ptr->next;    switch (vp->magic){	case IFINDEX:	    long_return = interface;	    return (u_char *) &long_return;	case IFDESCR:	    cp = Name;	    *var_len = strlen(cp);	    return (u_char *)cp;	case IFTYPE:	    if (if_ptr) long_return = if_ptr->type;            else {#if STRUCT_IFNET_HAS_IF_TYPE                long_return = ifnet.if_type;#else                long_return = 1;	/* OTHER */#endif            }	    return (u_char *) &long_return;	case IFMTU: {	    long_return = (long) ifnet.if_mtu;	    return (u_char *) &long_return;	}	case IFSPEED:	    if (if_ptr) long_return = if_ptr->speed;	    else {#if STRUCT_IFNET_HAS_IF_BAUDRATE                long_return = ifnet.if_baudrate;#elif STRUCT_IFNET_HAS_IF_SPEED                long_return = ifnet.if_speed;#elif STRUCT_IFNET_HAS_IF_TYPE && defined(IFT_ETHER)		if(ifnet.if_type == IFT_ETHER) long_return=10000000;		if(ifnet.if_type == IFT_P10) long_return=10000000;		if(ifnet.if_type == IFT_P80) long_return=80000000;		if(ifnet.if_type == IFT_ISDNBASIC) long_return=64000; /* EDSS1 only */		if(ifnet.if_type == IFT_ISDNPRIMARY) long_return=64000*30;#else#if NO_DUMMY_VALUES                return NULL;#endif                long_return = (u_long) 10000000;#endif	    }	    return (u_char *) &long_return;	case IFPHYSADDRESS:	    Interface_Get_Ether_By_Index(interface, return_buf);	    *var_len = 6;	    if ((return_buf[0] == 0) && (return_buf[1] == 0) &&		(return_buf[2] == 0) && (return_buf[3] == 0) &&		(return_buf[4] == 0) && (return_buf[5] == 0))		*var_len = 0;	    return(u_char *) return_buf;	case IFADMINSTATUS:	    long_return = ifnet.if_flags & IFF_UP ? 1 : 2;	    return (u_char *) &long_return;	case IFOPERSTATUS:	    long_return = ifnet.if_flags & IFF_RUNNING ? 1 : 2;	    return (u_char *) &long_return;	case IFLASTCHANGE:#if defined(STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC) && !(defined(freebsd2) && __FreeBSD_version < 199607)/* XXX - SNMP's ifLastchange is time when op. status changed * FreeBSD's if_lastchange is time when packet was input or output * (at least in 2.1.0-RELEASE. Changed in later versions of the kernel?) *//* FreeBSD's if_lastchange before the 2.1.5 release is the time when * a packet was last input or output.  In the 2.1.5 and later releases, * this is fixed, thus the 199607 comparison. */          if (ifnet.if_lastchange.tv_sec == 0 &&              ifnet.if_lastchange.tv_usec == 0)            long_return = 0;	  else if (ifnet.if_lastchange.tv_sec < starttime.tv_sec)	    long_return = 0;          else {            long_return = (u_long)              ((ifnet.if_lastchange.tv_sec - starttime.tv_sec) * 100               + (ifnet.if_lastchange.tv_usec - starttime.tv_usec) / 10000);          }#else#if NO_DUMMY_VALUES	  return NULL;#endif          long_return = 0; /* XXX */#endif          return (u_char *) &long_return;	case IFINOCTETS:#ifdef STRUCT_IFNET_HAS_IF_IBYTES          long_return = (u_long)  ifnet.if_ibytes;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = (u_long)  ifnet.if_ipackets * 308; /* XXX */#endif	    return (u_char *) &long_return;	case IFINUCASTPKTS:	    {	    long_return = (u_long)  ifnet.if_ipackets;#if STRUCT_IFNET_HAS_IF_IMCASTS	    long_return -= (u_long) ifnet.if_imcasts;#endif	    }	    return (u_char *) &long_return;	case IFINNUCASTPKTS:#if STRUCT_IFNET_HAS_IF_IMCASTS	    long_return = (u_long)  ifnet.if_imcasts;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = (u_long)  0; /* XXX */#endif	    return (u_char *) &long_return;	case IFINDISCARDS:#if STRUCT_IFNET_HAS_IF_IQDROPS	    long_return = (u_long)  ifnet.if_iqdrops;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = (u_long)  0; /* XXX */#endif	    return (u_char *) &long_return;	case IFINERRORS:	    long_return = (u_long) ifnet.if_ierrors;	    return (u_char *) &long_return;	case IFINUNKNOWNPROTOS:#if STRUCT_IFNET_HAS_IF_NOPROTO	    long_return = (u_long)  ifnet.if_noproto;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = (u_long)  0; /* XXX */#endif	    return (u_char *) &long_return;	case IFOUTOCTETS:#ifdef STRUCT_IFNET_HAS_IF_OBYTES          long_return = (u_long)  ifnet.if_obytes;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = (u_long)  ifnet.if_opackets * 308; /* XXX */#endif	    return (u_char *) &long_return;	case IFOUTUCASTPKTS:	    {	    long_return = (u_long)  ifnet.if_opackets;#if STRUCT_IFNET_HAS_IF_OMCASTS	    long_return -= (u_long) ifnet.if_omcasts;#endif	    }	    return (u_char *) &long_return;	case IFOUTNUCASTPKTS:#if STRUCT_IFNET_HAS_IF_OMCASTS	    long_return = (u_long)  ifnet.if_omcasts;#else#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = (u_long)  0; /* XXX */#endif	    return (u_char *) &long_return;	case IFOUTDISCARDS:          long_return = ifnet.if_snd.ifq_drops;          return (u_char *) &long_return;	case IFOUTERRORS:          long_return = ifnet.if_oerrors;          return (u_char *) &long_return;	case IFOUTQLEN:          long_return = ifnet.if_snd.ifq_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;}#else /* hpux */u_char *var_ifEntry(struct variable *vp,	    oid *name,	    size_t *length,	    int exact,	    size_t *var_len,	    WriteMethod **write_method){    static struct ifnet ifnet;    register int interface;    static struct in_ifaddr in_ifaddrVar;    static char Name[16];    register char *cp;#if STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC          struct timeval now;#endif    struct nmparms hp_nmparms;    static mib_ifEntry hp_ifEntry;    int  hp_fd;    int  hp_len=sizeof(hp_ifEntry);    interface = header_ifEntry(vp, name, length, exact, var_len, write_method);    if ( interface == MATCH_FAILED )	return NULL;    Interface_Scan_By_Index(interface, Name, &ifnet, &in_ifaddrVar);	/*	 * Additional information about the interfaces is available under	 * HP-UX through the network management interface '/dev/netman'	 */    hp_ifEntry.ifIndex = interface;    hp_nmparms.objid  = ID_ifEntry;    hp_nmparms.buffer = (char *)&hp_ifEntry;    hp_nmparms.len    = &hp_len;    if ((hp_fd=open("/dev/netman", O_RDONLY)) != -1 ) {      if (ioctl(hp_fd, NMIOGET, &hp_nmparms) != -1 ) {          close(hp_fd);      }      else {          close(hp_fd);          hp_fd = -1;         /* failed */      }    }    switch (vp->magic){	case IFINDEX:	    long_return = interface;	    return (u_char *) &long_return;	case IFDESCR:	  if ( hp_fd != -1 )	    cp = hp_ifEntry.ifDescr;	  else	    cp = Name;	    *var_len = strlen(cp);	    return (u_char *)cp;	case IFTYPE:	      if ( hp_fd != -1 )		long_return = hp_ifEntry.ifType;	      else		long_return = 1;	/* OTHER */	    return (u_char *) &long_return;	case IFMTU: {	    long_return = (long) ifnet.if_mtu;	    return (u_char *) &long_return;	}	case IFSPEED:	    if ( hp_fd != -1 )		long_return = hp_ifEntry.ifSpeed;	    else	        long_return = (u_long)  1;	/* OTHER */	    return (u_char *) &long_return;	case IFPHYSADDRESS:		Interface_Get_Ether_By_Index(interface, return_buf);		*var_len = 6;	        if ((return_buf[0] == 0) && (return_buf[1] == 0) &&		    (return_buf[2] == 0) && (return_buf[3] == 0) &&		    (return_buf[4] == 0) && (return_buf[5] == 0))		    *var_len = 0;		return(u_char *) return_buf;	case IFADMINSTATUS:	    long_return = ifnet.if_flags & IFF_UP ? 1 : 2;	    return (u_char *) &long_return;	case IFOPERSTATUS:	    long_return = ifnet.if_flags & IFF_RUNNING ? 1 : 2;	    return (u_char *) &long_return;	case IFLASTCHANGE:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifLastChange;	  else          long_return = 0; /* XXX */          return (u_char *) &long_return;	case IFINOCTETS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifInOctets;	  else	    long_return = (u_long)  ifnet.if_ipackets * 308; /* XXX */	  return (u_char *) &long_return;	case IFINUCASTPKTS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifInUcastPkts;	  else	    long_return = (u_long)  ifnet.if_ipackets;	  return (u_char *) &long_return;	case IFINNUCASTPKTS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifInNUcastPkts;	  else	    long_return = (u_long)  0; /* XXX */	    return (u_char *) &long_return;	case IFINDISCARDS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifInDiscards;	  else	    long_return = (u_long)  0; /* XXX */	    return (u_char *) &long_return;	case IFINERRORS:	    return (u_char *) &ifnet.if_ierrors;	case IFINUNKNOWNPROTOS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifInUnknownProtos;	  else	    long_return = (u_long)  0; /* XXX */	    return (u_char *) &long_return;	case IFOUTOCTETS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifOutOctets;	  else	    long_return = (u_long)  ifnet.if_opackets * 308; /* XXX */	    return (u_char *) &long_return;	case IFOUTUCASTPKTS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifOutUcastPkts;	  else	    long_return = (u_long)  ifnet.if_opackets;	    return (u_char *) &long_return;	case IFOUTNUCASTPKTS:	  if ( hp_fd != -1 )	    long_return = hp_ifEntry.ifOutNUcastPkts;	  else	    long_return = (u_long)  0; /* XXX */	    return (u_char *) &long_return;	case IFOUTDISCARDS:	    return (u_char *) &ifnet.if_snd.ifq_drops;	case IFOUTERRORS:	    return (u_char *) &ifnet.if_oerrors;	case IFOUTQLEN:	    return (u_char *) &ifnet.if_snd.ifq_len;	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 /* hpux */#else /* solaris2 */static intIF_cmp(void *addr, void *ep){    DEBUGMSGTL(("mibII/interfaces", "... IF_cmp %d %d\n",     ((mib2_ifEntry_t *)ep)->ifIndex, ((mib2_ifEntry_t *)addr)->ifIndex));    if (((mib2_ifEntry_t *)ep)->ifIndex == ((mib2_ifEntry_t *)addr)->ifIndex)	return (0);    else	return (1);}u_char *var_ifEntry(struct variable *vp,	    oid *name,	    size_t *length,	    int exact,	    size_t *var_len,	    WriteMethod **write_method){    int        interface;    mib2_ifEntry_t      ifstat;    interface = header_ifEntry(vp, name, length, exact, var_len, write_method);    if ( interface == MATCH_FAILED )	return NULL;

⌨️ 快捷键说明

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