blob: 9b8a9a370f8917d1d9bed1d6fdf3b1f6d2e67f04 [file] [log] [blame]
/*
* 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_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_ */