diff options
Diffstat (limited to 'agent/mibgroup/hardware/memory/hw_mem.c')
-rw-r--r-- | agent/mibgroup/hardware/memory/hw_mem.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/agent/mibgroup/hardware/memory/hw_mem.c b/agent/mibgroup/hardware/memory/hw_mem.c new file mode 100644 index 0000000..badc775 --- /dev/null +++ b/agent/mibgroup/hardware/memory/hw_mem.c @@ -0,0 +1,104 @@ +#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 <net-snmp/net-snmp-features.h> + +netsnmp_feature_child_of(hardware_memory, netsnmp_unused) + +netsnmp_feature_child_of(memory_get_cache, hardware_memory) + +extern NetsnmpCacheLoad netsnmp_mem_arch_load; + +netsnmp_memory_info *_mem_head = NULL; +netsnmp_cache *_mem_cache = NULL; + +void init_hw_mem( void ) { + oid nsMemory[] = { 1, 3, 6, 1, 4, 1, 8072, 1, 31 }; + _mem_cache = netsnmp_cache_create( 5, netsnmp_mem_arch_load, NULL, + nsMemory, OID_LENGTH(nsMemory)); +} + + + +netsnmp_memory_info *netsnmp_memory_get_first( int type ) { + netsnmp_memory_info *mem; + + for ( mem=_mem_head; mem; mem=mem->next ) + if (mem->type == type) /* Or treat as bits? */ + return mem; + return NULL; +} + +netsnmp_memory_info *netsnmp_memory_get_next( netsnmp_memory_info *this_ptr, int type ) { + netsnmp_memory_info *mem; + + if (this_ptr) + for ( mem=this_ptr->next; mem; mem=mem->next ) + if (mem->type == type) /* Or treat as bits? */ + return mem; + return NULL; +} + + /* + * Work with a list of Memory entries, indexed numerically + */ +netsnmp_memory_info *netsnmp_memory_get_byIdx( int idx, int create ) { + netsnmp_memory_info *mem, *mem2; + + /* + * Find the specified Memory entry + */ + for ( mem=_mem_head; mem; mem=mem->next ) { + if ( mem->idx == idx ) + return mem; + } + if (!create) + return NULL; + + /* + * Create a new memory entry, and insert it into the list.... + */ + mem = SNMP_MALLOC_TYPEDEF( netsnmp_memory_info ); + if (!mem) + return NULL; + mem->idx = idx; + /* ... either as the first (or only) entry.... */ + if ( !_mem_head || _mem_head->idx > idx ) { + mem->next = _mem_head; + _mem_head = mem; + return mem; + } + /* ... or in the appropriate position */ + for ( mem2=_mem_head; mem2; mem2=mem2->next ) { + if ( !mem2->next || mem2->next->idx > idx ) { + mem->next = mem2->next; + mem2->next = mem; + return mem; + } + } + SNMP_FREE(mem); + return NULL; /* Shouldn't happen! */ +} + +netsnmp_memory_info *netsnmp_memory_get_next_byIdx( int idx, int type ) { + netsnmp_memory_info *mem; + + for ( mem=_mem_head; mem; mem=mem->next ) + if (mem->type == type && mem->idx > idx) /* Or treat as bits? */ + return mem; + return NULL; +} + + + +#ifndef NETSNMP_FEATURE_REMOVE_MEMORY_GET_CACHE +netsnmp_cache *netsnmp_memory_get_cache( void ) { + return _mem_cache; +} +#endif /* NETSNMP_FEATURE_REMOVE_MEMORY_GET_CACHE */ + +int netsnmp_memory_load( void ) { + return netsnmp_cache_check_and_reload( _mem_cache ); +} |