$NetBSD: patch-ah,v 1.6 2010/12/26 09:23:49 sekiya Exp $ --- agent/mibgroup/hardware/memory/memory_netbsd.c.orig 2006-03-07 01:23:52.000000000 +0900 +++ agent/mibgroup/hardware/memory/memory_netbsd.c 2010-12-26 17:50:43.000000000 +0900 @@ -4,7 +4,9 @@ #include #include +#include #include +#include #include #if defined(HAVE_UVM_UVM_PARAM_H) && defined(HAVE_UVM_UVM_EXTERN_H) @@ -30,27 +32,47 @@ long pagesize; struct uvmexp uvmexp; - int uvmexp_size = sizeof(uvmexp); - int uvmexp_mib[] = { CTL_VM, VM_UVMEXP }; + size_t uvmexp_size = sizeof(uvmexp); struct vmtotal total; size_t total_size = sizeof(total); - int total_mib[] = { CTL_VM, VM_METER }; - long phys_mem; - long user_mem; + quad_t phys_mem; + quad_t user_mem; + unsigned int bufspace; + unsigned int maxbufspace; size_t mem_size = sizeof(phys_mem); - int phys_mem_mib[] = { CTL_HW, HW_PHYSMEM }; - int user_mem_mib[] = { CTL_HW, HW_USERMEM }; + size_t buf_size = sizeof(bufspace); /* * Retrieve the memory information from the underlying O/S... */ - sysctl(uvmexp_mib, 2, &uvmexp, &uvmexp_size, NULL, 0); - sysctl(total_mib, 2, &total, &total_size, NULL, 0); - sysctl(phys_mem_mib, 2, &phys_mem, &mem_size, NULL, 0); - sysctl(user_mem_mib, 2, &user_mem, &mem_size, NULL, 0); - pagesize = uvmexp.pagesize; + if (sysctlbyname("vm.uvmexp", &uvmexp, &uvmexp_size, NULL, 0) == -1) { + snmp_log(LOG_ERR, "sysctl vm.uvmexp failed (errno %d)\n", errno); + return -1; + } + if (sysctlbyname("vm.vmmeter", &total, &total_size, NULL, 0) == -1) { + snmp_log(LOG_ERR, "sysctl vm.vmmeter failed (errno %d)\n", errno); + return -1; + } + if (sysctlbyname("hw.physmem64", &phys_mem, &mem_size, NULL, 0) == -1) { + snmp_log(LOG_ERR, "sysctl hw.physmem64 failed (errno %d)\n", errno); + return -1; + } + if (sysctlbyname("hw.usermem64", &user_mem, &mem_size, NULL, 0) == -1) { + snmp_log(LOG_ERR, "sysctl hw.usermem64 failed (errno %d)\n", errno); + return -1; + } + if (sysctlbyname("vm.bufmem", &bufspace, &buf_size, NULL, 0) == -1) { + snmp_log(LOG_ERR, "sysctl vm.bufmem failed (errno %d)\n", errno); + return -1; + } + if (sysctlbyname("vm.bufmem_hiwater", &maxbufspace, &buf_size, NULL, 0) == -1) { + snmp_log(LOG_ERR, "sysctl vm.bufmem_hiwater failed (errno %d)\n", errno); + return -1; + } + + pagesize = sysconf(_SC_PAGESIZE); /* * ... and save this in a standard form. @@ -64,7 +86,6 @@ mem->units = pagesize; mem->size = phys_mem/pagesize; mem->free = total.t_free; - mem->other = -1; } mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_USERMEM, 1 ); @@ -76,7 +97,39 @@ mem->units = pagesize; mem->size = user_mem/pagesize; mem->free = uvmexp.free; - mem->other = -1; + } + + mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_VIRTMEM, 1 ); + if (!mem) { + snmp_log_perror("No Virtual Memory info entry"); + } else { + if (!mem->descr) + mem->descr = strdup("Virtual memory"); + mem->units = pagesize; + mem->size = total.t_vm; + mem->free = total.t_avm; + } + + mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 1 ); + if (!mem) { + snmp_log_perror("No Shared Memory info entry"); + } else { + if (!mem->descr) + mem->descr = strdup("Shared virtual memory"); + mem->units = pagesize; + mem->size = total.t_vmshr; + mem->free = total.t_avmshr; + } + + mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED2, 1 ); + if (!mem) { + snmp_log_perror("No Shared2 Memory info entry"); + } else { + if (!mem->descr) + mem->descr = strdup("Shared real memory"); + mem->units = pagesize; + mem->size = total.t_rmshr; + mem->free = total.t_armshr; } #ifdef SWAP_NSWAP @@ -91,7 +144,17 @@ mem->units = pagesize; mem->size = uvmexp.swpages; mem->free = uvmexp.swpages - uvmexp.swpginuse; - mem->other = -1; + } + + mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_MBUF, 1 ); + if (!mem) { + snmp_log_perror("No Buffer, etc info entry"); + } else { + if (!mem->descr) + mem->descr = strdup("Memory buffers"); + mem->units = 1024; + mem->size = maxbufspace / 1024; + mem->free = (maxbufspace - bufspace)/1024; } return 0;