blob: 8cdb1e795967e22297275a969d406750669e1965 [file] [log] [blame]
/* 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.
*/
/**
* @file table_iterator.h
* @addtogroup table_iterator
* @{
*/
#ifndef _TABLE_ITERATOR_HANDLER_H_
#define _TABLE_ITERATOR_HANDLER_H_
#ifdef __cplusplus
extern "C" {
#endif
struct netsnmp_iterator_info_s;
typedef netsnmp_variable_list *
(Netsnmp_First_Data_Point) (void **loop_context,
void **data_context,
netsnmp_variable_list *,
struct netsnmp_iterator_info_s *);
typedef netsnmp_variable_list *
(Netsnmp_Next_Data_Point) (void **loop_context,
void **data_context,
netsnmp_variable_list *,
struct netsnmp_iterator_info_s *);
typedef void *(Netsnmp_Make_Data_Context) (void *loop_context,
struct netsnmp_iterator_info_s *);
typedef void (Netsnmp_Free_Loop_Context) (void *,
struct netsnmp_iterator_info_s *);
typedef void (Netsnmp_Free_Data_Context) (void *,
struct netsnmp_iterator_info_s *);
/** @typedef struct netsnmp_iterator_info_s netsnmp_iterator_info
* Typedefs the netsnmp_iterator_info_s struct into netsnmp_iterator_info */
/** @struct netsnmp_iterator_info_s
* Holds iterator information containing functions which should be
called by the iterator_handler to loop over your data set and
sort it in a SNMP specific manner.
The netsnmp_iterator_info typedef can be used instead of directly calling this struct if you would prefer.
*/
typedef struct netsnmp_iterator_info_s {
/** Responsible for: returning the first set of "index" data, a
loop-context pointer, and optionally a data context
pointer */
Netsnmp_First_Data_Point *get_first_data_point;
/** Given the previous loop context, this should return the
next loop context, associated index set and optionally a
data context */
Netsnmp_Next_Data_Point *get_next_data_point;
/** If a data context wasn't supplied by the
get_first_data_point or get_next_data_point functions and
the make_data_context pointer is defined, it will be called
to convert a loop context into a data context. */
Netsnmp_Make_Data_Context *make_data_context;
/** A function which should free the loop context. This
function is called at *each* iteration step, which is
not-optimal for speed purposes. The use of
free_loop_context_at_end instead is strongly
encouraged. This can be set to NULL to avoid its usage. */
Netsnmp_Free_Loop_Context *free_loop_context;
/** Frees a data context. This will be called at any time a
data context needs to be freed. This may be at the same
time as a correspondng loop context is freed, or much much
later. Multiple data contexts may be kept in existence at
any time. */
Netsnmp_Free_Data_Context *free_data_context;
/** Frees a loop context at the end of the entire iteration
sequence. Generally, this would free the loop context
allocated by the get_first_data_point function (which would
then be updated by each call to the get_next_data_point
function). It is not called until the get_next_data_point
function returns a NULL */
Netsnmp_Free_Loop_Context *free_loop_context_at_end;
/** This can be used by client handlers to store any
information they need */
void *myvoid;
int flags;
#define NETSNMP_ITERATOR_FLAG_SORTED 0x01
/** A pointer to the netsnmp_table_registration_info object
this iterator is registered along with. */
netsnmp_table_registration_info *table_reginfo;
/* Experimental extension - Use At Your Own Risk
(these two fields may change/disappear without warning) */
Netsnmp_First_Data_Point *get_row_indexes;
netsnmp_variable_list *indexes;
} netsnmp_iterator_info;
#define TABLE_ITERATOR_NAME "table_iterator"
/* ============================
* Iterator API: Table maintenance
* ============================ */
/* N/A */
/* ============================
* Iterator API: MIB maintenance
* ============================ */
netsnmp_mib_handler
*netsnmp_get_table_iterator_handler(netsnmp_iterator_info *iinfo);
int netsnmp_register_table_iterator( netsnmp_handler_registration
*reginfo,
netsnmp_iterator_info *iinfo);
void netsnmp_iterator_delete_table(netsnmp_iterator_info *iinfo);
void *netsnmp_extract_iterator_context(netsnmp_request_info *);
void netsnmp_insert_iterator_context(netsnmp_request_info *, void *);
Netsnmp_Node_Handler netsnmp_table_iterator_helper_handler;
/* ============================
* Iterator API: Row operations
* ============================ */
void *netsnmp_iterator_row_first( netsnmp_iterator_info *);
void *netsnmp_iterator_row_get( netsnmp_iterator_info *, void *);
void *netsnmp_iterator_row_next( netsnmp_iterator_info *, void *);
void *netsnmp_iterator_row_get_byidx( netsnmp_iterator_info *,
netsnmp_variable_list *);
void *netsnmp_iterator_row_next_byidx( netsnmp_iterator_info *,
netsnmp_variable_list *);
void *netsnmp_iterator_row_get_byoid( netsnmp_iterator_info *, oid *, size_t);
void *netsnmp_iterator_row_next_byoid( netsnmp_iterator_info *, oid *, size_t);
int netsnmp_iterator_row_count( netsnmp_iterator_info *);
/* ============================
* Iterator API: Index operations
* ============================ */
#ifdef __cplusplus
}
#endif
#endif /* _TABLE_ITERATOR_HANDLER_H_ */
/** @} */