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

📄 var_route.c

📁 Snmp(简单网管协议)软件包。
💻 C
📖 第 1 页 / 共 4 页
字号:
	  size = all_routes_size;	}      if (sysctl (name, sizeof (name) / sizeof (int),		  all_routes, &size, 0, 0) == -1)	{	  snmp_log(LOG_ERR, "sysctl(CTL_NET,PF_ROUTE,0,0,NET_RT_DUMP,0)\n");	}      all_routes_end = all_routes + size;    }}#else /* not USE_SYSCTL_ROUTE_DUMP */void init_var_route(void){#ifdef RTTABLES_SYMBOL  auto_nlist(RTTABLES_SYMBOL,0,0);#endif#ifdef RTHASHSIZE_SYMBOL  auto_nlist(RTHASHSIZE_SYMBOL,0,0);#endif#ifdef RTHOST_SYMBOL  auto_nlist(RTHOST_SYMBOL,0,0);#endif#ifdef RTNET_SYMBOL  auto_nlist(RTNET_SYMBOL,0,0);#endif}#ifndef solaris2#if NEED_KLGETSAstatic union {    struct  sockaddr_in sin;    u_short data[128];} klgetsatmp;struct sockaddr_in *klgetsa(struct sockaddr_in *dst){  klookup((u_long)dst, (char *)&klgetsatmp.sin, sizeof klgetsatmp.sin);  if (klgetsatmp.sin.sin_len > sizeof (klgetsatmp.sin))    klookup((u_long)dst, (char *)&klgetsatmp.sin, klgetsatmp.sin.sin_len);  return(&klgetsatmp.sin);}#endifu_char *var_ipRouteEntry(struct variable *vp,		oid *name,		size_t *length,		int exact,		size_t *var_len,		WriteMethod **write_method){    /*     * object identifier is of form:     * 1.3.6.1.2.1.4.21.1.1.A.B.C.D,  where A.B.C.D is IP address.     * IPADDR starts at offset 10.     */    register int Save_Valid, result, RtIndex;    static int saveNameLen=0, saveExact=0, saveRtIndex=0;    static oid saveName[MAX_OID_LEN], Current[MAX_OID_LEN];    u_char *cp;    oid *op;#if NEED_KLGETSA    struct sockaddr_in *sa;#endif#ifndef linux    struct ifnet     rt_ifnet;    struct in_ifaddr rt_ifnetaddr;#endif    /**      ** this optimisation fails, if there is only a single route avail.     ** it is a very special case, but better leave it out ...     **/#if NO_DUMMY_VALUES      saveNameLen = 0;#endif    if (rtsize <= 1)      Save_Valid = 0;    else    /*     *	OPTIMIZATION:     *     *	If the name was the same as the last name, with the possible     *	exception of the [9]th token, then don't read the routing table     *     */    if ((saveNameLen == *length) && (saveExact == exact)) {	register int temp=name[9];	name[9] = 0;	Save_Valid = (snmp_oid_compare(name, *length, saveName, saveNameLen) == 0);	name[9] = temp;    } else	Save_Valid = 0;    if (Save_Valid) {	register int temp=name[9];    /* Fix up 'lowest' found entry */	memcpy( (char *) name,(char *) Current, 14 * sizeof(oid));	name[9] = temp;	*length = 14;	RtIndex = saveRtIndex;    } else {	/* fill in object part of name for current (less sizeof instance part) */	memcpy( (char *)Current,(char *)vp->name, (int)(vp->namelen) * sizeof(oid));#if 0	/*	 *  Only reload if this is the start of a wildcard	 */	if (*length < 14) {	    Route_Scan_Reload();	}#else        Route_Scan_Reload();#endif	for(RtIndex=0; RtIndex < rtsize; RtIndex++) {#if NEED_KLGETSA	    sa = klgetsa((struct sockaddr_in *) rthead[RtIndex]->rt_dst);	    cp = (u_char *) &(sa->sin_addr.s_addr);#else	    cp = (u_char *)&(((struct sockaddr_in *) &(rthead[RtIndex]->rt_dst))->sin_addr.s_addr);#endif	    op = Current + 10;	    *op++ = *cp++;	    *op++ = *cp++;	    *op++ = *cp++;	    *op++ = *cp++;	    result = snmp_oid_compare(name, *length, Current, 14);	    if ((exact && (result == 0)) || (!exact && (result < 0)))		break;	}	if (RtIndex >= rtsize)	    return(NULL);	/*	 *  Save in the 'cache'	 */	memcpy( (char *) saveName,(char *) name, SNMP_MIN(*length,MAX_OID_LEN) * sizeof(oid));	saveName[9] = 0;	saveNameLen = *length;	saveExact = exact;	saveRtIndex = RtIndex;	/*	 *  Return the name	 */	memcpy( (char *) name,(char *) Current, 14 * sizeof(oid));	*length = 14;    }    *write_method = write_rte;    *var_len = sizeof(long_return);    switch(vp->magic){	case IPROUTEDEST:#if NEED_KLGETSA	    sa = klgetsa((struct sockaddr_in *) rthead[RtIndex]->rt_dst);	    return(u_char *) &(sa->sin_addr.s_addr);#else	    return(u_char *) &((struct sockaddr_in *) &rthead[RtIndex]->rt_dst)->sin_addr.s_addr;#endif	case IPROUTEIFINDEX:	    long_return = (u_long)rthead[RtIndex]->rt_unit;	    return (u_char *)&long_return;	case IPROUTEMETRIC1:	    long_return = (rthead[RtIndex]->rt_flags & RTF_GATEWAY) ? 1 : 0;	    return (u_char *)&long_return;	case IPROUTEMETRIC2:#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = -1;	    return (u_char *)&long_return;	case IPROUTEMETRIC3:#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = -1;	    return (u_char *)&long_return;	case IPROUTEMETRIC4:#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = -1;	    return (u_char *)&long_return;	case IPROUTEMETRIC5:#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = -1;	    return (u_char *)&long_return;	case IPROUTENEXTHOP:#if NEED_KLGETSA	    sa = klgetsa((struct sockaddr_in *) rthead[RtIndex]->rt_gateway);	    return(u_char *) &(sa->sin_addr.s_addr);#else	    return(u_char *) &((struct sockaddr_in *) &rthead[RtIndex]->rt_gateway)->sin_addr.s_addr;#endif /* *bsd */	case IPROUTETYPE:	    long_return = (rthead[RtIndex]->rt_flags & RTF_GATEWAY) ? 4 : 3;	    return (u_char *)&long_return;	case IPROUTEPROTO:	    long_return = (rthead[RtIndex]->rt_flags & RTF_DYNAMIC) ? 4 : 2;	    return (u_char *)&long_return;	case IPROUTEAGE:#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = 0;	    return (u_char *)&long_return;	case IPROUTEMASK:#if NEED_KLGETSA		/* XXX - Almost certainly not right		    but I don't have a suitable system to test this on */#if NO_DUMMY_VALUES	    return NULL;#endif	    long_return = 0;#else /*  NEED_KLGETSA */	    if ( ((struct sockaddr_in *) &rthead[RtIndex]->rt_dst)->sin_addr.s_addr == 0 )		long_return = 0;	/* Default route */	    else {#ifndef linux		klookup((unsigned long) rthead[RtIndex]->rt_ifp,			(char *) &rt_ifnet, sizeof(rt_ifnet));		klookup((unsigned long) rt_ifnet.if_addrlist,			(char *) &rt_ifnetaddr, sizeof(rt_ifnetaddr));		long_return = rt_ifnetaddr.ia_subnetmask;#else /* linux */	    cp = (u_char *)&(((struct sockaddr_in *) &(rthead[RtIndex]->rt_dst))->sin_addr.s_addr);                return (u_char *) &(((struct sockaddr_in *) &(rthead[RtIndex]->rt_genmask))->sin_addr.s_addr);#endif /* linux */	    }#endif /* NEED_KLGETSA */	    return (u_char *)&long_return;	case IPROUTEINFO:	    *var_len = nullOidLen;	    return (u_char *)nullOid;	default:	    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ipRouteEntry\n", vp->magic));   }   return NULL;}#else /* solaris2 */static intIP_Cmp_Route(void *addr, void *ep){  mib2_ipRouteEntry_t *Ep = ep, *Addr = addr;  if (      (Ep->ipRouteDest == Addr->ipRouteDest) &&      (Ep->ipRouteNextHop == Addr->ipRouteNextHop) &&      (Ep->ipRouteType == Addr->ipRouteType) &&      (Ep->ipRouteProto == Addr->ipRouteProto) &&      (Ep->ipRouteMask == Addr->ipRouteMask) &&      (Ep->ipRouteInfo.re_max_frag == Addr->ipRouteInfo.re_max_frag) &&      (Ep->ipRouteInfo.re_rtt == Addr->ipRouteInfo.re_rtt) &&      (Ep->ipRouteInfo.re_ref == Addr->ipRouteInfo.re_ref) &&      (Ep->ipRouteInfo.re_frag_flag == Addr->ipRouteInfo.re_frag_flag) &&      (Ep->ipRouteInfo.re_src_addr == Addr->ipRouteInfo.re_src_addr) &&      (Ep->ipRouteInfo.re_ire_type == Addr->ipRouteInfo.re_ire_type) &&      (Ep->ipRouteInfo.re_obpkt == Addr->ipRouteInfo.re_obpkt) &&      (Ep->ipRouteInfo.re_ibpkt == Addr->ipRouteInfo.re_ibpkt)      )    return (0);  else    return (1);		/* Not found */}u_char *var_ipRouteEntry(struct variable *vp,		 oid *name,		 size_t *length,		 int exact,		 size_t *var_len,		 WriteMethod **write_method){  /*   * object identifier is of form:   * 1.3.6.1.2.1.4.21.1.1.A.B.C.D,  where A.B.C.D is IP address.   * IPADDR starts at offset 10.   */#define IP_ROUTENAME_LENGTH	14#define	IP_ROUTEADDR_OFF	10  oid 			current[IP_ROUTENAME_LENGTH], lowest[IP_ROUTENAME_LENGTH];  u_char 		*cp;  oid 			*op;  mib2_ipRouteEntry_t	Lowentry, Nextentry, entry;  int			Found = 0;  req_e 		req_type;  /* fill in object part of name for current (less sizeof instance part) */    memcpy( (char *)current,(char *)vp->name, vp->namelen * sizeof(oid));  if (*length == IP_ROUTENAME_LENGTH) /* Assume that the input name is the lowest */    memcpy( (char *)lowest,(char *)name, IP_ROUTENAME_LENGTH * sizeof(oid));  else    name[IP_ROUTEADDR_OFF] = (oid)-1; /* Grhhh: to prevent accidental comparison :-( */  for (Nextentry.ipRouteDest = (u_long)-2, req_type = GET_FIRST;       ;       Nextentry = entry, req_type = GET_NEXT) {    if (getMibstat(MIB_IP_ROUTE, &entry, sizeof(mib2_ipRouteEntry_t),		   req_type, &IP_Cmp_Route, &Nextentry) != 0)      break;    COPY_IPADDR(cp, (u_char *)&entry.ipRouteDest, op, current + IP_ROUTEADDR_OFF);    if (exact){      if (snmp_oid_compare(current, IP_ROUTENAME_LENGTH, name, *length) == 0){	memcpy( (char *)lowest,(char *)current, IP_ROUTENAME_LENGTH * sizeof(oid));	Lowentry = entry;	Found++;	break;  /* no need to search further */      }    } else {      if ((snmp_oid_compare(current, IP_ROUTENAME_LENGTH, name, *length) > 0) &&	  ((Nextentry.ipRouteDest == (u_long)-2)	   || (snmp_oid_compare(current, IP_ROUTENAME_LENGTH, lowest, IP_ROUTENAME_LENGTH) < 0)	   || (snmp_oid_compare(name, IP_ROUTENAME_LENGTH, lowest, IP_ROUTENAME_LENGTH) == 0))){	/* if new one is greater than input and closer to input than	 * previous lowest, and is not equal to it, save this one as the "next" one.	 */	memcpy( (char *)lowest,(char *)current, IP_ROUTENAME_LENGTH * sizeof(oid));	Lowentry = entry;	Found++;      }    }  }  if (Found == 0)    return(NULL);  memcpy( (char *) name,(char *)lowest, IP_ROUTENAME_LENGTH * sizeof(oid));  *length = IP_ROUTENAME_LENGTH;  *write_method = write_rte;  *var_len = sizeof(long_return);  switch(vp->magic){  case IPROUTEDEST:    long_return = Lowentry.ipRouteDest;    return (u_char *)&long_return;  case IPROUTEIFINDEX:    long_return = Interface_Index_By_Name(Lowentry.ipRouteIfIndex.o_bytes,					  Lowentry.ipRouteIfIndex.o_length);    return (u_char *)&long_return;  case IPROUTEMETRIC1:    long_return = Lowentry.ipRouteMetric1;    return (u_char *)&long_return;  case IPROUTEMETRIC2:    long_return = Lowentry.ipRouteMetric2;    return (u_char *)&long_return;  case IPROUTEMETRIC3:    long_return = Lowentry.ipRouteMetric3;    return (u_char *)&long_return;  case IPROUTEMETRIC4:    long_return = Lowentry.ipRouteMetric4;    return (u_char *)&long_return;  case IPROUTENEXTHOP:    long_return = Lowentry.ipRouteNextHop;    return (u_char *)&long_return;  case IPROUTETYPE:    long_return = Lowentry.ipRouteType;    return (u_char *)&long_return;  case IPROUTEPROTO:    long_return = Lowentry.ipRouteProto;    if (long_return == -1) long_return = 1;    return (u_char *)&long_return;  case IPROUTEAGE:    long_return = Lowentry.ipRouteAge;    return (u_char *)&long_return;  case IPROUTEMASK:    long_return = Lowentry.ipRouteMask;    return (u_char *)&long_return;  default:    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ipRouteEntry\n", vp->magic));  };  return NULL;}#endif /* solaris2 - var_IProute */#ifndef solaris2static int qsort_compare (const void *, const void *);#endif#if defined(RTENTRY_4_4) || defined(RTENTRY_RT_NEXT)#ifdef RTENTRY_4_4voidload_rtentries(struct radix_node *pt){  struct radix_node node;  RTENTRY rt;  struct ifnet ifnet;  char name[16], temp[16];#if !STRUCT_IFNET_HAS_IF_XNAME  register char *cp;#endif    if (!klookup((unsigned long)pt , (char *) &node , sizeof (struct radix_node))) {    DEBUGMSGTL(("mibII/var_route", "Fail\n"));    return;  }  if (node.rn_b >= 0) {      load_rtentries(node.rn_r);      load_rtentries(node.rn_l);  } else {    if (node.rn_flags & RNF_ROOT) {      /* root node */      if (node.rn_dupedkey)        load_rtentries(node.rn_dupedkey);      return;    }    /* get the route */    klookup((unsigned long)pt, (char *) &rt, sizeof (RTENTRY));          if (rt.rt_ifp != 0) {      klookup((unsigned long)rt.rt_ifp, (char *)&ifnet, sizeof (ifnet));#if STRUCT_IFNET_HAS_IF_XNAME#if defined(netbsd1) || defined(openbsd2)      strncpy(name, ifnet.if_xname, sizeof name);#else      klookup((unsigned long)ifnet.if_xname, name, sizeof name);#endif      name[sizeof (name)-1] = '\0';#else      klookup((unsigned long)ifnet.if_name, name, sizeof name);      name[sizeof (name) - 1] = '\0';      cp = (char *) strchr(name, '\0');      string_append_int (cp, ifnet.if_unit);#endif      Interface_Scan_Init();      rt.rt_unit = 0;      while (Interface_Scan_Next((short *) &(rt.rt_unit), temp, NULL, NULL) != 0) {        if (strcmp(name, temp) == 0) break;      }    }      #if CHECK_RT_FLAGS    if (((rt.rt_flags & RTF_CLONING) != RTF_CLONING)        && ((rt.rt_flags & RTF_LLINFO) != RTF_LLINFO))      {#endif        /* check for space and malloc */        if (rtsize >= rtallocate) {          rthead = (RTENTRY **) realloc((char *)rthead, 2 * rtallocate * sizeof(RTENTRY *));          memset((char *) &rthead[rtallocate],(0), rtallocate * sizeof(RTENTRY *));                    rtallocate *= 2;        }        if (!rthead[rtsize])          rthead[rtsize] = (RTENTRY *) malloc(sizeof(RTENTRY));        /*         *	Add this to the database         */        memcpy( (char *)rthead[rtsize],(char *) &rt, sizeof(RTENTRY));        rtsize++;#if CHECK_RT_FLAGS      }#endif    if (node.rn_dupedkey)      load_rtentries(node.rn_dupedkey);  }}#endif /* RTENTRY_4_4 */static void Route_Scan_Reload (void){#if defined(RTENTRY_4_4)  struct radix_node_head head, *rt_table[AF_MAX+1];  int i;#else

⌨️ 快捷键说明

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