diff options
Diffstat (limited to 'agent/mibgroup/agent/nsVacmAccessTable.c')
-rw-r--r-- | agent/mibgroup/agent/nsVacmAccessTable.c | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/agent/mibgroup/agent/nsVacmAccessTable.c b/agent/mibgroup/agent/nsVacmAccessTable.c new file mode 100644 index 0000000..599bf80 --- /dev/null +++ b/agent/mibgroup/agent/nsVacmAccessTable.c @@ -0,0 +1,339 @@ +/* + * Note: this file originally auto-generated by mib2c using + * : mib2c.iterate.conf,v 5.17 2005/05/09 08:13:45 dts12 Exp $ + */ + +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/library/vacm.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include "nsVacmAccessTable.h" + +/** Initializes the nsVacmAccessTable module */ +void +init_register_nsVacm_context(const char *context) +{ + /* + * Initialize the nsVacmAccessTable table by defining its + * contents and how it's structured + */ + static oid nsVacmAccessTable_oid[] = { 1,3,6,1,4,1,8072,1,9,1 }; + size_t nsVacmAccessTable_oid_len = OID_LENGTH(nsVacmAccessTable_oid); + netsnmp_handler_registration *reg; + netsnmp_iterator_info *iinfo; + netsnmp_table_registration_info *table_info; + + reg = netsnmp_create_handler_registration("nsVacmAccessTable", + nsVacmAccessTable_handler, + nsVacmAccessTable_oid, + nsVacmAccessTable_oid_len, + HANDLER_CAN_RWRITE); + + table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); + netsnmp_table_helper_add_indexes(table_info, + ASN_OCTET_STR, /* index: vacmGroupName */ + ASN_OCTET_STR, /* index: vacmAccessContextPrefix */ + ASN_INTEGER, /* index: vacmAccessSecurityModel */ + ASN_INTEGER, /* index: vacmAccessSecurityLevel */ + ASN_OCTET_STR, /* index: nsVacmAuthType */ + 0); + table_info->min_column = COLUMN_NSVACMCONTEXTMATCH; + table_info->max_column = COLUMN_NSVACMACCESSSTATUS; + + iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info); + iinfo->get_first_data_point = nsVacmAccessTable_get_first_data_point; + iinfo->get_next_data_point = nsVacmAccessTable_get_next_data_point; + iinfo->table_reginfo = table_info; + + if ( context && context[0] ) + reg->contextName = strdup(context); + + netsnmp_register_table_iterator(reg, iinfo); +} + +void +init_nsVacmAccessTable(void) +{ + init_register_nsVacm_context(""); +} + + +/* + * Iterator hook routines + */ +static int nsViewIdx; /* This should really be handled via the 'loop_context' + parameter, but it's easier (read lazier) to use a + global variable as well. Bad David! */ + +netsnmp_variable_list * +nsVacmAccessTable_get_first_data_point(void **my_loop_context, + void **my_data_context, + netsnmp_variable_list *put_index_data, + netsnmp_iterator_info *mydata) +{ + vacm_scanAccessInit(); + *my_loop_context = vacm_scanAccessNext(); + nsViewIdx = 0; + return nsVacmAccessTable_get_next_data_point(my_loop_context, + my_data_context, + put_index_data, mydata); +} + +netsnmp_variable_list * +nsVacmAccessTable_get_next_data_point(void **my_loop_context, + void **my_data_context, + netsnmp_variable_list *put_index_data, + netsnmp_iterator_info *mydata) +{ + struct vacm_accessEntry *entry = + (struct vacm_accessEntry *) *my_loop_context; + netsnmp_variable_list *idx; + int len; + char *cp; + +newView: + idx = put_index_data; + if ( nsViewIdx == VACM_MAX_VIEWS ) { + entry = vacm_scanAccessNext(); + nsViewIdx = 0; + } + if (entry) { + len = entry->groupName[0]; + snmp_set_var_value(idx, (u_char *)entry->groupName+1, len); + idx = idx->next_variable; + len = entry->contextPrefix[0]; + snmp_set_var_value(idx, (u_char *)entry->contextPrefix+1, len); + idx = idx->next_variable; + snmp_set_var_value(idx, (u_char *)&entry->securityModel, + sizeof(entry->securityModel)); + idx = idx->next_variable; + snmp_set_var_value(idx, (u_char *)&entry->securityLevel, + sizeof(entry->securityLevel)); + /* + * Find the next valid authType view - skipping unused entries + */ + idx = idx->next_variable; + for (; nsViewIdx < VACM_MAX_VIEWS; nsViewIdx++) { + if ( entry->views[ nsViewIdx ][0] ) + break; + } + if ( nsViewIdx == VACM_MAX_VIEWS ) + goto newView; + cp = se_find_label_in_slist(VACM_VIEW_ENUM_NAME, nsViewIdx++); + DEBUGMSGTL(("nsVacm", "nextDP %s:%s (%d)\n", entry->groupName+1, cp, nsViewIdx-1)); + snmp_set_var_value(idx, (u_char *)cp, strlen(cp)); + idx = idx->next_variable; + *my_data_context = (void *) entry; + *my_loop_context = (void *) entry; + return put_index_data; + } else { + return NULL; + } +} + + +/** handles requests for the nsVacmAccessTable table */ +int +nsVacmAccessTable_handler(netsnmp_mib_handler *handler, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests) +{ + + netsnmp_request_info *request; + netsnmp_table_request_info *table_info; + netsnmp_variable_list *idx; + struct vacm_accessEntry *entry; + char atype[20]; + int viewIdx, ret; + char *gName, *cPrefix; + int model, level; + + switch (reqinfo->mode) { + /* + * Read-support (also covers GetNext requests) + */ + case MODE_GET: + for (request = requests; request; request = request->next) { + entry = (struct vacm_accessEntry *) + netsnmp_extract_iterator_context(request); + table_info = netsnmp_extract_table_info(request); + + /* Extract the authType token from the list of indexes */ + idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable; + memset(atype, 0, sizeof(atype)); + strncpy(atype, (char *)idx->val.string, idx->val_len); + viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype); + DEBUGMSGTL(("nsVacm", "GET %s (%d)\n", idx->val.string, viewIdx)); + + if (!entry) + continue; + + switch (table_info->colnum) { + case COLUMN_NSVACMCONTEXTMATCH: + snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, + entry->contextMatch); + break; + case COLUMN_NSVACMVIEWNAME: + snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, + (u_char *)entry->views[ viewIdx ], + strlen(entry->views[ viewIdx ])); + break; + case COLUMN_VACMACCESSSTORAGETYPE: + snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, + entry->storageType); + break; + case COLUMN_NSVACMACCESSSTATUS: + snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, + entry->status); + break; + } + } + break; + + /* + * Write-support + */ + case MODE_SET_RESERVE1: + for (request = requests; request; request = request->next) { + entry = (struct vacm_accessEntry *) + netsnmp_extract_iterator_context(request); + table_info = netsnmp_extract_table_info(request); + ret = SNMP_ERR_NOERROR; + + switch (table_info->colnum) { + case COLUMN_NSVACMCONTEXTMATCH: + ret = netsnmp_check_vb_int_range(request->requestvb, 1, 2); + break; + case COLUMN_NSVACMVIEWNAME: + ret = netsnmp_check_vb_type_and_max_size(request->requestvb, + ASN_OCTET_STR, + VACM_MAX_STRING); + break; + case COLUMN_VACMACCESSSTORAGETYPE: + ret = netsnmp_check_vb_storagetype(request->requestvb, + (/*entry ? entry->storageType :*/ SNMP_STORAGE_NONE)); + break; + case COLUMN_NSVACMACCESSSTATUS: + /* + * The usual 'check_vb_rowstatus' call is too simplistic + * to be used here. Because we're implementing a table + * within an existing table, it's quite possible for a + * the vacmAccessTable entry to exist, even if this is + * a "new" nsVacmAccessEntry. + * + * We can check that the value being assigned is suitable + * for a RowStatus syntax object, but the transition + * checks need to be done explicitly. + */ + ret = netsnmp_check_vb_rowstatus_value(request->requestvb); + if ( ret != SNMP_ERR_NOERROR ) + break; + + /* + * Extract the authType token from the list of indexes + */ + idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable; + memset(atype, 0, sizeof(atype)); + strncpy(atype, (char *)idx->val.string, idx->val_len); + viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype); + if ( viewIdx < 0 ) { + ret = SNMP_ERR_NOCREATION; + break; + } + switch ( *request->requestvb->val.integer ) { + case RS_ACTIVE: + case RS_NOTINSERVICE: + /* Check that this particular view is already set */ + if ( !entry || !entry->views[viewIdx][0] ) + ret = SNMP_ERR_INCONSISTENTVALUE; + break; + case RS_CREATEANDWAIT: + case RS_CREATEANDGO: + /* Check that this particular view is not yet set */ + if ( entry && entry->views[viewIdx][0] ) + ret = SNMP_ERR_INCONSISTENTVALUE; + break; + } + break; + } /* switch(colnum) */ + if ( ret != SNMP_ERR_NOERROR ) { + netsnmp_set_request_error(reqinfo, request, ret); + return SNMP_ERR_NOERROR; + } + } + break; + + case MODE_SET_RESERVE2: + for (request = requests; request; request = request->next) { + entry = (struct vacm_accessEntry *) + netsnmp_extract_iterator_context(request); + table_info = netsnmp_extract_table_info(request); + + switch (table_info->colnum) { + case COLUMN_NSVACMACCESSSTATUS: + switch (*request->requestvb->val.integer) { + case RS_CREATEANDGO: + case RS_CREATEANDWAIT: + if (!entry) { + idx = table_info->indexes; gName = (char*)idx->val.string; + idx = idx->next_variable; cPrefix = (char*)idx->val.string; + idx = idx->next_variable; model = *idx->val.integer; + idx = idx->next_variable; level = *idx->val.integer; + entry = vacm_createAccessEntry( gName, cPrefix, model, level ); + entry->storageType = ST_NONVOLATILE; + netsnmp_insert_iterator_context(request, (void*)entry); + } + } + } + } + break; + + case MODE_SET_FREE: + case MODE_SET_UNDO: + /* XXX - TODO */ + break; + + case MODE_SET_ACTION: + /* ??? Empty ??? */ + break; + + case MODE_SET_COMMIT: + for (request = requests; request; request = request->next) { + entry = (struct vacm_accessEntry *) + netsnmp_extract_iterator_context(request); + table_info = netsnmp_extract_table_info(request); + if ( !entry ) + continue; /* Shouldn't happen */ + + /* Extract the authType token from the list of indexes */ + idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable; + memset(atype, 0, sizeof(atype)); + strncpy(atype, (char *)idx->val.string, idx->val_len); + viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype); + + switch (table_info->colnum) { + case COLUMN_NSVACMCONTEXTMATCH: + entry->contextMatch = *request->requestvb->val.integer; + break; + case COLUMN_NSVACMVIEWNAME: + memset( entry->views[viewIdx], 0, VACMSTRINGLEN ); + memcpy( entry->views[viewIdx], request->requestvb->val.string, + request->requestvb->val_len); + break; + case COLUMN_VACMACCESSSTORAGETYPE: + entry->storageType = *request->requestvb->val.integer; + break; + case COLUMN_NSVACMACCESSSTATUS: + switch (*request->requestvb->val.integer) { + case RS_DESTROY: + memset( entry->views[viewIdx], 0, VACMSTRINGLEN ); + break; + } + break; + } + } + break; + } + return SNMP_ERR_NOERROR; +} |