/* * table_array.h * $Id$ */ #ifndef _TABLE_ARRAY_HANDLER_H_ #define _TABLE_ARRAY_HANDLER_H_ #ifdef __cplusplus extern "C" { #endif /* * The table array helper is designed to simplify the task of * writing a table handler for the net-snmp agent when the data being * accessed is in an oid sorted form and must be accessed externally. * * Functionally, it is a specialized version of the more * generic table helper but easies the burden of GETNEXT processing by * retrieving the appropriate row for ead index through * function calls which should be supplied by the module that wishes * help. The module the table_array helps should, afterwards, * never be called for the case of "MODE_GETNEXT" and only for the GET * and SET related modes instead. */ #include #include #define TABLE_ARRAY_NAME "table_array" /* * group_item is to allow us to keep a list of requests without * disrupting the actual netsnmp_request_info list. */ typedef struct netsnmp_request_group_item_s { netsnmp_request_info *ri; netsnmp_table_request_info *tri; struct netsnmp_request_group_item_s *next; } netsnmp_request_group_item; /* * structure to keep a list of requests for each unique index */ typedef struct netsnmp_request_group_s { /* * index for this row. points to someone else's memory, so * don't free it! */ netsnmp_index index; /* * container in which rows belong */ netsnmp_container *table; /* * actual old and new rows */ netsnmp_index *existing_row; netsnmp_index *undo_info; /* * flags */ char row_created; char row_deleted; char fill1; char fill2; /* * requests for this row */ netsnmp_request_group_item *list; int status; void *rg_void; } netsnmp_request_group; typedef int (Netsnmp_User_Row_Operation_c) (const void *lhs, const void *rhs); typedef int (Netsnmp_User_Row_Operation) (void *lhs, void *rhs); typedef int (Netsnmp_User_Get_Processor) (netsnmp_request_info *, netsnmp_index *, netsnmp_table_request_info *); typedef netsnmp_index *(UserRowMethod) (netsnmp_index *); typedef int (Netsnmp_User_Row_Action) (netsnmp_index *, netsnmp_index *, netsnmp_request_group *); typedef void (Netsnmp_User_Group_Method) (netsnmp_request_group *); /* * structure for array callbacks */ typedef struct netsnmp_table_array_callbacks_s { Netsnmp_User_Row_Operation *row_copy; Netsnmp_User_Row_Operation_c *row_compare; Netsnmp_User_Get_Processor *get_value; Netsnmp_User_Row_Action *can_activate; Netsnmp_User_Row_Action *activated; Netsnmp_User_Row_Action *can_deactivate; Netsnmp_User_Row_Action *deactivated; Netsnmp_User_Row_Action *can_delete; UserRowMethod *create_row; UserRowMethod *duplicate_row; UserRowMethod *delete_row; /* always returns NULL */ Netsnmp_User_Group_Method *set_reserve1; Netsnmp_User_Group_Method *set_reserve2; Netsnmp_User_Group_Method *set_action; Netsnmp_User_Group_Method *set_commit; Netsnmp_User_Group_Method *set_free; Netsnmp_User_Group_Method *set_undo; /** not callbacks, but this is a useful place for them... */ netsnmp_container* container; char can_set; } netsnmp_table_array_callbacks; int netsnmp_table_container_register(netsnmp_handler_registration *reginfo, netsnmp_table_registration_info *tabreq, netsnmp_table_array_callbacks *cb, netsnmp_container *container, int group_rows); int netsnmp_table_array_register(netsnmp_handler_registration *reginfo, netsnmp_table_registration_info *tabreq, netsnmp_table_array_callbacks *cb, netsnmp_container *container, int group_rows); netsnmp_container * netsnmp_extract_array_context(netsnmp_request_info *); Netsnmp_Node_Handler netsnmp_table_array_helper_handler; int netsnmp_table_array_check_row_status(netsnmp_table_array_callbacks *cb, netsnmp_request_group *ag, long *rs_new, long *rs_old); #ifdef __cplusplus } #endif #endif /* _TABLE_ARRAY_HANDLER_H_ */