int auto_nlist(char *string, char *var, int size) { long result; int ret; result = auto_nlist_value(string); if (result != -1) { if (var != NULL) { ret = klookup(result, var, size); if (!ret) fprintf(stderr, "auto_nlist failed on %s at location %lx\n", string, result); return ret; } else return 1; } return 0; }
static int ARP_Scan_Next(in_addr_t * IPAddr, char *PhysAddr, int *PhysAddrLen, u_long * ifType) #endif { #ifndef NETSNMP_CAN_USE_SYSCTL #ifdef linux if (arptab_current < arptab_size) { /* * copy values */ *IPAddr = at[arptab_current].at_iaddr.s_addr; *ifType = (at[arptab_current]. at_flags & ATF_PERM) ? 4 /*static */ : 3 /*dynamic */ ; *ifIndex = at[arptab_current].if_index; memcpy(PhysAddr, &at[arptab_current].at_enaddr, sizeof(at[arptab_current].at_enaddr)); *PhysAddrLen = at[arptab_current].at_enaddr_len; /* * increment to point next entry */ arptab_current++; /* * return success */ return (1); } #elif defined(hpux11) if (arptab_current < arptab_size) { /* * copy values */ *IPAddr = at[arptab_current].NetAddr; memcpy(PhysAddr, at[arptab_current].PhysAddr.o_bytes, at[arptab_current].PhysAddr.o_length); *ifType = at[arptab_current].Type; *ifIndex = at[arptab_current].IfIndex; *PhysAddrLen = at[arptab_current].PhysAddr.o_length; /* * increment to point next entry */ arptab_current++; /* * return success */ return (1); } #elif !defined(ARP_SCAN_FOUR_ARGUMENTS) || defined(hpux) register struct arptab *atab; while (arptab_current < arptab_size) { #ifdef STRUCT_ARPHD_HAS_AT_NEXT /* * The arp table is an array of linked lists of arptab entries. * Unused slots have pointers back to the array entry itself */ if (at_ptr == (auto_nlist_value(ARPTAB_SYMBOL) + arptab_current * sizeof(struct arphd))) { /* * Usused */ arptab_current++; at_ptr = at[arptab_current].at_next; continue; } if (!NETSNMP_KLOOKUP(at_ptr, (char *) &at_entry, sizeof(struct arptab))) { DEBUGMSGTL(("mibII/at:ARP_Scan_Next", "klookup failed\n")); break; } if (!NETSNMP_KLOOKUP(at_entry.at_ac, (char *) &at_com, sizeof(struct arpcom))) { DEBUGMSGTL(("mibII/at:ARP_Scan_Next", "klookup failed\n")); break; } at_ptr = at_entry.at_next; atab = &at_entry; *ifIndex = at_com.ac_if.if_index; /* not strictly ARPHD */ #else /* STRUCT_ARPHD_HAS_AT_NEXT */ atab = &at[arptab_current++]; #endif /* STRUCT_ARPHD_HAS_AT_NEXT */ if (!(atab->at_flags & ATF_COM)) continue; *ifType = (atab->at_flags & ATF_PERM) ? 4 : 3; *IPAddr = atab->at_iaddr.s_addr; #if defined (sunV3) || defined(sparc) || defined(hpux) memcpy(PhysAddr, (char *) &atab->at_enaddr, sizeof(atab->at_enaddr)); *PhysAddrLen = sizeof(atab->at_enaddr); #endif #if defined(mips) || defined(ibm032) memcpy(PhysAddr, (char *) atab->at_enaddr, sizeof(atab->at_enaddr)); *PhysAddrLen = sizeof(atab->at_enaddr); #endif return (1); } #endif /* linux || hpux11 || !ARP_SCAN_FOUR_ARGUMENTS || hpux */ return 0; /* we need someone with an irix box to fix this section */ #else /* !NETSNMP_CAN_USE_SYSCTL */ struct rt_msghdr *rtm; struct sockaddr_inarp *sin; struct sockaddr_dl *sdl; while (rtnext < lim) { rtm = (struct rt_msghdr *) rtnext; sin = (struct sockaddr_inarp *) (rtm + 1); sdl = (struct sockaddr_dl *) (sin + 1); rtnext += rtm->rtm_msglen; if (sdl->sdl_alen) { #ifdef irix6 *IPAddr = sin->sarp_addr.s_addr; #else *IPAddr = sin->sin_addr.s_addr; #endif memcpy(PhysAddr, (char *) LLADDR(sdl), sdl->sdl_alen); *PhysAddrLen = sdl->sdl_alen; *ifIndex = sdl->sdl_index; *ifType = 1; /* XXX */ return (1); } } return (0); /* "EOF" */ #endif /* !NETSNMP_CAN_USE_SYSCTL */ }