blob: b1181bb6c5bbd94f5a52f604e4b531e75e3ffdb7 [file] [log] [blame]
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/agent/hardware/memory.h>
#include <sys/param.h>
#include <sys/pstat.h>
void get_swapinfo(long *total, long *free, long *size);
/*
* Load the latest memory usage statistics
*/
int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
struct pst_static pst;
struct pst_dynamic psd;
netsnmp_memory_info *mem;
long total_swap = 0;
long free_swap = 0;
long size = 0;
/*
* Retrieve the memory information from the underlying O/S...
*/
if (pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0) == -1) {
snmp_log(LOG_ERR, "memory_hpux: pstat_getstatic failed!\n");
return -1;
}
if (pstat_getdynamic(&psd, sizeof(psd), (size_t) 1, 0) == -1) {
snmp_log(LOG_ERR, "memory_hpux: pstat_getdynamic failed!\n");
return -1;
}
mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_PHYSMEM, 1 );
if (!mem) {
snmp_log_perror("No Memory info entry");
} else {
if (!mem->descr)
mem->descr = strdup( "Physical memory" );
mem->units = pst.page_size;
mem->size = pst.physical_memory;
mem->free = psd.psd_free;
mem->other = -1;
}
get_swapinfo(&total_swap, &free_swap, &size);
mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP, 1 );
if (!mem) {
snmp_log_perror("No Swap info entry");
} else {
if (!mem->descr)
mem->descr = strdup( "Swap space (total)" );
mem->units = size;
mem->size = total_swap;
mem->free = free_swap;
mem->other = -1;
}
mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_STEXT, 1 );
if (!mem) {
snmp_log_perror("No Swap text entry");
} else {
if (!mem->descr)
mem->descr = strdup( "Swapped text pages" );
mem->units = pst.page_size;
mem->size = psd.psd_vmtxt;
mem->free = psd.psd_avmtxt;
mem->other = -1;
}
mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_RTEXT, 1 );
if (!mem) {
snmp_log_perror("No real text entry");
} else {
if (!mem->descr)
mem->descr = strdup( "Real text pages" );
mem->units = pst.page_size;
mem->size = psd.psd_rmtxt;
mem->free = psd.psd_armtxt;
mem->other = -1;
}
/*
mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_MISC, 1 );
if (!mem) {
snmp_log_perror("No Buffer, etc info entry");
} else {
mem->units = 1024;
mem->size = -1;
mem->free = (pst.page_size/1024)*psd.psd_free + swap.free_swap;
mem->other = -1;
}
*/
return 0;
}
/*
* Retained from UCD implementation
*/
void
get_swapinfo(long *total, long *free, long *size)
{
struct pst_swapinfo pss;
netsnmp_memory_info *mem;
int i = 0;
char buf[1024];
while (pstat_getswap(&pss, sizeof(pss), (size_t) 1, i) != -1) {
if (pss.pss_idx == (unsigned) i) {
/*
* TODO - Skip if only one swap device
*/
mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SWAP+1+i, 1 );
if (!mem)
continue;
if (!mem->descr) {
sprintf(buf, "swap #%d %s", i, pss.pss_mntpt);
mem->descr = strdup( buf );
}
mem->units = 1024;
mem->size = (pss.pss_nblksavail * (DEV_BSIZE/512)) / 2; /* Or pss_nblks ? */
mem->free = 4*pss.pss_nfpgs; /* Or pss_nblksavail ? */
mem->other = -1;
*total +=mem->size;
*free +=mem->free;
*size = mem->units; /* Hopefully consistent! */
i++;
} else
return;
}
} /* end get_swapinfo */