Blame agent/mibgroup/hardware/memory/memory_hpux.c

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