diff options
Diffstat (limited to 'include/net-snmp/agent/table.h')
-rw-r--r-- | include/net-snmp/agent/table.h | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/include/net-snmp/agent/table.h b/include/net-snmp/agent/table.h new file mode 100644 index 0000000..79e588c --- /dev/null +++ b/include/net-snmp/agent/table.h @@ -0,0 +1,200 @@ +/* Portions of this file are subject to the following copyright(s). See + * the Net-SNMP's COPYING file for more details and other copyrights + * that may apply: + */ +/* + * Portions of this file are copyrighted by: + * Copyright © 2003 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms specified in the COPYING file + * distributed with the Net-SNMP package. + */ +/* + * Portions of this file are copyrighted by: + * Copyright (C) 2007 Apple, Inc. All rights reserved. + * Use is subject to license terms specified in the COPYING file + * distributed with the Net-SNMP package. + */ +/* + * @file table.h + * + * @addtogroup table + * + * @{ + */ +#ifndef _TABLE_HANDLER_H_ +#define _TABLE_HANDLER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The table helper is designed to simplify the task of writing a + * table handler for the net-snmp agent. You should create a normal + * handler and register it using the netsnmp_register_table() function + * instead of the netsnmp_register_handler() function. + */ + +/** + * Notes: + * + * 1) illegal indexes automatically get handled for get/set cases. + * Simply check to make sure the value is type ASN_NULL before + * you answer a request. + */ + +/** + * used as an index to parent_data lookups + */ +#define TABLE_HANDLER_NAME "table" + +/** @typedef struct netsnmp_column_info_t netsnmp_column_info + * Typedefs the netsnmp_column_info_t struct into netsnmp_column_info */ + +/** + * @struct netsnmp_column_info_t + * column info struct. OVERLAPPING RANGES ARE NOT SUPPORTED. + */ + typedef struct netsnmp_column_info_t { + char isRange; + /** only useful if isRange == 0 */ + char list_count; + + union { + unsigned int range[2]; + unsigned int *list; + } details; + + struct netsnmp_column_info_t *next; + + } netsnmp_column_info; + +/** @typedef struct netsnmp_table_registration_info_s netsnmp_table_registration_info + * Typedefs the netsnmp_table_registration_info_s struct into + * netsnmp_table_registration_info */ + +/** + * @struct netsnmp_table_registration_info_s + * Table registration structure. + */ + typedef struct netsnmp_table_registration_info_s { + /** list of varbinds with only 'type' set */ + netsnmp_variable_list *indexes; + /** calculated automatically */ + unsigned int number_indexes; + + /** + * the minimum columns number. If there are columns + * in-between which are not valid, use valid_columns to get + * automatic column range checking. + */ + unsigned int min_column; + /** the maximum columns number */ + unsigned int max_column; + + /** more details on columns */ + netsnmp_column_info *valid_columns; + + } netsnmp_table_registration_info; + +/** @typedef struct netsnmp_table_request_info_s netsnmp_table_request_info + * Typedefs the netsnmp_table_request_info_s struct into + * netsnmp_table_request_info */ + +/** + * @struct netsnmp_table_request_info_s + * The table request info structure. + */ + typedef struct netsnmp_table_request_info_s { + /** 0 if OID not long enough */ + unsigned int colnum; + /** 0 if failure to parse any */ + unsigned int number_indexes; + /** contents freed by helper upon exit */ + netsnmp_variable_list *indexes; + + oid index_oid[MAX_OID_LEN]; + size_t index_oid_len; + netsnmp_table_registration_info *reg_info; + } netsnmp_table_request_info; + + netsnmp_mib_handler + *netsnmp_get_table_handler(netsnmp_table_registration_info + *tabreq); + void netsnmp_handler_owns_table_info(netsnmp_mib_handler *handler); + void netsnmp_registration_owns_table_info(netsnmp_handler_registration *reg); + int netsnmp_register_table( netsnmp_handler_registration *reginfo, + netsnmp_table_registration_info *tabreq); + int netsnmp_unregister_table(netsnmp_handler_registration *reginfo); + int netsnmp_table_build_oid( netsnmp_handler_registration *reginfo, + netsnmp_request_info *reqinfo, + netsnmp_table_request_info *table_info); + int + netsnmp_table_build_oid_from_index(netsnmp_handler_registration + *reginfo, + netsnmp_request_info *reqinfo, + netsnmp_table_request_info + *table_info); + int netsnmp_table_build_result(netsnmp_handler_registration + *reginfo, + netsnmp_request_info + *reqinfo, + netsnmp_table_request_info + *table_info, u_char type, + u_char * result, + size_t result_len); + int + netsnmp_update_variable_list_from_index(netsnmp_table_request_info + *); + int + netsnmp_update_indexes_from_variable_list + (netsnmp_table_request_info *tri); + netsnmp_table_registration_info + *netsnmp_find_table_registration_info(netsnmp_handler_registration + *reginfo); + netsnmp_table_registration_info * + netsnmp_table_registration_info_clone(netsnmp_table_registration_info *tri); + void netsnmp_table_registration_info_free(netsnmp_table_registration_info *); + + netsnmp_index * netsnmp_table_index_find_next_row(netsnmp_container *c, + netsnmp_table_request_info *tblreq); + + unsigned int netsnmp_closest_column(unsigned int current, + netsnmp_column_info + *valid_columns); + + Netsnmp_Node_Handler table_helper_handler; + +#define netsnmp_table_helper_add_index(tinfo, type) snmp_varlist_add_variable(&tinfo->indexes, NULL, 0, (u_char)type, NULL, 0); + + void + netsnmp_table_helper_add_indexes(netsnmp_table_registration_info + *tinfo, ...); + + int netsnmp_check_getnext_reply(netsnmp_request_info *request, + oid * prefix, size_t prefix_len, + netsnmp_variable_list * newvar, + netsnmp_variable_list ** outvar); + + netsnmp_table_request_info + *netsnmp_extract_table_info(netsnmp_request_info *); + netsnmp_oid_stash_node + **netsnmp_table_get_or_create_row_stash(netsnmp_agent_request_info + *reqinfo, + const u_char * + storage_name); + unsigned int + netsnmp_table_next_column(netsnmp_table_request_info *table_info); + + + int netsnmp_sparse_table_register(netsnmp_handler_registration *reginfo, + netsnmp_table_registration_info *tabreq); + + netsnmp_mib_handler *netsnmp_sparse_table_handler_get(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _TABLE_HANDLER_H_ */ +/** @} */ |