diff options
Diffstat (limited to 'agent/mibgroup/disman/expr/expErrorTable.c')
-rw-r--r-- | agent/mibgroup/disman/expr/expErrorTable.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/agent/mibgroup/disman/expr/expErrorTable.c b/agent/mibgroup/disman/expr/expErrorTable.c new file mode 100644 index 0000000..a759e2d --- /dev/null +++ b/agent/mibgroup/disman/expr/expErrorTable.c @@ -0,0 +1,120 @@ +/* + * DisMan Expression MIB: + * Implementation of the expExpressionErrorTable MIB interface + * See 'expExpression.c' for active behaviour of this table. + * + * (Based on mib2c.table_data.conf output) + */ + +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-features.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include "disman/expr/expExpression.h" +#include "disman/expr/expErrorTable.h" + +netsnmp_feature_require(table_tdata) + +/* Initializes the expExpressionErrorTable module */ +void +init_expErrorTable(void) +{ + static oid expErrorTable_oid[] = { 1, 3, 6, 1, 2, 1, 90, 1, 2, 2 }; + size_t expErrorTable_oid_len = OID_LENGTH(expErrorTable_oid); + netsnmp_handler_registration *reg; + netsnmp_table_registration_info *table_info; + + /* + * Ensure the expression table container is available... + */ + init_expr_table_data(); + + /* + * ... then set up the MIB interface to the expExpressionErrorTable slice + */ + reg = netsnmp_create_handler_registration("expErrorTable", + expErrorTable_handler, + expErrorTable_oid, + expErrorTable_oid_len, + HANDLER_CAN_RWRITE); + + table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); + netsnmp_table_helper_add_indexes(table_info, + /* index: expExpressionOwner */ + ASN_OCTET_STR, + /* index: expExpressionName */ + ASN_OCTET_STR, + 0); + + table_info->min_column = COLUMN_EXPERRORTIME; + table_info->max_column = COLUMN_EXPERRORINSTANCE; + + /* Register this using the (common) expr_table_data container */ + netsnmp_tdata_register(reg, expr_table_data, table_info); + DEBUGMSGTL(("disman:expr:init", "Expression Error Table container (%p)\n", + expr_table_data)); +} + + +/** handles requests for the expExpressionErrorTable table */ +int +expErrorTable_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 *tinfo; + struct expExpression *entry; + + DEBUGMSGTL(("disman:expr:mib", "Expression Error Table handler (%d)\n", + reqinfo->mode)); + + switch (reqinfo->mode) { + /* + * Read-support (also covers GetNext requests) + */ + case MODE_GET: + for (request = requests; request; request = request->next) { + if (request->processed) + continue; + + entry = (struct expExpression *) + netsnmp_tdata_extract_entry(request); + tinfo = netsnmp_extract_table_info(request); + if (!entry || !(entry->flags & EXP_FLAG_VALID)) + continue; + + /* + * "Entries only appear in this table ... when there + * has been an error for that [matching] expression" + */ + if (entry->expErrorCount == 0) + continue; + + switch (tinfo->colnum) { + case COLUMN_EXPERRORTIME: + snmp_set_var_typed_integer(request->requestvb, ASN_TIMETICKS, + entry->expErrorTime); + break; + case COLUMN_EXPERRORINDEX: + snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, + entry->expErrorIndex); + break; + case COLUMN_EXPERRORCODE: + snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, + entry->expErrorCode); + break; + case COLUMN_EXPERRORINSTANCE: + snmp_set_var_typed_value(request->requestvb, ASN_OBJECT_ID, + (u_char *) entry->expErrorInstance, + entry->expErrorInst_len*sizeof(oid)); + break; + } + } + break; + } + DEBUGMSGTL(("disman:expr:mib", "Expression Error handler - done \n")); + return SNMP_ERR_NOERROR; +} |