summaryrefslogtreecommitdiff
path: root/agent/mibgroup/mibII/vacm_context.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/mibII/vacm_context.c')
-rw-r--r--agent/mibgroup/mibII/vacm_context.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/agent/mibgroup/mibII/vacm_context.c b/agent/mibgroup/mibII/vacm_context.c
new file mode 100644
index 0000000..8f43cd3
--- /dev/null
+++ b/agent/mibgroup/mibII/vacm_context.c
@@ -0,0 +1,165 @@
+#include <net-snmp/net-snmp-config.h>
+
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include <net-snmp/agent/table.h>
+#include <net-snmp/agent/table_iterator.h>
+
+#include "vacm_context.h"
+
+static oid vacm_context_oid[] = { 1, 3, 6, 1, 6, 3, 16, 1, 1 };
+
+#define CONTEXTNAME_COLUMN 1
+
+/*
+ * return the index data from the first node in the agent's
+ * subtree_context_cache list.
+ */
+netsnmp_variable_list *
+get_first_context(void **my_loop_context, void **my_data_context,
+ netsnmp_variable_list * put_data,
+ netsnmp_iterator_info *iinfo)
+{
+ subtree_context_cache *context_ptr;
+ context_ptr = get_top_context_cache();
+
+ if (!context_ptr)
+ return NULL;
+
+ *my_loop_context = context_ptr;
+ *my_data_context = context_ptr;
+
+ snmp_set_var_value(put_data, context_ptr->context_name,
+ strlen(context_ptr->context_name));
+ return put_data;
+}
+
+/*
+ * return the next index data from the first node in the agent's
+ * subtree_context_cache list.
+ */
+netsnmp_variable_list *
+get_next_context(void **my_loop_context,
+ void **my_data_context,
+ netsnmp_variable_list * put_data,
+ netsnmp_iterator_info *iinfo)
+{
+ subtree_context_cache *context_ptr;
+
+ if (!my_loop_context || !*my_loop_context)
+ return NULL;
+
+ context_ptr = (subtree_context_cache *) (*my_loop_context);
+ context_ptr = context_ptr->next;
+ *my_loop_context = context_ptr;
+ *my_data_context = context_ptr;
+
+ if (!context_ptr)
+ return NULL;
+
+ snmp_set_var_value(put_data, context_ptr->context_name,
+ strlen(context_ptr->context_name));
+ return put_data;
+}
+
+void
+init_vacm_context(void)
+{
+ /*
+ * table vacm_context
+ */
+ netsnmp_handler_registration *my_handler;
+ netsnmp_table_registration_info *table_info;
+ netsnmp_iterator_info *iinfo;
+
+ my_handler = netsnmp_create_handler_registration("vacm_context",
+ vacm_context_handler,
+ vacm_context_oid,
+ sizeof
+ (vacm_context_oid) /
+ sizeof(oid),
+ HANDLER_CAN_RONLY);
+
+ if (!my_handler)
+ return;
+
+ table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
+ iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
+
+ if (!table_info || !iinfo) {
+ SNMP_FREE(table_info);
+ SNMP_FREE(iinfo);
+ SNMP_FREE(my_handler);
+ return;
+ }
+
+ netsnmp_table_helper_add_index(table_info, ASN_OCTET_STR)
+ table_info->min_column = 1;
+ table_info->max_column = 1;
+ iinfo->get_first_data_point = get_first_context;
+ iinfo->get_next_data_point = get_next_context;
+ iinfo->table_reginfo = table_info;
+ netsnmp_register_table_iterator2(my_handler, iinfo);
+}
+
+/*
+ * returns a list of known context names
+ */
+
+int
+vacm_context_handler(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ subtree_context_cache *context_ptr;
+
+ for(; requests; requests = requests->next) {
+ netsnmp_variable_list *var = requests->requestvb;
+
+ if (requests->processed != 0)
+ continue;
+
+
+ context_ptr = (subtree_context_cache *)
+ netsnmp_extract_iterator_context(requests);
+
+ if (context_ptr == NULL) {
+ snmp_log(LOG_ERR,
+ "vacm_context_handler called without data\n");
+ continue;
+ }
+
+ switch (reqinfo->mode) {
+ case MODE_GET:
+ /*
+ * if here we should have a context_ptr passed in already
+ */
+ /*
+ * only one column should ever reach us, so don't check it
+ */
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ context_ptr->context_name,
+ strlen(context_ptr->context_name));
+
+ break;
+ default:
+ /*
+ * We should never get here, getnext already have been
+ * handled by the table_iterator and we're read_only
+ */
+ snmp_log(LOG_ERR,
+ "vacm_context table accessed as mode=%d. We're improperly registered!",
+ reqinfo->mode);
+ break;
+ }
+ }
+
+ return SNMP_ERR_NOERROR;
+}