/* * Find or create the specified event entry */ static struct mteEvent * _find_mteEvent_entry( const char *owner, const char *ename ) { netsnmp_variable_list owner_var, ename_var; netsnmp_tdata_row *row; /* * If there's already an existing entry, * then use that... */ memset(&owner_var, 0, sizeof(netsnmp_variable_list)); memset(&ename_var, 0, sizeof(netsnmp_variable_list)); snmp_set_var_typed_value(&owner_var, ASN_OCTET_STR, owner, strlen(owner)); snmp_set_var_typed_value(&ename_var, ASN_PRIV_IMPLIED_OCTET_STR, ename, strlen(ename)); owner_var.next_variable = &ename_var; row = netsnmp_tdata_row_get_byidx( event_table_data, &owner_var ); /* * ... otherwise, create a new one */ if (!row) row = mteEvent_createEntry( owner, ename, 0 ); if (!row) return NULL; /* return (struct mteEvent *)netsnmp_tdata_row_entry( row ); */ return (struct mteEvent *)row->data; }
int mteEvent_fire (char *owner, char *event, /* Event to invoke */ struct mteTrigger *trigger, /* Trigger that fired */ oid * suffix, size_t s_len) /* Matching instance */ { struct mteEvent *entry; int fired = 0; netsnmp_variable_list owner_var, event_var; DEBUGMSGTL (("disman:event:fire", "Event fired (%s, %s)\n", owner, event)); /* * Retrieve the entry for the specified event */ memset (&owner_var, 0, sizeof (owner_var)); memset (&event_var, 0, sizeof (event_var)); snmp_set_var_typed_value (&owner_var, ASN_OCTET_STR, owner, strlen (owner)); snmp_set_var_typed_value (&event_var, ASN_PRIV_IMPLIED_OCTET_STR, event, strlen (event)); owner_var.next_variable = &event_var; entry = (struct mteEvent *) netsnmp_tdata_row_entry (netsnmp_tdata_row_get_byidx (event_table_data, &owner_var)); if (!entry) { DEBUGMSGTL (("disman:event:fire", "No matching event\n")); return -1; } if (entry->mteEventActions & MTE_EVENT_NOTIFICATION) { DEBUGMSGTL (("disman:event:fire", "Firing notification event\n")); _mteEvent_fire_notify (entry, trigger, suffix, s_len); fired = 1; } #ifndef NETSNMP_NO_WRITE_SUPPORT if (entry->mteEventActions & MTE_EVENT_SET) { DEBUGMSGTL (("disman:event:fire", "Firing set event\n")); _mteEvent_fire_set (entry, trigger, suffix, s_len); fired = 1; } #endif /* NETSNMP_NO_WRITE_SUPPORT */ if (!fired) DEBUGMSGTL (("disman:event:fire", "Matched event is empty\n")); return fired; }
struct expExpression * expExpression_getEntry( char *owner, char *name ) { netsnmp_variable_list owner_var, name_var; memset(&owner_var, 0, sizeof(netsnmp_variable_list)); memset(&name_var, 0, sizeof(netsnmp_variable_list)); snmp_set_var_typed_value( &owner_var, ASN_OCTET_STR, (u_char*)owner, strlen(owner)); snmp_set_var_typed_value( &name_var, ASN_OCTET_STR, (u_char*)name, strlen(name)); owner_var.next_variable = &name_var; return (struct expExpression *) netsnmp_tdata_row_entry( netsnmp_tdata_row_get_byidx(expr_table_data, &owner_var)); }