diff options
Diffstat (limited to 'include/net-snmp/agent/table_data.h')
-rw-r--r-- | include/net-snmp/agent/table_data.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/include/net-snmp/agent/table_data.h b/include/net-snmp/agent/table_data.h new file mode 100644 index 0000000..f64475e --- /dev/null +++ b/include/net-snmp/agent/table_data.h @@ -0,0 +1,124 @@ +/* + * table_iterator.h + */ +#ifndef _TABLE_DATA_HANDLER_H_ +#define _TABLE_DATA_HANDLER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + /* + * This helper is designed to completely automate the task of storing + * tables of data within the agent that are not tied to external data + * sources (like the kernel, hardware, or other processes, etc). IE, + * all rows within a table are expected to be added manually using + * functions found below. + */ + +#define TABLE_DATA_NAME "table_data" +#define TABLE_DATA_ROW "table_data" +#define TABLE_DATA_TABLE "table_data_table" + + typedef struct netsnmp_table_row_s { + netsnmp_variable_list *indexes; /* stored permanently if store_indexes = 1 */ + oid *index_oid; + size_t index_oid_len; + void *data; /* the data to store */ + + struct netsnmp_table_row_s *next, *prev; /* if used in a list */ + } netsnmp_table_row; + + typedef struct netsnmp_table_data_s { + netsnmp_variable_list *indexes_template; /* containing only types */ + char *name; /* if !NULL, it's registered globally */ + int flags; /* not currently used */ + int store_indexes; + netsnmp_table_row *first_row; + netsnmp_table_row *last_row; + } netsnmp_table_data; + +/* ================================= + * Table Data API: Table maintenance + * ================================= */ + + void netsnmp_table_data_generate_index_oid( netsnmp_table_row *row); + + netsnmp_table_data *netsnmp_create_table_data(const char *name); + netsnmp_table_row *netsnmp_create_table_data_row(void); + netsnmp_table_row *netsnmp_table_data_clone_row( netsnmp_table_row *row); + void *netsnmp_table_data_delete_row(netsnmp_table_row *row); + int netsnmp_table_data_add_row( netsnmp_table_data *table, + netsnmp_table_row *row); + void + netsnmp_table_data_replace_row(netsnmp_table_data *table, + netsnmp_table_row *origrow, + netsnmp_table_row *newrow); + netsnmp_table_row *netsnmp_table_data_remove_row(netsnmp_table_data *table, + netsnmp_table_row *row); + void *netsnmp_table_data_remove_and_delete_row(netsnmp_table_data *table, + netsnmp_table_row *row); + void netsnmp_table_data_delete_table( netsnmp_table_data *table ); + +/* ================================= + * Table Data API: MIB maintenance + * ================================= */ + + netsnmp_mib_handler * + netsnmp_get_table_data_handler(netsnmp_table_data *table); + + int netsnmp_register_table_data(netsnmp_handler_registration *reginfo, + netsnmp_table_data *table, + netsnmp_table_registration_info *table_info); + int netsnmp_register_read_only_table_data( + netsnmp_handler_registration *reginfo, + netsnmp_table_data *table, + netsnmp_table_registration_info *table_info); + Netsnmp_Node_Handler netsnmp_table_data_helper_handler; + + netsnmp_table_data *netsnmp_extract_table( netsnmp_request_info *); + netsnmp_table_row *netsnmp_extract_table_row(netsnmp_request_info *); + void *netsnmp_extract_table_row_data(netsnmp_request_info *); + void netsnmp_insert_table_row(netsnmp_request_info *, netsnmp_table_row *); + + int netsnmp_table_data_build_result(netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *request, + netsnmp_table_row *row, int column, + u_char type, u_char * result_data, + size_t result_data_len); + +/* ================================= + * Table Data API: Row operations + * ================================= */ + + netsnmp_table_row *netsnmp_table_data_get_first_row( + netsnmp_table_data *table); + netsnmp_table_row *netsnmp_table_data_get_next_row( + netsnmp_table_data *table, + netsnmp_table_row *row); + + netsnmp_table_row *netsnmp_table_data_get(netsnmp_table_data *table, + netsnmp_variable_list *indexes); + + netsnmp_table_row *netsnmp_table_data_get_from_oid( + netsnmp_table_data *table, + oid * searchfor, + size_t searchfor_len); + + int netsnmp_table_data_num_rows(netsnmp_table_data *table); + + +/* ================================= + * Table Data API: Index operations + * ================================= */ + +#define netsnmp_table_data_add_index(thetable, type) snmp_varlist_add_variable(&thetable->indexes_template, NULL, 0, type, NULL, 0) +#define netsnmp_table_row_add_index(row, type, value, value_len) snmp_varlist_add_variable(&row->indexes, NULL, 0, type, (const u_char *) value, value_len) + + +#ifdef __cplusplus +} +#endif + +#endif /* _TABLE_DATA_HANDLER_H_ */ |