u_char * var_hrstore(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { int store_idx = 0; #if !defined(linux) #if defined(solaris2) int freemem; int swap_total, swap_used; #elif defined(hpux10) || defined(hpux11) struct pst_dynamic pst_buf; #elif defined(darwin8) vm_statistics_data_t vm_stat; int count = HOST_VM_INFO_COUNT; #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM) #ifdef VM_UVMEXP struct uvmexp uvmexp_totals; #endif struct vmtotal memory_totals; #endif #if HAVE_KVM_GETSWAPINFO struct kvm_swap swapinfo; static kvm_t *kd = NULL; #endif #if HAVE_SYS_POOL_H struct pool mbpool, mclpool; int i; #endif #ifdef MBSTAT_SYMBOL struct mbstat mbstat; #endif #endif /* !linux */ static char string[1024]; struct HRFS_statfs stat_buf; if (vp->magic == HRSTORE_MEMSIZE) { if (header_hrstore(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; } else { really_try_next: store_idx = header_hrstoreEntry(vp, name, length, exact, var_len, write_method); if (store_idx == MATCH_FAILED) return NULL; if (store_idx > HRS_TYPE_FIXED_MAX) { if (HRFS_statfs(HRFS_entry->HRFS_mount, &stat_buf) < 0) { snmp_log_perror(HRFS_entry->HRFS_mount); goto try_next; } } #if !defined(linux) && !defined(solaris2) else switch (store_idx) { case HRS_TYPE_MEM: case HRS_TYPE_SWAP: #ifdef USE_SYSCTL_VM { int mib[2]; size_t len = sizeof(memory_totals); mib[0] = CTL_VM; mib[1] = VM_METER; sysctl(mib, 2, &memory_totals, &len, NULL, 0); #ifdef VM_UVMEXP mib[1] = VM_UVMEXP; len = sizeof(uvmexp_totals); sysctl(mib, 2, &uvmexp_totals, &len, NULL, 0); #endif } #elif defined(darwin8) host_statistics(myHost,HOST_VM_INFO,&vm_stat,&count); #elif defined(hpux10) || defined(hpux11) pstat_getdynamic(&pst_buf, sizeof(struct pst_dynamic), 1, 0); #elif defined(TOTAL_MEMORY_SYMBOL) auto_nlist(TOTAL_MEMORY_SYMBOL, (char *) &memory_totals, sizeof(struct vmtotal)); #endif #if HAVE_KVM_GETSWAPINFO if (kd == NULL) kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL); if (!kd) { snmp_log_perror("kvm_openfiles"); goto try_next; } if (kvm_getswapinfo(kd, &swapinfo, 1, 0) < 0) { snmp_log_perror("kvm_getswapinfo"); goto try_next; } #endif break; #if !defined(hpux10) && !defined(hpux11) case HRS_TYPE_MBUF: #if HAVE_SYS_POOL_H auto_nlist(MBPOOL_SYMBOL, (char *) &mbpool, sizeof(mbpool)); auto_nlist(MCLPOOL_SYMBOL, (char *) &mclpool, sizeof(mclpool)); #endif #ifdef MBSTAT_SYMBOL auto_nlist(MBSTAT_SYMBOL, (char *) &mbstat, sizeof(mbstat)); #endif break; #endif /* !hpux10 && !hpux11 */ default: break; } #endif /* !linux && !solaris2 */ } switch (vp->magic) { case HRSTORE_MEMSIZE: long_return = physmem * (pagesize / 1024); return (u_char *) & long_return; case HRSTORE_INDEX: long_return = store_idx; return (u_char *) & long_return; case HRSTORE_TYPE: if (store_idx > HRS_TYPE_FIXED_MAX) if (storageUseNFS && Check_HR_FileSys_NFS()) storage_type_id[storage_type_len - 1] = 10; /* Network Disk */ else storage_type_id[storage_type_len - 1] = 4; /* Assume fixed */ else switch (store_idx) { case HRS_TYPE_MEM: storage_type_id[storage_type_len - 1] = 2; /* RAM */ break; case HRS_TYPE_SWAP: storage_type_id[storage_type_len - 1] = 3; /* Virtual Mem */ break; case HRS_TYPE_MBUF: storage_type_id[storage_type_len - 1] = 1; /* Other */ break; default: storage_type_id[storage_type_len - 1] = 1; /* Other */ break; } *var_len = sizeof(storage_type_id); return (u_char *) storage_type_id; case HRSTORE_DESCR: if (store_idx > HRS_TYPE_FIXED_MAX) { strncpy(string, HRFS_entry->HRFS_mount, sizeof(string)-1); string[ sizeof(string)-1 ] = 0; *var_len = strlen(string); return (u_char *) string; } else { /* store_idx = store_idx - 1; */ *var_len = strlen(hrs_descr[store_idx]); return (u_char *) hrs_descr[store_idx]; } case HRSTORE_UNITS: if (store_idx > HRS_TYPE_FIXED_MAX) #if HRFS_HAS_FRSIZE long_return = stat_buf.f_frsize; #else long_return = stat_buf.f_bsize; #endif else switch (store_idx) { case HRS_TYPE_MEM: case HRS_TYPE_SWAP: #if defined(USE_SYSCTL) || defined(solaris2) long_return = pagesize; #elif defined(NBPG) long_return = NBPG; #else long_return = 1024; /* Report in Kb */ #endif break; case HRS_TYPE_MBUF: #ifdef MSIZE long_return = MSIZE; #elif defined(linux) long_return = 1024; #else long_return = 256; #endif break; default: #if NO_DUMMY_VALUES goto try_next; #endif long_return = 1024; /* As likely as any! */ break; } return (u_char *) & long_return; case HRSTORE_SIZE: if (store_idx > HRS_TYPE_FIXED_MAX) long_return = stat_buf.f_blocks; else switch (store_idx) { #if defined(linux) case HRS_TYPE_MEM: case HRS_TYPE_SWAP: long_return = linux_mem(store_idx, HRSTORE_SIZE); break; #elif defined(solaris2) case HRS_TYPE_MEM: long_return = physmem; break; case HRS_TYPE_SWAP: sol_get_swapinfo(&swap_total, &swap_used); long_return = swap_total; break; #elif defined(hpux10) || defined(hpux11) case HRS_TYPE_MEM: long_return = pst_buf.psd_rm; break; case HRS_TYPE_SWAP: long_return = pst_buf.psd_vm; break; #elif defined(darwin8) case HRS_TYPE_MEM: long_return = physmem; break; case HRS_TYPE_SWAP: long_return = -1; break; #if defined(MBSTAT_SYMBOL) case HRS_TYPE_MBUF: long_return = mbstat.m_mbufs; break; #endif #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM) case HRS_TYPE_MEM: long_return = memory_totals.t_rm; break; case HRS_TYPE_SWAP: #if HAVE_KVM_GETSWAPINFO long_return = swapinfo.ksw_total; #elif defined(VM_UVMEXP) long_return = uvmexp_totals.swpages; #else long_return = memory_totals.t_vm; #endif break; #else /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ case HRS_TYPE_MEM: long_return = physmem; break; case HRS_TYPE_SWAP: #if NO_DUMMY_VALUES goto try_next; #endif long_return = 0; break; #endif /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ case HRS_TYPE_MBUF: #ifdef linux long_return = linux_mem(store_idx, HRSTORE_SIZE); #elif HAVE_SYS_POOL_H long_return = 0; for (i = 0; i < sizeof(mbstat.m_mtypes) / sizeof(mbstat.m_mtypes[0]); i++) long_return += mbstat.m_mtypes[i]; #elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_MBUFS) long_return = mbstat.m_mbufs; #elif defined(NO_DUMMY_VALUES) goto try_next; #else long_return = 0; #endif break; default: #if NO_DUMMY_VALUES goto try_next; #endif long_return = 1024; break; } return (u_char *) & long_return; case HRSTORE_USED: if (store_idx > HRS_TYPE_FIXED_MAX) long_return = (stat_buf.f_blocks - stat_buf.f_bfree); else switch (store_idx) { #if defined(linux) case HRS_TYPE_MBUF: case HRS_TYPE_MEM: case HRS_TYPE_SWAP: long_return = linux_mem(store_idx, HRSTORE_USED); break; #elif defined(solaris2) case HRS_TYPE_MEM: getKstatInt("unix", "system_pages", "freemem", &freemem); long_return = physmem - freemem; break; case HRS_TYPE_SWAP: sol_get_swapinfo(&swap_total, &swap_used); long_return = swap_used; break; #elif defined(hpux10) || defined(hpux11) case HRS_TYPE_MEM: long_return = pst_buf.psd_arm; break; case HRS_TYPE_SWAP: long_return = pst_buf.psd_avm; break; #elif defined(darwin8) case HRS_TYPE_MEM: long_return = vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count; break; case HRS_TYPE_SWAP: long_return = -1; break; #if defined(MBSTAT_SYMBOL) case HRS_TYPE_MBUF: long_return = mbstat.m_mbufs; break; #endif #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM) case HRS_TYPE_MEM: long_return = memory_totals.t_arm; break; case HRS_TYPE_SWAP: #if HAVE_KVM_GETSWAPINFO long_return = swapinfo.ksw_used; #elif defined(VM_UVMEXP) long_return = uvmexp_totals.swpginuse; #else long_return = memory_totals.t_avm; #endif break; #endif /* linux || solaris2 || hpux10 || hpux11 || ... */ #if !defined(linux) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11) case HRS_TYPE_MBUF: #if HAVE_SYS_POOL_H long_return = (mbpool.pr_nget - mbpool.pr_nput) * mbpool.pr_size + (mclpool.pr_nget - mclpool.pr_nput) * mclpool.pr_size; #ifdef MSIZE long_return /= MSIZE; #else long_return /= 256; #endif #elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_CLUSTERS) long_return = mbstat.m_clusters - mbstat.m_clfree; /* unlikely, but... */ #elif defined(NO_DUMMY_VALUES) goto try_next; #else long_return = 0; #endif break; #endif /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ default: #if NO_DUMMY_VALUES goto try_next; #endif long_return = 1024; break; } return (u_char *) & long_return; case HRSTORE_FAILS: if (store_idx > HRS_TYPE_FIXED_MAX) #if NO_DUMMY_VALUES goto try_next; #else long_return = 0; #endif else switch (store_idx) {
/* * Get info for interfaces group. Mimics getmib interface as much as possible * to be substituted later if SunSoft decides to extend its mib2 interface. */ static int getif(mib2_ifEntry_t *ifbuf, size_t size, req_e req_type, mib2_ifEntry_t *resp, size_t *length, int (*comp)(void *, void *), void *arg) { int i, ret, idx = 1; int ifsd; static char *buf = NULL; static int bufsize = 0; struct ifconf ifconf; struct ifreq *ifrp; mib2_ifEntry_t *ifp; mib2_ipNetToMediaEntry_t Media; int nentries = size / sizeof(mib2_ifEntry_t); found_e result = NOT_FOUND; if ((ifsd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return -1; } if (!buf) { bufsize = 10240; buf = malloc(bufsize); if (!buf) { ret = -1; goto Return; } } ifconf.ifc_buf = buf; ifconf.ifc_len = bufsize; while (ioctl(ifsd, SIOCGIFCONF, &ifconf) == -1) { bufsize += 10240; free(buf); buf = malloc(bufsize); if (!buf) { ret = -1; goto Return; } ifconf.ifc_buf = buf; ifconf.ifc_len = bufsize; } Again: for (i = 0, ifp = (mib2_ifEntry_t *) ifbuf, ifrp = ifconf.ifc_req; ((char *) ifrp < ((char *) ifconf.ifc_buf + ifconf.ifc_len)) && (i < nentries); i++, ifp++, ifrp++, idx++) { DEBUGMSGTL(("kernel_sunos5", "...... getif %s\n", ifrp->ifr_name)); if (ioctl(ifsd, SIOCGIFFLAGS, ifrp) < 0) { ret = -1; DEBUGMSGTL(("kernel_sunos5", "...... SIOCGIFFLAGS failed\n")); goto Return; } memset(ifp, 0, sizeof(mib2_ifEntry_t)); ifp->ifIndex = idx; ifp->ifDescr.o_length = strlen(ifrp->ifr_name); strcpy(ifp->ifDescr.o_bytes, ifrp->ifr_name); ifp->ifAdminStatus = (ifrp->ifr_flags & IFF_UP) ? 1 : 2; ifp->ifOperStatus = ((ifrp->ifr_flags & IFF_UP) && (ifrp->ifr_flags & IFF_RUNNING)) ? 1 : 2; ifp->ifLastChange = 0; /* Who knows ... */ if (ioctl(ifsd, SIOCGIFMTU, ifrp) < 0) { ret = -1; DEBUGMSGTL(("kernel_sunos5", "...... SIOCGIFMTU failed\n")); goto Return; } ifp->ifMtu = ifrp->ifr_metric; ifp->ifType = 1; ifp->ifSpeed = 0; /* make ifOperStatus depend on link status if available */ if (ifp->ifAdminStatus == 1) { int i_tmp; /* only UPed interfaces get correct link status - if any */ if (getKstatInt(NULL,ifrp->ifr_name,"link_up",&i_tmp) == 0) { ifp->ifOperStatus = i_tmp ? 1 : 2; } } if ((getKstatInt(NULL,ifrp->ifr_name, "ifspeed", &ifp->ifSpeed) == 0) && (ifp->ifSpeed != 0)) { /* * check for SunOS patch with half implemented ifSpeed */ if (ifp->ifSpeed < 10000) { ifp->ifSpeed *= 1000000; } } else if (getKstatInt(NULL,ifrp->ifr_name, "ifSpeed", &ifp->ifSpeed) == 0) { /* * this is good */ } switch (ifrp->ifr_name[0]) { case 'l': /* le / lo / lane (ATM LAN Emulation) */ if (ifrp->ifr_name[1] == 'o') { if (!ifp->ifSpeed) ifp->ifSpeed = 127000000; ifp->ifType = 24; } else if (ifrp->ifr_name[1] == 'e') { if (!ifp->ifSpeed) ifp->ifSpeed = 10000000; ifp->ifType = 6; } else if (ifrp->ifr_name[1] == 'a') { if (!ifp->ifSpeed) ifp->ifSpeed = 155000000; ifp->ifType = 37; } break; case 'g': /* ge (gigabit ethernet card) */ case 'c': /* ce (Cassini Gigabit-Ethernet (PCI) */ if (!ifp->ifSpeed) ifp->ifSpeed = 1000000000; ifp->ifType = 6; break; case 'h': /* hme (SBus card) */ case 'e': /* eri (PCI card) */ case 'b': /* be */ case 'd': /* dmfe -- found on netra X1 */ if (!ifp->ifSpeed) ifp->ifSpeed = 100000000; ifp->ifType = 6; break; case 'f': /* fa (Fore ATM) */ if (!ifp->ifSpeed) ifp->ifSpeed = 155000000; ifp->ifType = 37; break; case 'q': /* qe (QuadEther)/qa (Fore ATM)/qfe (QuadFastEther) */ if (ifrp->ifr_name[1] == 'a') { if (!ifp->ifSpeed) ifp->ifSpeed = 155000000; ifp->ifType = 37; } else if (ifrp->ifr_name[1] == 'e') { if (!ifp->ifSpeed) ifp->ifSpeed = 10000000; ifp->ifType = 6; } else if (ifrp->ifr_name[1] == 'f') { if (!ifp->ifSpeed) ifp->ifSpeed = 100000000; ifp->ifType = 6; } break; case 'i': /* ibd (Infiniband) */ ifp->ifType = 199; break; } if (!strchr(ifrp->ifr_name, ':')) { Counter l_tmp; if (getKstatInt(NULL,ifrp->ifr_name, "ipackets", &ifp->ifInUcastPkts) < 0){ ret = -1; goto Return; } if (getKstatInt(NULL,ifrp->ifr_name, "rbytes", &ifp->ifInOctets) < 0) { ifp->ifInOctets = ifp->ifInUcastPkts * 308; /* XXX */ } if (getKstatInt(NULL,ifrp->ifr_name, "opackets",&ifp->ifOutUcastPkts) < 0){ ret = -1; goto Return; } if (getKstatInt(NULL,ifrp->ifr_name, "obytes", &ifp->ifOutOctets) < 0) { ifp->ifOutOctets = ifp->ifOutUcastPkts * 308; /* XXX */ } if (ifp->ifType == 24) /* Loopback */ continue; if (getKstatInt(NULL,ifrp->ifr_name, "ierrors", &ifp->ifInErrors) < 0) { ret = -1; goto Return; } if (getKstatInt(NULL,ifrp->ifr_name, "oerrors", &ifp->ifOutErrors) < 0) { ret = -1; goto Return; } if (getKstatInt(NULL,ifrp->ifr_name, "brdcstrcv",&ifp->ifInNUcastPkts)==1&& getKstatInt(NULL,ifrp->ifr_name, "multircv", &l_tmp) == 1) { ifp->ifInNUcastPkts += l_tmp; } if (getKstatInt(NULL,ifrp->ifr_name,"brdcstxmt",&ifp->ifOutNUcastPkts)==1&& getKstatInt(NULL,ifrp->ifr_name, "multixmt", &l_tmp) == 1) { ifp->ifOutNUcastPkts += l_tmp; } } /* * An attempt to determine the physical address of the interface. * There should be a more elegant solution using DLPI, but "the margin * is too small to put it here ..." */ if (ioctl(ifsd, SIOCGIFADDR, ifrp) < 0) { ret = -1; goto Return; } if (getMibstat(MIB_IP_NET, &Media, sizeof(mib2_ipNetToMediaEntry_t), GET_EXACT, &Name_cmp, ifrp) == 0) { ifp->ifPhysAddress = Media.ipNetToMediaPhysAddress; } } if ((req_type == GET_NEXT) && (result == NEED_NEXT)) { /* * End of buffer, so "next" is the first item in the next buffer */ req_type = GET_FIRST; } result = getentry(req_type, (void *) ifbuf, size, sizeof(mib2_ifEntry_t), (void *)resp, comp, arg); if ((result != FOUND) && (i == nentries) && ((char *)ifrp < (char *)ifconf.ifc_buf + ifconf.ifc_len)) { /* * We reached the end of supplied buffer, but there is * some more stuff to read, so continue. */ ifconf.ifc_len -= i * sizeof(struct ifreq); ifconf.ifc_req = ifrp; goto Again; } if (result != FOUND) { ret = 2; } else { if ((char *)ifrp < (char *)ifconf.ifc_buf + ifconf.ifc_len) { ret = 1; /* Found and more data to fetch */ } else { ret = 0; /* Found and no more data */ } *length = i * sizeof(mib2_ifEntry_t); /* Actual cache length */ } Return: close(ifsd); return ret; }