/* * table_iterator.h */ #ifndef _TABLE_DATA_SET_HANDLER_H_ #define _TABLE_DATA_SET_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. */ void netsnmp_init_table_dataset(void); #define TABLE_DATA_SET_NAME "netsnmp_table_data_set" /* * return SNMP_ERR_NOERROR or some SNMP specific protocol error id */ typedef int (Netsnmp_Value_Change_Ok) (char *old_value, size_t old_value_len, char *new_value, size_t new_value_len, void *mydata); /* * stored within a given row */ typedef struct netsnmp_table_data_set_storage_s { unsigned int column; /* * info about it? */ char writable; Netsnmp_Value_Change_Ok *change_ok_fn; void *my_change_data; /* * data actually stored */ u_char type; union { /* value of variable */ void *voidp; long *integer; u_char *string; oid *objid; u_char *bitstring; struct counter64 *counter64; #ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES float *floatVal; double *doubleVal; #endif /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */ } data; u_long data_len; struct netsnmp_table_data_set_storage_s *next; } netsnmp_table_data_set_storage; typedef struct netsnmp_table_data_set_s { netsnmp_table_data *table; netsnmp_table_data_set_storage *default_row; int allow_creation; /* set to 1 to allow creation of new rows */ unsigned int rowstatus_column; } netsnmp_table_data_set; /* ============================ * DataSet API: Table maintenance * ============================ */ netsnmp_table_data_set *netsnmp_create_table_data_set(const char *); netsnmp_table_row *netsnmp_table_data_set_clone_row( netsnmp_table_row *row); void netsnmp_table_dataset_delete_all_data( netsnmp_table_data_set_storage *data); void netsnmp_table_dataset_delete_row(netsnmp_table_row *row); void netsnmp_table_dataset_add_row(netsnmp_table_data_set *table, netsnmp_table_row *row); void netsnmp_table_dataset_replace_row(netsnmp_table_data_set *table, netsnmp_table_row *origrow, netsnmp_table_row *newrow); void netsnmp_table_dataset_remove_row(netsnmp_table_data_set *table, netsnmp_table_row *row); void netsnmp_table_dataset_remove_and_delete_row(netsnmp_table_data_set *table, netsnmp_table_row *row); void netsnmp_delete_table_data_set(netsnmp_table_data_set *table_set); /* ============================ * DataSet API: Default row operations * ============================ */ /* * to set, add column, type, (writable) ? 1 : 0 */ /* * default value, if not NULL, is the default value used in row * creation. It is copied into the storage template (free your * calling argument). */ int netsnmp_table_set_add_default_row(netsnmp_table_data_set *, unsigned int, int, int, void *default_value, size_t default_value_len); void netsnmp_table_set_multi_add_default_row(netsnmp_table_data_set *, ...); /* ============================ * DataSet API: MIB maintenance * ============================ */ netsnmp_mib_handler *netsnmp_get_table_data_set_handler(netsnmp_table_data_set *); Netsnmp_Node_Handler netsnmp_table_data_set_helper_handler; int netsnmp_register_table_data_set(netsnmp_handler_registration *, netsnmp_table_data_set *, netsnmp_table_registration_info *); netsnmp_table_data_set *netsnmp_extract_table_data_set(netsnmp_request_info *request); netsnmp_table_data_set_storage *netsnmp_extract_table_data_set_column(netsnmp_request_info *, unsigned int); netsnmp_oid_stash_node ** netsnmp_table_dataset_get_or_create_stash(netsnmp_agent_request_info *ari, netsnmp_table_data_set *tds, netsnmp_table_request_info *tri); netsnmp_table_row * netsnmp_table_dataset_get_newrow(netsnmp_request_info *request, netsnmp_agent_request_info *reqinfo, int rootoid_len, netsnmp_table_data_set *datatable, netsnmp_table_request_info *table_info); /* ============================ * DataSet API: Config-based operations * ============================ */ void netsnmp_register_auto_data_table(netsnmp_table_data_set *table_set, char *registration_name); void netsnmp_unregister_auto_data_table(netsnmp_table_data_set *table_set, char *registration_name); void netsnmp_config_parse_table_set(const char *token, char *line); void netsnmp_config_parse_add_row( const char *token, char *line); /* ============================ * DataSet API: Row operations * ============================ */ netsnmp_table_row *netsnmp_table_data_set_get_first_row(netsnmp_table_data_set *table); netsnmp_table_row *netsnmp_table_data_set_get_next_row( netsnmp_table_data_set *table, netsnmp_table_row *row); int netsnmp_table_set_num_rows(netsnmp_table_data_set *table); /* ============================ * DataSet API: Column operations * ============================ */ netsnmp_table_data_set_storage *netsnmp_table_data_set_find_column(netsnmp_table_data_set_storage *, unsigned int); int netsnmp_mark_row_column_writable( netsnmp_table_row *row, int column, int writable); int netsnmp_set_row_column( netsnmp_table_row *, unsigned int, int, const void *, size_t); /* ============================ * DataSet API: Index operations * ============================ */ void netsnmp_table_dataset_add_index(netsnmp_table_data_set *table, u_char type); void netsnmp_table_set_add_indexes(netsnmp_table_data_set *tset, ...); #ifdef __cplusplus } #endif #define netsnmp_table_row_add_column(row, type, value, value_len) snmp_varlist_add_variable(&row->indexes, NULL, 0, type, (u_char *) value, value_len) #endif /* _TABLE_DATA_SET_HANDLER_H_ */