1 /* 2 * table_iterator.h 3 */ 4 #ifndef _TABLE_DATA_HANDLER_H_ 5 #define _TABLE_DATA_HANDLER_H_ 6 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 11 /* 12 * This helper is designed to completely automate the task of storing 13 * tables of data within the agent that are not tied to external data 14 * sources (like the kernel, hardware, or other processes, etc). IE, 15 * all rows within a table are expected to be added manually using 16 * functions found below. 17 */ 18 19 #define TABLE_DATA_NAME "table_data" 20 #define TABLE_DATA_ROW "table_data" 21 #define TABLE_DATA_TABLE "table_data_table" 22 23 typedef struct netsnmp_table_row_s { 24 netsnmp_variable_list *indexes; /* stored permanently if store_indexes = 1 */ 25 oid *index_oid; 26 size_t index_oid_len; 27 void *data; /* the data to store */ 28 29 struct netsnmp_table_row_s *next, *prev; /* if used in a list */ 30 } netsnmp_table_row; 31 32 typedef struct netsnmp_table_data_s { 33 netsnmp_variable_list *indexes_template; /* containing only types */ 34 char *name; /* if !NULL, it's registered globally */ 35 int flags; /* not currently used */ 36 int store_indexes; 37 netsnmp_table_row *first_row; 38 netsnmp_table_row *last_row; 39 } netsnmp_table_data; 40 41 /* ================================= 42 * Table Data API: Table maintenance 43 * ================================= */ 44 45 void netsnmp_table_data_generate_index_oid( netsnmp_table_row *row); 46 47 netsnmp_table_data *netsnmp_create_table_data(const char *name); 48 netsnmp_table_row *netsnmp_create_table_data_row(void); 49 netsnmp_table_row *netsnmp_table_data_clone_row( netsnmp_table_row *row); 50 void *netsnmp_table_data_delete_row(netsnmp_table_row *row); 51 int netsnmp_table_data_add_row( netsnmp_table_data *table, 52 netsnmp_table_row *row); 53 void 54 netsnmp_table_data_replace_row(netsnmp_table_data *table, 55 netsnmp_table_row *origrow, 56 netsnmp_table_row *newrow); 57 netsnmp_table_row *netsnmp_table_data_remove_row(netsnmp_table_data *table, 58 netsnmp_table_row *row); 59 void *netsnmp_table_data_remove_and_delete_row(netsnmp_table_data *table, 60 netsnmp_table_row *row); 61 void netsnmp_table_data_delete_table( netsnmp_table_data *table ); 62 63 /* ================================= 64 * Table Data API: MIB maintenance 65 * ================================= */ 66 67 netsnmp_mib_handler * 68 netsnmp_get_table_data_handler(netsnmp_table_data *table); 69 70 int netsnmp_register_table_data(netsnmp_handler_registration *reginfo, 71 netsnmp_table_data *table, 72 netsnmp_table_registration_info *table_info); 73 int netsnmp_register_read_only_table_data( 74 netsnmp_handler_registration *reginfo, 75 netsnmp_table_data *table, 76 netsnmp_table_registration_info *table_info); 77 Netsnmp_Node_Handler netsnmp_table_data_helper_handler; 78 79 netsnmp_table_data *netsnmp_extract_table( netsnmp_request_info *); 80 netsnmp_table_row *netsnmp_extract_table_row(netsnmp_request_info *); 81 void *netsnmp_extract_table_row_data(netsnmp_request_info *); 82 void netsnmp_insert_table_row(netsnmp_request_info *, netsnmp_table_row *); 83 84 int netsnmp_table_data_build_result(netsnmp_handler_registration *reginfo, 85 netsnmp_agent_request_info *reqinfo, 86 netsnmp_request_info *request, 87 netsnmp_table_row *row, int column, 88 u_char type, u_char * result_data, 89 size_t result_data_len); 90 91 /* ================================= 92 * Table Data API: Row operations 93 * ================================= */ 94 95 netsnmp_table_row *netsnmp_table_data_get_first_row( 96 netsnmp_table_data *table); 97 netsnmp_table_row *netsnmp_table_data_get_next_row( 98 netsnmp_table_data *table, 99 netsnmp_table_row *row); 100 101 netsnmp_table_row *netsnmp_table_data_get(netsnmp_table_data *table, 102 netsnmp_variable_list *indexes); 103 104 netsnmp_table_row *netsnmp_table_data_get_from_oid( 105 netsnmp_table_data *table, 106 oid * searchfor, 107 size_t searchfor_len); 108 109 int netsnmp_table_data_num_rows(netsnmp_table_data *table); 110 111 112 /* ================================= 113 * Table Data API: Index operations 114 * ================================= */ 115 116 #define netsnmp_table_data_add_index(thetable, type) snmp_varlist_add_variable(&thetable->indexes_template, NULL, 0, type, NULL, 0) 117 #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) 118 119 120 #ifdef __cplusplus 121 } 122 #endif 123 124 #endif /* _TABLE_DATA_HANDLER_H_ */ 125