/* * table_generic.c * * Generic table API framework */ /** @defgroup table_generic generic_table_API * General requirements for a table helper. * @ingroup table * * A given table helper need not implement the whole of this API, * and may need to adjust the prototype of certain routines. * But this description provides a suitable standard design framework. * * @{ */ /* ======================================================= * * Table Maintenance: * create/delete table * create/copy/clone/delete row * add/replace/remove row * * ======================================================= */ /** @defgroup table_maintenance table_maintenance * * Routines for maintaining the contents of a table. * This would typically be part of implementing an SNMP MIB, * but could potentially also be used for a standalone table. * * This section of the generic API is primarily relevant to * table helpers where the representation of the table is * constructed and maintained within the helper itself. * "External" tables will typically look after such aspects * directly, although this section of the abstract API * framework could also help direct the design of such * table-specific implementations. * * @{ */ /** Create a structure to represent the table. * * This could be as simple as the head of a linked * list, or a more complex container structure. * The 'name' field would typically be used to * distinguish between several tables implemented * using the same table helper. The 'flags' field * would be used to control various (helper-specific) * aspects of table behaviour. * * The table structure returned should typically be * regarded as an opaque, private structure. All * operations on the content of the table should * ideally use the appropriate routines from this API. */ void * netsnmp_generic_create_table( const char *name, int flags ) { } /** Release the structure representing a table. * Any rows still contained within the table * should also be removed and deleted. */ void netsnmp_generic_delete_table( void *table ) { } /** Create a new row structure suitable for this style of table. * Note that this would typically be a 'standalone' row, and * would not automatically be inserted into an actual table. */ void * netsnmp_generic_create_row( void ) { } /** Create a new copy of the specified row. */ void * netsnmp_generic_clone_row( void *row ) { } /** Copy the contents of one row into another. * The destination row structure should be * created before this routine is called. */ int netsnmp_generic_copy_row( void *dst_row, void *src_row ) { } /** Delete a row data structure. * The row should be removed from any relevant * table(s) before this routine is called. */ void netsnmp_generic_delete_row( void *row ) { } /** Add a row to the table. */ int netsnmp_generic_add_row( void *table, void *row ) { } /** Replace one row with another in the table. * This will typically (but not necessarily) involve * two rows sharing the same index information (e.g. * to implement update/restore-style SET behaviour). */ int netsnmp_generic_replace_row( void *table, void *old_row, void *new_row ) { } /** Remove a row from the table. * The data structure for the row should not be released, * and would be the return value of this routine. */ void * netsnmp_generic_remove_row( void *table, void *row ) { } /** Remove and delete a row from the table. */ void netsnmp_generic_remove_delete_row( void *table, void *row ) { } /** @} end of table_maintenance */ /* ======================================================= * * MIB Maintenance: * create a handler registration * register/unregister table * extract table from request * extract/insert row * * ======================================================= */ /** @defgroup mib_maintenance mib_maintenance * * Routines for maintaining a MIB table. * * @{ */ /** Create a MIB handler structure. * This will typically be invoked within the corresponding * 'netsnmp_generic_register' routine (or the registration * code of a sub-helper based on this helper). * * Alternatively, it might be called from the initialisation * code of a particular MIB table implementation. */ netsnmp_mib_handler * netsnmp_generic_get_handler(void /* table specific */ ) { } /** Free a MIB handler structure, releasing any related resources. * Possibly called automatically by 'netsnmp_unregister_handler' ? */ netsnmp_generic_free_handler( netsnmp_mib_handler *handler ) { } /** Register a MIB table with the SNMP agent. */ int netsnmp_generic_register(netsnmp_handler_registration *reginfo, void *table, netsnmp_table_registration_info *table_info) { } /** Unregister a MIB table from the SNMP agent. * This should also release the internal representation of the table. * ?? Is a table-specific version of this needed, or would * 'netsnmp_unregister_handler' + 'netsnmp_generic_free_handler' do? */ int netsnmp_generic_unregister(netsnmp_handler_registration *reginfo) { } /** Extract the table relating to a requested varbind. */ void netsnmp_generic_extract_table( netsnmp_request_info *request ) { } /** Extract the row relating to a requested varbind. */ void netsnmp_generic_extract_row( netsnmp_request_info *request ) { } /** Associate a (new) row with the requested varbind. * The row should also be associated with any other * varbinds that refer to the same index values. */ void netsnmp_generic_insert_row( netsnmp_request_info *request, void *row ) { } /** @} end of mib_maintenance */ /* ======================================================= * * Row Operations * get first/this/next row * get row/next row by index * get row/next row by OID * number of rows * * ======================================================= */ /** @defgroup table_rows table_rows * * Routines for working with the rows of a table. * * @{ */ /** Retrieve the first row of the table. */ void * netsnmp_generic_row_first( void *table ) { } /** Retrieve the given row from the table. * This could either be the same data pointer, * passed in, or a separate row structure * sharing the same index values (or NULL). * * This routine also provides a means to tell * whether a given row is present in the table. */ void * netsnmp_generic_row_get( void *table, void *row ) { } /** Retrieve the following row from the table. * If the specified row is not present, this * routine should return the entry next after * the position this row would have occupied. */ void * netsnmp_generic_row_next( void *table, void *row ) { } /** Retrieve the row with the specified index values. */ void * netsnmp_generic_row_get_byidx( void *table, netsnmp_variable_list *indexes ) { } /** Retrieve the next row after the specified index values. */ void * netsnmp_generic_row_next_byidx( void *table, netsnmp_variable_list *indexes ) { } /** Retrieve the row with the specified instance OIDs. */ void * netsnmp_generic_row_get_byoid( void *table, oid *instance, size_t len ) { } /** Retrieve the next row after the specified instance OIDs. */ void * netsnmp_generic_row_next_byoid( void *table, oid *instance, size_t len ) { } /** Report the number of rows in the table. */ int netsnmp_generic_row_count( void *table ) { } /** @} end of table_rows */ /* ======================================================= * * Index Operations * get table index structure * get row index values/OIDs * compare row with index/OIDs * subtree comparisons (index/OIDs) * * ======================================================= */ /** @defgroup table_indexes table_indexes * * Routines for working with row indexes. * * @{ */ /** Retrieve the indexing structure of the table. */ netsnmp_variable_list * netsnmp_generic_idx( void *table ) { } /** Report the index values for a row. */ netsnmp_variable_list * netsnmp_generic_row_idx( void *row ) { } /** Report the instance OIDs for a row. */ size_t netsnmp_generic_row_oid( void *row, oid *instances ) { } /** Compare a row against the specified index values. */ int netsnmp_generic_compare_idx( void *row, netsnmp_variable_list *index ) { } /** Compare a row against the specified instance OIDs. */ int netsnmp_generic_compare_oid( void *row, oid *instances, size_t len ) { } /** Check if a row lies within a subtree of index values. */ int netsnmp_generic_compare_subtree_idx( void *row, netsnmp_variable_list *index ) { } /** Check if a row lies within a subtree of instance OIDs. */ int netsnmp_generic_compare_subtree_oid( void *row, oid *instances, size_t len ) { } /** @} end of table_indexes */ /** @} end of table_generic */