summaryrefslogtreecommitdiff
path: root/agent/mibgroup/hardware/memory/hw_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/hardware/memory/hw_mem.c')
-rw-r--r--agent/mibgroup/hardware/memory/hw_mem.c104
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 );
+}