documentation. Can't get enough.
- make docs now installs man pages into the man dir, which are then installed.
git-svn-id: file:///home/hardaker/lib/sf-bkups/net-snmp-convert-svnrepo/trunk@6901 06827809-a52a-0410-b366-d66718629ded
diff --git a/Makefile.in b/Makefile.in
index 5733681..5296f2d 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -49,9 +49,16 @@
EXAMPLE.conf: sedscript EXAMPLE.conf.def
$(SED) -f sedscript $(srcdir)/EXAMPLE.conf.def > EXAMPLE.conf
-docs: doxygen.conf
+docs: docsdir mancp
+
+docsdir: doxygen.conf
srcdir=$(srcdir) doxygen $(srcdir)/doxygen.conf
+mancp:
+ @for i in docs/man/man3/* ; do \
+ cp $$i man/netsnmp_`basename $$i` ; \
+ done
+
net-snmp-config-x:
chmod a+x net-snmp-config
@@ -177,5 +184,5 @@
FAQ.html:
local/FAQ2HTML FAQ
-.PHONY: docs testdirs test TAGS net-snmp-config-x
+.PHONY: docs docsdir mancp testdirs test TAGS net-snmp-config-x
# note: tags and docs are phony to force rebulding
diff --git a/man/Makefile.in b/man/Makefile.in
index f4aac6e..8b95240 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -27,7 +27,13 @@
read_module_node.3 read_objid.3 add_module_replacement.3 \
shutdown_mib.3 print_mib.3 print_variable.3 print_value.3 \
print_objid.3 print_description.3 snmp_set_save_descriptions.3 \
- get_module_node.3
+ get_module_node.3 \
+ netsnmp_agent.3 netsnmp_bulk_to_next.3 netsnmp_debug.3 \
+ netsnmp_example_scalar_int.3 netsnmp_handler.3 netsnmp_instance.3 \
+ netsnmp_mib_handler_methods.3 netsnmp_multiplexer.3 netsnmp_old_api.3 \
+ netsnmp_read_only.3 netsnmp_serialize.3 netsnmp_table.3 \
+ netsnmp_table_array.3 netsnmp_table_data.3 netsnmp_table_dataset.3 \
+ netsnmp_table_iterator.3 netsnmp_todo.3
MAN3G = default_store.3 mib_api.3 read_config.3 snmp_agent_api.3 snmp_alarm.3 \
snmp_api.3 snmp_sess_api.3 snmp_trap_api.3
MAN5G = snmpd.conf.5 snmptrapd.conf.5 snmp.conf.5 snmp_config.5 variables.5
diff --git a/man/netsnmp_agent.3 b/man/netsnmp_agent.3
new file mode 100644
index 0000000..b22ad81
--- /dev/null
+++ b/man/netsnmp_agent.3
@@ -0,0 +1,20 @@
+.TH "The snmp agent" 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+The snmp agent \- The snmp agent responds to SNMP queries from management stations.
+More...
+.SS "Modules"
+
+.in +1c
+.ti -1c
+.RI "\fBAgent handler API\fP"
+.br
+.RI "\fIThe basic theory goes something like this: In the past, with the original mib module api (which derived from the original CMU SNMP code) the underlying mib modules were passed very little information (only the truly most basic information about a request).\fP"
+.PP
+
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+The snmp agent responds to SNMP queries from management stations.
+.PP
diff --git a/man/netsnmp_bulk_to_next.3 b/man/netsnmp_bulk_to_next.3
new file mode 100644
index 0000000..c8e36ef
--- /dev/null
+++ b/man/netsnmp_bulk_to_next.3
@@ -0,0 +1,59 @@
+.TH "bulk_to_next: convert GETBULK requests into GETNEXT requests for the handler." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+bulk_to_next: convert GETBULK requests into GETNEXT requests for the handler. \- The only purpose of this handler is to convert a GETBULK request to a GETNEXT request.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_bulk_to_next_handler\fP (void)"
+.br
+.RI "\fIreturns a bulk_to_next handler that can be injected into a given handler chain.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_bulk_to_next_fix_requests\fP (netsnmp_request_info *requests)"
+.br
+.RI "\fItakes answered requests and decrements the repeat count and updates the requests to the next to-do varbind in the list.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_bulk_to_next_helper\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "void \fBnetsnmp_init_bulk_to_next_helper\fP (void)"
+.br
+.RI "\fIinitializes the bulk_to_next helper which then registers a bulk_to_next handler as a run-time injectable handler for configuration file use.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+The only purpose of this handler is to convert a GETBULK request to a GETNEXT request.
+.PP
+It is inserted into handler chains where the handler has not set the HANDLER_CAN_GETBULK flag.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "void netsnmp_bulk_to_next_fix_requests (netsnmp_request_info * requests)"
+.PP
+takes answered requests and decrements the repeat count and updates the requests to the next to-do varbind in the list.
+.PP
+Definition at line 37 of file bulk_to_next.c.
+.PP
+Referenced by netsnmp_bulk_to_next_helper().
+.PP
+.SS "int netsnmp_bulk_to_next_helper (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 58 of file bulk_to_next.c.
+.SS "netsnmp_mib_handler* netsnmp_get_bulk_to_next_handler (void)"
+.PP
+returns a bulk_to_next handler that can be injected into a given handler chain.
+.PP
+Definition at line 30 of file bulk_to_next.c.
+.PP
+Referenced by netsnmp_init_bulk_to_next_helper(), and netsnmp_register_handler().
+.PP
+.SS "void netsnmp_init_bulk_to_next_helper (void)"
+.PP
+initializes the bulk_to_next helper which then registers a bulk_to_next handler as a run-time injectable handler for configuration file use.
+.PP
+Definition at line 88 of file bulk_to_next.c.
\ No newline at end of file
diff --git a/man/netsnmp_debug.3 b/man/netsnmp_debug.3
new file mode 100644
index 0000000..1161bd4
--- /dev/null
+++ b/man/netsnmp_debug.3
@@ -0,0 +1,67 @@
+.TH "debug: print out debugging information about the handler chain being called." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+debug: print out debugging information about the handler chain being called. \- This is a useful module for run-time debugging of requests as the pass this handler in a calling chain.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_debug_handler\fP (void)"
+.br
+.RI "\fIreturns a debug handler that can be injected into a given handler chain.\fP"
+.ti -1c
+.RI "void \fBdebug_print_requests\fP (netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_debug_helper\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "void \fBnetsnmp_init_debug_helper\fP (void)"
+.br
+.RI "\fIinitializes the debug helper which then registers a debug handler as a run-time injectable handler for configuration file use.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This is a useful module for run-time debugging of requests as the pass this handler in a calling chain.
+.PP
+All debugging output is done via the standard debugging routines with a token name of 'helper:debug', so use the -Dhelper:debug command line flag to see the output when running the snmpd demon. It's not recommended you compile this into a handler chain during compile time, but instead use the 'injectHandler' token in the snmpd.conf file (or similar) to add it to the chain later:
+.PP
+injectHandler debug my_module_name
+.PP
+to see an example output, try:
+.PP
+injectHandler debug mibII/system
+.PP
+and then run snmpwalk on the 'system' group.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "void debug_print_requests (netsnmp_request_info * requests)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 50 of file debug_handler.c.
+.PP
+Referenced by netsnmp_debug_helper().
+.PP
+.SS "int netsnmp_debug_helper (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 80 of file debug_handler.c.
+.SS "netsnmp_mib_handler* netsnmp_get_debug_handler (void)"
+.PP
+returns a debug handler that can be injected into a given handler chain.
+.PP
+Definition at line 44 of file debug_handler.c.
+.PP
+Referenced by netsnmp_init_debug_helper().
+.PP
+.SS "void netsnmp_init_debug_helper (void)"
+.PP
+initializes the debug helper which then registers a debug handler as a run-time injectable handler for configuration file use.
+.PP
+Definition at line 144 of file debug_handler.c.
\ No newline at end of file
diff --git a/man/netsnmp_example_scalar_int.3 b/man/netsnmp_example_scalar_int.3
new file mode 100644
index 0000000..6023e27
--- /dev/null
+++ b/man/netsnmp_example_scalar_int.3
@@ -0,0 +1,26 @@
+.TH "example_scalar_int: instantiates a few example scalars." 3 "6 Mar 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+example_scalar_int: instantiates a few example scalars. \- This example merely creates some scalar registrations that allows some simple variables to be accessed via SNMP.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "void \fBinit_scalar_int\fP (void)"
+.br
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This example merely creates some scalar registrations that allows some simple variables to be accessed via SNMP.
+.PP
+In a more realistic example, it is likely that these variables would also be manipulated in other ways outside of SNMP gets/sets.
+.PP
+If this module is compiled into an agent, you should be able to issue snmp commands that look something like (authentication information not shown in these commands):
+.PP
+snmpget localhost netSnmpExampleInteger.0 netSnmpExampleScalars = 42
+.PP
+snmpset localhost netSnmpExampleInteger.0 = 1234 netSnmpExampleScalars = 1234
+.PP
+snmpget localhost netSnmpExampleInteger.0 netSnmpExampleScalars = 1234
\ No newline at end of file
diff --git a/man/netsnmp_handler.3 b/man/netsnmp_handler.3
new file mode 100644
index 0000000..01debd8
--- /dev/null
+++ b/man/netsnmp_handler.3
@@ -0,0 +1,419 @@
+.TH "Agent handler API" 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+Agent handler API \- The basic theory goes something like this: In the past, with the original mib module api (which derived from the original CMU SNMP code) the underlying mib modules were passed very little information (only the truly most basic information about a request).
+More...
+.SS "Modules"
+
+.in +1c
+.ti -1c
+.RI "\fBtable: Helps you implement a table.\fP"
+.br
+.RI "\fIThis handler helps you implement a table by doing some of the processing for you.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBserialize: Calls sub handlers one request at a time.\fP"
+.br
+.RI "\fIThis functionally passes in one request at a time into lower handlers rather than a whole bunch of requests at once.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBread_only: make your handler read_only automatically\fP"
+.br
+.RI "\fIThe only purpose of this handler is to return an appropriate error for any requests passed to it in a SET mode.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBold_api: Calls mib module code written in the old style of code.\fP"
+.br
+.RI "\fIThis is a backwards compatilibity module that allows code written in the old API to be run under the new handler based architecture.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBmultiplexer: splits mode requests into calls to different handlers.\fP"
+.br
+.RI "\fIThe multiplexer helper lets you split the calling chain depending on the calling mode (get vs getnext vs set).\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBinstance: process scalars and other instances easily.\fP"
+.br
+.ti -1c
+.RI "\fBdebug: print out debugging information about the handler chain being called.\fP"
+.br
+.RI "\fIThis is a useful module for run-time debugging of requests as the pass this handler in a calling chain.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBbulk_to_next: convert GETBULK requests into GETNEXT requests for the handler.\fP"
+.br
+.RI "\fIThe only purpose of this handler is to convert a GETBULK request to a GETNEXT request.\fP"
+.PP
+
+.in -1c
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_create_handler\fP (const char *name, Netsnmp_Node_Handler *handler_access_method)"
+.br
+.RI "\fIcreates a netsnmp_mib_handler structure given a name and a access method.\fP"
+.ti -1c
+.RI "netsnmp_handler_registration * \fBnetsnmp_create_handler_registration\fP (const char *name, Netsnmp_Node_Handler *handler_access_method, oid *reg_oid, size_t reg_oid_len, int modes)"
+.br
+.RI "\fIcreates a handler registration structure given a name, a access_method function, a registration location oid and the modes the handler supports.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_handler\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIregister a handler, as defined by the netsnmp_handler_registration pointer.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_handler_nocallback\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIregister a handler, as defined by the netsnmp_handler_registration pointer.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_inject_handler\fP (netsnmp_handler_registration *reginfo, netsnmp_mib_handler *handler)"
+.br
+.RI "\fIinject a new handler into the calling chain of the handlers definedy by the netsnmp_handler_registration pointer.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_call_handlers\fP (netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_call_handler\fP (netsnmp_mib_handler *next_handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIcalls a handler with with appropriate NULL checking of arguments, etc.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_call_next_handler\fP (netsnmp_mib_handler *current, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIcalls the next handler in the chain after the current one with with appropriate NULL checking, etc.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_handler_free\fP (netsnmp_mib_handler *handler)"
+.br
+.RI "\fIfree's the resourceses associated with a given handler.\fP"
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_handler_dup\fP (netsnmp_mib_handler *handler)"
+.br
+.RI "\fIdulpicates a handler.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_handler_registration_free\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIfree the resources associated with a handler registration object.\fP"
+.ti -1c
+.RI "netsnmp_handler_registration * \fBnetsnmp_handler_registration_dup\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIduplicates the handler registration object.\fP"
+.ti -1c
+.RI "netsnmp_delegated_cache * \fBnetsnmp_create_delegated_cache\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests, void *localinfo)"
+.br
+.RI "\fIcreates a cache of information which can be saved for future reference.\fP"
+.ti -1c
+.RI "netsnmp_delegated_cache * \fBnetsnmp_handler_check_cache\fP (netsnmp_delegated_cache *dcache)"
+.br
+.RI "\fIcheck's a given cache and returns it if it is still valid (ie, the agent still considers it to be an outstanding request.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_free_delegated_cache\fP (netsnmp_delegated_cache *dcache)"
+.br
+.RI "\fIfrees a cache once you're finished using it.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_handler_mark_requests_as_delegated\fP (netsnmp_request_info *requests, int isdelegated)"
+.br
+.RI "\fImarks a list of requests as delegated (or not if isdelegaded = 0).\fP"
+.ti -1c
+.RI "void \fBnetsnmp_request_add_list_data\fP (netsnmp_request_info *request, netsnmp_data_list *node)"
+.br
+.RI "\fIadd data to a request that can be extracted later by submodules.\fP"
+.ti -1c
+.RI "void * \fBnetsnmp_request_get_list_data\fP (netsnmp_request_info *request, const char *name)"
+.br
+.RI "\fIextract data from a request that was added previously by a parent module.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_free_request_data_set\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIFree the extra data stored in a request.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_free_request_data_sets\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIFree the extra data stored in a bunch of requests (all data in the chain).\fP"
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_find_handler_by_name\fP (netsnmp_handler_registration *reginfo, const char *name)"
+.br
+.RI "\fIReturns a handler from a chain based on the name.\fP"
+.ti -1c
+.RI "void * \fBnetsnmp_find_handler_data_by_name\fP (netsnmp_handler_registration *reginfo, const char *name)"
+.br
+.RI "\fIReturns a handler's void * pointer from a chain based on the name.\fP"
+.ti -1c
+.RI "netsnmp_mib_handler * \fBclone_handler\fP (netsnmp_mib_handler *it)"
+.br
+.RI "\fIclones a mib handler (it's name and access methods onlys; not myvoid).\fP"
+.ti -1c
+.RI "void \fBnetsnmp_register_handler_by_name\fP (const char *name, netsnmp_mib_handler *handler)"
+.br
+.RI "\fIregisters a given handler by name so that it can be found easily later.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_inject_handler_into_subtree\fP (struct subtree *tp, const char *name, netsnmp_mib_handler *handler)"
+.br
+.ti -1c
+.RI "void \fBparse_injectHandler_conf\fP (const char *token, char *cptr)"
+.br
+.ti -1c
+.RI "void \fBnetsnmp_init_handler_conf\fP (void)"
+.br
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+The basic theory goes something like this: In the past, with the original mib module api (which derived from the original CMU SNMP code) the underlying mib modules were passed very little information (only the truly most basic information about a request).
+.PP
+This worked well at the time but in todays world of subagents, device instrumentation, low resource consumption, etc, it just isn't flexible enough. 'handlers' are here to fix all that.
+.PP
+With the rewrite of the agent internals for the net-snmp 5.0 release, we introduce a modular calling scheme that allows agent modules to be written in a very flexible manner, and more importantly allows reuse of code in a decent way (and without the memory and speed overheads of OO languages like C++).
+.PP
+Functionally, the notion of what a handler does is the same as the older api: A handler is \fBcreated\fP and then \fBregistered\fP with the main agent at a given OID in the OID tree and gets called any time a request is made that it should respond to. You probably should use one of the convenience helpers instead of doing anything else yourself though:
+.PP
+Most importantly, though, is that the handlers are built on the notion of modularity and reuse. Specifically, rather than do all the really hard work (like parsing table indexes out of an incoming oid request) in each module, the API is designed to make it easy to write 'helper' handlers that merely process some aspect of the request before passing it along to the final handler that returns the real answer. Most people will want to make use of the instance, table, table_iterator, table_data, or table_dataset helpers to make their life easier. These 'helpers' interpert important aspects of the request and pass them on to you.
+.PP
+For instance, the table helper is designed to hand you a list of extracted index values from an incoming request. THe table_iterator helper is built on top of the table helper, and is designed to help you iterate through data stored elsewhere (like in a kernel) that is not in OID lexographical order (ie, don't write your own index/oid sorting routine, use this helper instead). The beauty of the
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "netsnmp_mib_handler* clone_handler (netsnmp_mib_handler * it)"
+.PP
+clones a mib handler (it's name and access methods onlys; not myvoid).
+.PP
+Definition at line 578 of file agent_handler.c.
+.SS "int netsnmp_call_handler (netsnmp_mib_handler * next_handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)\fC [inline]\fP"
+.PP
+calls a handler with with appropriate NULL checking of arguments, etc.
+.PP
+Definition at line 277 of file agent_handler.c.
+.PP
+Referenced by netsnmp_call_next_handler(), and netsnmp_multiplexer_helper_handler().
+.PP
+.SS "int netsnmp_call_handlers (netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 219 of file agent_handler.c.
+.SS "int netsnmp_call_next_handler (netsnmp_mib_handler * current, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)\fC [inline]\fP"
+.PP
+calls the next handler in the chain after the current one with with appropriate NULL checking, etc.
+.PP
+Definition at line 310 of file agent_handler.c.
+.PP
+Referenced by netsnmp_bulk_to_next_helper(), netsnmp_debug_helper(), netsnmp_read_only_helper(), netsnmp_serialize_helper_handler(), netsnmp_table_data_helper_handler(), netsnmp_table_data_set_helper_handler(), and table_helper_handler().
+.PP
+.SS "netsnmp_delegated_cache* netsnmp_create_delegated_cache (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests, void * localinfo)\fC [inline]\fP"
+.PP
+creates a cache of information which can be saved for future reference.
+.PP
+Use \fBnetsnmp_handler_check_cache\fP() later to make sure it's still valid before referencing it in the future.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdelayed_instance.c\fP.
+.PP
+Definition at line 453 of file agent_handler.c.
+.SS "netsnmp_mib_handler* netsnmp_create_handler (const char * name, Netsnmp_Node_Handler * handler_access_method)"
+.PP
+creates a netsnmp_mib_handler structure given a name and a access method.
+.PP
+The returned handler should then be \fBregistered.\fP
+.PP
+\fBSee also: \fP
+.in +1c
+\fBnetsnmp_create_handler_registration\fP() , \fBnetsnmp_register_handler\fP()
+.PP
+Definition at line 78 of file agent_handler.c.
+.PP
+Referenced by clone_handler(), get_old_api_handler(), netsnmp_create_handler_registration(), netsnmp_get_bulk_to_next_handler(), netsnmp_get_debug_handler(), netsnmp_get_multiplexer_handler(), netsnmp_get_read_only_handler(), netsnmp_get_serialize_handler(), netsnmp_get_table_data_handler(), netsnmp_get_table_data_set_handler(), and netsnmp_get_table_handler().
+.PP
+.SS "netsnmp_handler_registration* netsnmp_create_handler_registration (const char * name, Netsnmp_Node_Handler * handler_access_method, oid * reg_oid, size_t reg_oid_len, int modes)"
+.PP
+creates a handler registration structure given a name, a access_method function, a registration location oid and the modes the handler supports.
+.PP
+If modes == 0, then modes will automatically be set to the default value of only HANDLER_CAN_DEFAULT, which is by default read-only GET and GETNEXT requests.
+.PP
+\fBNote: \fP
+.in +1c
+This ends up calling netsnmp_create_handler(name, handler_access_method)
+.PP
+\fBSee also: \fP
+.in +1c
+\fBnetsnmp_create_handler\fP() , \fBnetsnmp_register_handler\fP()
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP, and \fBdelayed_instance.c\fP.
+.PP
+Definition at line 95 of file agent_handler.c.
+.PP
+Referenced by netsnmp_config_parse_table_set().
+.PP
+.SS "netsnmp_mib_handler* netsnmp_find_handler_by_name (netsnmp_handler_registration * reginfo, const char * name)"
+.PP
+Returns a handler from a chain based on the name.
+.PP
+Definition at line 550 of file agent_handler.c.
+.PP
+Referenced by netsnmp_find_handler_data_by_name().
+.PP
+.SS "void* netsnmp_find_handler_data_by_name (netsnmp_handler_registration * reginfo, const char * name)"
+.PP
+Returns a handler's void * pointer from a chain based on the name.
+.PP
+This probably shouldn't be used by the general public as the void * data may change as a handler evolves. Handlers should really advertise some function for you to use instead.
+.PP
+Definition at line 566 of file agent_handler.c.
+.PP
+Referenced by netsnmp_find_table_registration_info().
+.PP
+.SS "void netsnmp_free_delegated_cache (netsnmp_delegated_cache * dcache)\fC [inline]\fP"
+.PP
+frees a cache once you're finished using it.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdelayed_instance.c\fP.
+.PP
+Definition at line 489 of file agent_handler.c.
+.SS "void netsnmp_free_request_data_set (netsnmp_request_info * request)\fC [inline]\fP"
+.PP
+Free the extra data stored in a request.
+.PP
+Definition at line 532 of file agent_handler.c.
+.SS "void netsnmp_free_request_data_sets (netsnmp_request_info * request)\fC [inline]\fP"
+.PP
+Free the extra data stored in a bunch of requests (all data in the chain).
+.PP
+Definition at line 540 of file agent_handler.c.
+.SS "netsnmp_delegated_cache* netsnmp_handler_check_cache (netsnmp_delegated_cache * dcache)\fC [inline]\fP"
+.PP
+check's a given cache and returns it if it is still valid (ie, the agent still considers it to be an outstanding request.
+.PP
+Returns NULL if it's no longer valid.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdelayed_instance.c\fP.
+.PP
+Definition at line 476 of file agent_handler.c.
+.SS "netsnmp_mib_handler* netsnmp_handler_dup (netsnmp_mib_handler * handler)"
+.PP
+dulpicates a handler.
+.PP
+Definition at line 340 of file agent_handler.c.
+.PP
+Referenced by netsnmp_handler_registration_dup().
+.PP
+.SS "void netsnmp_handler_free (netsnmp_mib_handler * handler)"
+.PP
+free's the resourceses associated with a given handler.
+.PP
+Definition at line 326 of file agent_handler.c.
+.PP
+Referenced by netsnmp_handler_registration_free().
+.PP
+.SS "void netsnmp_handler_mark_requests_as_delegated (netsnmp_request_info * requests, int isdelegated)"
+.PP
+marks a list of requests as delegated (or not if isdelegaded = 0).
+.PP
+Definition at line 501 of file agent_handler.c.
+.SS "netsnmp_handler_registration* netsnmp_handler_registration_dup (netsnmp_handler_registration * reginfo)"
+.PP
+duplicates the handler registration object.
+.PP
+Definition at line 394 of file agent_handler.c.
+.SS "void netsnmp_handler_registration_free (netsnmp_handler_registration * reginfo)"
+.PP
+free the resources associated with a handler registration object.
+.PP
+Definition at line 381 of file agent_handler.c.
+.PP
+Referenced by netsnmp_handler_registration_dup(), netsnmp_register_mib_table_row(), and netsnmp_register_old_api().
+.PP
+.SS "void netsnmp_init_handler_conf (void)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 684 of file agent_handler.c.
+.SS "int netsnmp_inject_handler (netsnmp_handler_registration * reginfo, netsnmp_mib_handler * handler)"
+.PP
+inject a new handler into the calling chain of the handlers definedy by the netsnmp_handler_registration pointer.
+.PP
+The new handler is injected at the top of the list and hence will be the new handler to be called first.
+.PP
+Definition at line 206 of file agent_handler.c.
+.PP
+Referenced by netsnmp_inject_handler_into_subtree(), netsnmp_register_handler(), netsnmp_register_read_only_table_data(), netsnmp_register_serialize(), netsnmp_register_table(), netsnmp_register_table_data(), and netsnmp_register_table_data_set().
+.PP
+.SS "void netsnmp_inject_handler_into_subtree (struct subtree * tp, const char * name, netsnmp_mib_handler * handler)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 599 of file agent_handler.c.
+.PP
+Referenced by parse_injectHandler_conf().
+.PP
+.SS "int netsnmp_register_handler (netsnmp_handler_registration * reginfo)"
+.PP
+register a handler, as defined by the netsnmp_handler_registration pointer.
+.PP
+Definition at line 118 of file agent_handler.c.
+.PP
+Referenced by netsnmp_register_old_api(), netsnmp_register_serialize(), and netsnmp_register_table().
+.PP
+.SS "void netsnmp_register_handler_by_name (const char * name, netsnmp_mib_handler * handler)"
+.PP
+registers a given handler by name so that it can be found easily later.
+.PP
+Definition at line 588 of file agent_handler.c.
+.PP
+Referenced by netsnmp_init_bulk_to_next_helper(), netsnmp_init_debug_helper(), netsnmp_init_read_only_helper(), and netsnmp_init_serialize().
+.PP
+.SS "int netsnmp_register_handler_nocallback (netsnmp_handler_registration * reginfo)"
+.PP
+register a handler, as defined by the netsnmp_handler_registration pointer.
+.PP
+Definition at line 163 of file agent_handler.c.
+.PP
+Referenced by netsnmp_register_mib_table_row().
+.PP
+.SS "void netsnmp_request_add_list_data (netsnmp_request_info * request, netsnmp_data_list * node)\fC [inline]\fP"
+.PP
+add data to a request that can be extracted later by submodules.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdelayed_instance.c\fP.
+.PP
+Definition at line 511 of file agent_handler.c.
+.PP
+Referenced by netsnmp_old_api_helper(), netsnmp_table_data_helper_handler(), and table_helper_handler().
+.PP
+.SS "void* netsnmp_request_get_list_data (netsnmp_request_info * request, const char * name)\fC [inline]\fP"
+.PP
+extract data from a request that was added previously by a parent module.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdelayed_instance.c\fP.
+.PP
+Definition at line 523 of file agent_handler.c.
+.PP
+Referenced by netsnmp_extract_array_context(), netsnmp_extract_table_data_set(), netsnmp_extract_table_info(), netsnmp_extract_table_row(), and netsnmp_old_api_helper().
+.PP
+.SS "void parse_injectHandler_conf (const char * token, char * cptr)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 641 of file agent_handler.c.
\ No newline at end of file
diff --git a/man/netsnmp_instance.3 b/man/netsnmp_instance.3
new file mode 100644
index 0000000..e3ba0ad
--- /dev/null
+++ b/man/netsnmp_instance.3
@@ -0,0 +1,54 @@
+.TH "instance: process scalars and other instances easily." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+instance: process scalars and other instances easily. \-
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_instance_handler\fP (void)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_instance\fP (netsnmp_handler_registration *reginfo)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_read_only_instance\fP (netsnmp_handler_registration *reginfo)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_read_only_ulong_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, u_long *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_ulong_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, u_long *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_read_only_counter32_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, u_long *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_read_only_long_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, long *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_long_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, long *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBregister_read_only_int_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, int *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_register_int_instance\fP (const char *name, oid *reg_oid, size_t reg_oid_len, int *it, Netsnmp_Node_Handler *subhandler)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_instance_ulong_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_instance_counter32_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_instance_long_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_instance_int_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "int \fBnetsnmp_instance_helper_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.in -1c
\ No newline at end of file
diff --git a/man/netsnmp_mib_handler_methods.3 b/man/netsnmp_mib_handler_methods.3
new file mode 100644
index 0000000..24d7dcc
--- /dev/null
+++ b/man/netsnmp_mib_handler_methods.3
@@ -0,0 +1,19 @@
+.TH "mib_handler_methods" 3 "23 Dec 2001" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+mib_handler_methods \- Defines the subhandlers to be called by the multiplexer helper.
+.SH SYNOPSIS
+.br
+.PP
+\fC#include <multiplexer.h>\fP
+.PP
+.SH "DETAILED DESCRIPTION"
+.PP
+Defines the subhandlers to be called by the multiplexer helper.
+.PP
+
+
+.SH "AUTHOR"
+.PP
+Generated automatically by Doxygen for net-snmp from the source code.
\ No newline at end of file
diff --git a/man/netsnmp_multiplexer.3 b/man/netsnmp_multiplexer.3
new file mode 100644
index 0000000..51e65ca
--- /dev/null
+++ b/man/netsnmp_multiplexer.3
@@ -0,0 +1,47 @@
+.TH "multiplexer: splits mode requests into calls to different handlers." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+multiplexer: splits mode requests into calls to different handlers. \- The multiplexer helper lets you split the calling chain depending on the calling mode (get vs getnext vs set).
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_multiplexer_handler\fP (netsnmp_mib_handler_methods *req)"
+.br
+.RI "\fIreturns a multiplixer handler given a netsnmp_mib_handler_methods structure of subhandlers.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_multiplexer_helper_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIimplements the multiplexer helper.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+The multiplexer helper lets you split the calling chain depending on the calling mode (get vs getnext vs set).
+.PP
+Useful if you want different routines to handle different aspects of SNMP requests, which is very common for GET vs SET type actions.
+.PP
+Functionally:
+.PP
+.TP
+GET requests call the get_method
+.TP
+GETNEXT requests call the getnext_method, or if not present, the get_method.
+.TP
+GETBULK requests call the getbulk_method, or if not present, the getnext_method, or if even that isn't present the get_method.
+.TP
+SET requests call the set_method, or if not present return a SNMP_ERR_NOTWRITABLE error.
+.PP
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "netsnmp_mib_handler* netsnmp_get_multiplexer_handler (netsnmp_mib_handler_methods * req)"
+.PP
+returns a multiplixer handler given a netsnmp_mib_handler_methods structure of subhandlers.
+.PP
+Definition at line 36 of file multiplexer.c.
+.SS "int netsnmp_multiplexer_helper_handler (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+implements the multiplexer helper.
+.PP
+Definition at line 53 of file multiplexer.c.
\ No newline at end of file
diff --git a/man/netsnmp_old_api.3 b/man/netsnmp_old_api.3
new file mode 100644
index 0000000..7e35b91
--- /dev/null
+++ b/man/netsnmp_old_api.3
@@ -0,0 +1,60 @@
+.TH "old_api: Calls mib module code written in the old style of code." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+old_api: Calls mib module code written in the old style of code. \- This is a backwards compatilibity module that allows code written in the old API to be run under the new handler based architecture.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBget_old_api_handler\fP (void)"
+.br
+.RI "\fIreturns a old_api handler that should be the final calling handler.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_old_api\fP (const char *moduleName, struct variable *var, size_t varsize, size_t numvars, oid *mibloc, size_t mibloclen, int priority, int range_subid, oid range_ubound, netsnmp_session *ss, const char *context, int timeout, int flags)"
+.br
+.RI "\fIRegisters an old API set into the mib tree.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_mib_table_row\fP (const char *moduleName, struct variable *var, size_t varsize, size_t numvars, oid *mibloc, size_t mibloclen, int priority, int var_subid, netsnmp_session *ss, const char *context, int timeout, int flags)"
+.br
+.RI "\fIregisters a row within a mib table.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_old_api_helper\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIimplements the old_api handler.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This is a backwards compatilibity module that allows code written in the old API to be run under the new handler based architecture.
+.PP
+Use it by calling \fBnetsnmp_register_old_api\fP().
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "netsnmp_mib_handler* get_old_api_handler (void)"
+.PP
+returns a old_api handler that should be the final calling handler.
+.PP
+Don't use this function. Use the \fBnetsnmp_register_old_api\fP() function instead.
+.PP
+Definition at line 38 of file old_api.c.
+.PP
+Referenced by netsnmp_register_mib_table_row(), and netsnmp_register_old_api().
+.PP
+.SS "int netsnmp_old_api_helper (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+implements the old_api handler.
+.PP
+Definition at line 218 of file old_api.c.
+.SS "int netsnmp_register_mib_table_row (const char * moduleName, struct variable * var, size_t varsize, size_t numvars, oid * mibloc, size_t mibloclen, int priority, int var_subid, netsnmp_session * ss, const char * context, int timeout, int flags)"
+.PP
+registers a row within a mib table.
+.PP
+Definition at line 112 of file old_api.c.
+.SS "int netsnmp_register_old_api (const char * moduleName, struct variable * var, size_t varsize, size_t numvars, oid * mibloc, size_t mibloclen, int priority, int range_subid, oid range_ubound, netsnmp_session * ss, const char * context, int timeout, int flags)"
+.PP
+Registers an old API set into the mib tree.
+.PP
+Functionally this mimics the old register_mib_context() function (and in fact the new register_mib_context() function merely calls this new old_api one).
+.PP
+Definition at line 48 of file old_api.c.
\ No newline at end of file
diff --git a/man/netsnmp_read_only.3 b/man/netsnmp_read_only.3
new file mode 100644
index 0000000..c1c3f29
--- /dev/null
+++ b/man/netsnmp_read_only.3
@@ -0,0 +1,47 @@
+.TH "read_only: make your handler read_only automatically" 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+read_only: make your handler read_only automatically \- The only purpose of this handler is to return an appropriate error for any requests passed to it in a SET mode.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_read_only_handler\fP (void)"
+.br
+.RI "\fIreturns a read_only handler that can be injected into a given handler chain.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_read_only_helper\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.ti -1c
+.RI "void \fBnetsnmp_init_read_only_helper\fP (void)"
+.br
+.RI "\fIinitializes the read_only helper which then registers a read_only handler as a run-time injectable handler for configuration file use.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+The only purpose of this handler is to return an appropriate error for any requests passed to it in a SET mode.
+.PP
+Inserting it into your handler chain will ensure you're never asked to perform a SET request so you can ignore those error conditions.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "netsnmp_mib_handler* netsnmp_get_read_only_handler (void)"
+.PP
+returns a read_only handler that can be injected into a given handler chain.
+.PP
+Definition at line 32 of file read_only.c.
+.PP
+Referenced by netsnmp_init_read_only_helper(), and netsnmp_register_read_only_table_data().
+.PP
+.SS "void netsnmp_init_read_only_helper (void)"
+.PP
+initializes the read_only helper which then registers a read_only handler as a run-time injectable handler for configuration file use.
+.PP
+Definition at line 68 of file read_only.c.
+.SS "int netsnmp_read_only_helper (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 38 of file read_only.c.
\ No newline at end of file
diff --git a/man/netsnmp_serialize.3 b/man/netsnmp_serialize.3
new file mode 100644
index 0000000..7ed74b8
--- /dev/null
+++ b/man/netsnmp_serialize.3
@@ -0,0 +1,56 @@
+.TH "serialize: Calls sub handlers one request at a time." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+serialize: Calls sub handlers one request at a time. \- This functionally passes in one request at a time into lower handlers rather than a whole bunch of requests at once.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_serialize_handler\fP (void)"
+.br
+.RI "\fIreturns a serialize handler that can be injected into a given handler chain.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_serialize\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIfunctionally the same as calling \fBnetsnmp_register_handler\fP() but also injects a serialize handler at the same time for you.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_serialize_helper_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIImplements the serial handler.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_init_serialize\fP (void)"
+.br
+.RI "\fIinitializes the serialize helper which then registers a serialize handler as a run-time injectable handler for configuration file use.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This functionally passes in one request at a time into lower handlers rather than a whole bunch of requests at once.
+.PP
+This is useful for handlers that don't want to iterate through the request lists themselves. Generally, this is probably less efficient so use with caution. The serialize handler might be useable to dynamically fix handlers with broken looping code, however.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "netsnmp_mib_handler* netsnmp_get_serialize_handler (void)"
+.PP
+returns a serialize handler that can be injected into a given handler chain.
+.PP
+Definition at line 34 of file serialize.c.
+.PP
+Referenced by netsnmp_init_serialize(), and netsnmp_register_serialize().
+.PP
+.SS "void netsnmp_init_serialize (void)"
+.PP
+initializes the serialize helper which then registers a serialize handler as a run-time injectable handler for configuration file use.
+.PP
+Definition at line 84 of file serialize.c.
+.SS "int netsnmp_register_serialize (netsnmp_handler_registration * reginfo)"
+.PP
+functionally the same as calling \fBnetsnmp_register_handler\fP() but also injects a serialize handler at the same time for you.
+.PP
+Definition at line 41 of file serialize.c.
+.SS "int netsnmp_serialize_helper_handler (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+Implements the serial handler.
+.PP
+Definition at line 48 of file serialize.c.
\ No newline at end of file
diff --git a/man/netsnmp_table.3 b/man/netsnmp_table.3
new file mode 100644
index 0000000..676ebf4
--- /dev/null
+++ b/man/netsnmp_table.3
@@ -0,0 +1,165 @@
+.TH "table: Helps you implement a table." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+table: Helps you implement a table. \- This handler helps you implement a table by doing some of the processing for you.
+More...
+.SS "Modules"
+
+.in +1c
+.ti -1c
+.RI "\fBtable_iterator: The table iterator helper is designed to simplify the task of writing a table handler for the net-snmp agent when the data being accessed is not in an oid sorted form and must be accessed externally.\fP"
+.br
+.RI "\fIFunctionally, it is a specialized version of the more generic table helper but easies the burden of GETNEXT processing by manually looping through all the data indexes retrieved through function calls which should be supplied by the module that wishes help.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBtable_data: Helps you implement a table with datamatted storage.\fP"
+.br
+.RI "\fIThis helper helps you implement a table where all the indexes are expected to be stored within the agent itself and not in some external storage location.\fP"
+.PP
+.in +1c
+
+.ti -1c
+.RI "\fBtable_array: Helps you implement a table when data can be stored locally. The data is stored in a sorted array, using a binary search for lookups.\fP"
+.br
+.RI "\fIThe table_array handler is used (automatically) in conjuntion with the table handler.\fP"
+.PP
+
+.in -1c
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_table_handler\fP (netsnmp_table_registration_info *tabreq)"
+.br
+.RI "\fIGiven a netsnmp_table_registration_info object, creates a table handler.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_table\fP (netsnmp_handler_registration *reginfo, netsnmp_table_registration_info *tabreq)"
+.br
+.RI "\fIcreates a table handler given the netsnmp_table_registration_info object, inserts it into the request chain and then calls \fBnetsnmp_register_handler\fP() to register the table into the agent.\fP"
+.ti -1c
+.RI "netsnmp_table_request_info * \fBnetsnmp_extract_table_info\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIextracts the processed table information from a given request.\fP"
+.ti -1c
+.RI "netsnmp_table_registration_info * \fBnetsnmp_find_table_registration_info\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIextracts the registered netsnmp_table_registration_info object from a netsnmp_handler_registration object.\fP"
+.ti -1c
+.RI "int \fBtable_helper_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIimplements the table helper handler.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_build_result\fP (netsnmp_handler_registration *reginfo, netsnmp_request_info *reqinfo, netsnmp_table_request_info *table_info, u_char type, u_char *result, size_t result_len)"
+.br
+.RI "\fIBuilds the result to be returned to the agent given the table information.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_build_oid\fP (netsnmp_handler_registration *reginfo, netsnmp_request_info *reqinfo, netsnmp_table_request_info *table_info)"
+.br
+.RI "\fIgiven a registration info object, a request object and the table info object it builds the request->requestvb->name oid from the index values and column information found in the table_info object.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_build_oid_from_index\fP (netsnmp_handler_registration *reginfo, netsnmp_request_info *reqinfo, netsnmp_table_request_info *table_info)"
+.br
+.RI "\fIBuilds an oid from index information.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_update_variable_list_from_index\fP (netsnmp_table_request_info *tri)"
+.br
+.RI "\fIparses an OID into table indexses.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_update_indexes_from_variable_list\fP (netsnmp_table_request_info *tri)"
+.br
+.RI "\fIbuilds an oid given a set of indexes.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_check_getnext_reply\fP (netsnmp_request_info *request, oid *prefix, size_t prefix_len, netsnmp_variable_list *newvar, netsnmp_variable_list **outvar)"
+.br
+.RI "\fIchecks the original request against the current data being passed in if its greater than the request oid but less than the current valid return, set the current valid return to the new value.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This handler helps you implement a table by doing some of the processing for you.
+.PP
+This handler truly shows the power of the new handler mechanism. By creating a table handler and injecting it into your calling chain, or by using the \fBnetsnmp_register_table\fP() function to register your table, you get access to some pre-parsed information. Specifically, the table handler pulls out the column number and indexes from the request oid so that you don't have to do the complex work to do that parsing within your own code.
+.PP
+To do this, the table handler needs to know up front how your table is structured. To inform it about this, you fill in a table_registeration_info structure that is passed to the table handler. It contains the asn index types for the table as well as the minimum and maximum column that should be used.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "int netsnmp_check_getnext_reply (netsnmp_request_info * request, oid * prefix, size_t prefix_len, netsnmp_variable_list * newvar, netsnmp_variable_list ** outvar)"
+.PP
+checks the original request against the current data being passed in if its greater than the request oid but less than the current valid return, set the current valid return to the new value.
+.PP
+returns 1 if outvar was replaced with the oid from newvar (success). returns 0 if not.
+.PP
+Definition at line 563 of file table.c.
+.SS "netsnmp_table_request_info* netsnmp_extract_table_info (netsnmp_request_info * request)\fC [inline]\fP"
+.PP
+extracts the processed table information from a given request.
+.PP
+call this from subhandlers on a request to extract the processed netsnmp_request_info information. The resulting information includes the index values and the column number.
+.PP
+Definition at line 92 of file table.c.
+.PP
+Referenced by netsnmp_table_data_helper_handler(), and netsnmp_table_data_set_helper_handler().
+.PP
+.SS "netsnmp_table_registration_info* netsnmp_find_table_registration_info (netsnmp_handler_registration * reginfo)"
+.PP
+extracts the registered netsnmp_table_registration_info object from a netsnmp_handler_registration object.
+.PP
+Definition at line 101 of file table.c.
+.PP
+Referenced by netsnmp_table_data_helper_handler().
+.PP
+.SS "netsnmp_mib_handler* netsnmp_get_table_handler (netsnmp_table_registration_info * tabreq)"
+.PP
+Given a netsnmp_table_registration_info object, creates a table handler.
+.PP
+You can use this table handler by injecting it into a calling chain. When the handler gets called, it'll do processing and store it's information into the request->parent_data structure.
+.PP
+Definition at line 56 of file table.c.
+.PP
+Referenced by netsnmp_register_table().
+.PP
+.SS "int netsnmp_register_table (netsnmp_handler_registration * reginfo, netsnmp_table_registration_info * tabreq)"
+.PP
+creates a table handler given the netsnmp_table_registration_info object, inserts it into the request chain and then calls \fBnetsnmp_register_handler\fP() to register the table into the agent.
+.PP
+Definition at line 79 of file table.c.
+.PP
+Referenced by netsnmp_register_table_array(), and netsnmp_register_table_data().
+.PP
+.SS "int netsnmp_table_build_oid (netsnmp_handler_registration * reginfo, netsnmp_request_info * reqinfo, netsnmp_table_request_info * table_info)"
+.PP
+given a registration info object, a request object and the table info object it builds the request->requestvb->name oid from the index values and column information found in the table_info object.
+.PP
+Definition at line 488 of file table.c.
+.PP
+Referenced by netsnmp_table_build_result().
+.PP
+.SS "int netsnmp_table_build_oid_from_index (netsnmp_handler_registration * reginfo, netsnmp_request_info * reqinfo, netsnmp_table_request_info * table_info)"
+.PP
+Builds an oid from index information.
+.PP
+Definition at line 513 of file table.c.
+.SS "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)"
+.PP
+Builds the result to be returned to the agent given the table information.
+.PP
+Use this function to return results from lowel level handlers to the agent. It takes care of building the proper resulting oid (containing proper indexing) and inserts the result value into the returning varbind.
+.PP
+Definition at line 456 of file table.c.
+.SS "int netsnmp_update_indexes_from_variable_list (netsnmp_table_request_info * tri)"
+.PP
+builds an oid given a set of indexes.
+.PP
+Definition at line 548 of file table.c.
+.SS "int netsnmp_update_variable_list_from_index (netsnmp_table_request_info * tri)"
+.PP
+parses an OID into table indexses.
+.PP
+Definition at line 540 of file table.c.
+.SS "int table_helper_handler (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+implements the table helper handler.
+.PP
+Definition at line 109 of file table.c.
\ No newline at end of file
diff --git a/man/netsnmp_table_array.3 b/man/netsnmp_table_array.3
new file mode 100644
index 0000000..372fcd4
--- /dev/null
+++ b/man/netsnmp_table_array.3
@@ -0,0 +1,100 @@
+.TH "table_array: Helps you implement a table when data can be stored locally. The data is stored in a sorted array, using a binary search for lookups." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+table_array: Helps you implement a table when data can be stored locally. The data is stored in a sorted array, using a binary search for lookups. \- The table_array handler is used (automatically) in conjuntion with the table handler.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "int \fBnetsnmp_register_table_array\fP (netsnmp_handler_registration *reginfo, netsnmp_table_registration_info *tabreg, netsnmp_table_array_callbacks *cb, int group_rows)"
+.br
+.RI "\fIregister specified callbacks for the specified table/oid.\fP"
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_find_table_array_handler\fP (netsnmp_handler_registration *reginfo)"
+.br
+.RI "\fIfind the handler for the table_array helper.\fP"
+.ti -1c
+.RI "oid_array * \fBnetsnmp_extract_array_context\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIfind the context data used by the table_array helper.\fP"
+.ti -1c
+.RI "const netsnmp_oid_array_header * \fBnetsnmp_table_array_get_by_index\fP (netsnmp_handler_registration *reginfo, netsnmp_oid_array_header *hdr)"
+.br
+.RI "\fIsearch for the specified index.\fP"
+.ti -1c
+.RI "const netsnmp_oid_array_header ** \fBnetsnmp_table_array_get_subset\fP (netsnmp_handler_registration *reginfo, netsnmp_oid_array_header *hdr, int *len)"
+.br
+.RI "\fIreturns all rows in the data set with the same prefix.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_array_check_row_status\fP (netsnmp_table_array_callbacks *cb, netsnmp_oid_array_header *ctx_new, netsnmp_oid_array_header *ctx_old, netsnmp_array_group *ag, int *rs_new, int *rs_old)"
+.br
+.RI "\fIthis function is called to validate RowStatus transitions.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+The table_array handler is used (automatically) in conjuntion with the table handler.
+.PP
+It is primarily intended to be used with the mib2c configuration file mib2c.array-user.conf.
+.PP
+The code generated by mib2c is useful when you have control of the data for each row. If you cannot control when rows are added and deleted (or at least be notified of changes to row data), then this handler is probably not for you.
+.PP
+This handler makes use of callbacks (function pointers) to handle various tasks. Code is generated for each callback, but will need to be reviewed and flushed out by the user.
+.PP
+NOTE NOTE NOTE: Once place where mib2c is somewhat lacking is with regards to tables with external indices. If your table makes use of one or more external indices, please review the generated code very carefully for comments regarding external indices.
+.PP
+NOTE NOTE NOTE: This helper, the API and callbacks are still being tested and may change.
+.PP
+The generated code will define a structure for storage of table related data. This structure must be used, as it contains the index OID for the row, which is used for keeping the array sorted. You can add addition fields or data to the structure for your own use.
+.PP
+The generated code will also have code to handle SNMP-SET processing. If your table does not support any SET operations, simply comment out the define <PREFIX>_SET_HANDLING (where <PREFIX> is your table name) in the header file.
+.PP
+Code will be generated to handle row creation. This code may be disabled by commenting out the define <PREFIX>_ROW_CREATION in the header file.
+.PP
+If your table contains a RowStatus object, by default the code will not allow object in an active row to be modified. To allow active rows to be modified, remove the comment block around the define <PREFIX>_CAN_MODIFY_ACTIVE_ROW in the header file.
+.PP
+Code will be generated to maintain a secondary index for all rows, stored in a binary tree. This is very useful for finding rows by a key other than the OID index. By default, the functions for maintaining this tree will be based on a character string. NOTE: this will likely be made into a more generic mechanism, using new callback methods, in the near future.
+.PP
+The generated code contains many TODO comments. Make sure you check each one to see if it applies to your code. Examples include checking indices for syntax (ranges, etc), initializing default values in newly created rows, checking for row activation and deactivation requirements, etc.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "oid_array* netsnmp_extract_array_context (netsnmp_request_info * request)"
+.PP
+find the context data used by the table_array helper.
+.PP
+Definition at line 177 of file table_array.c.
+.SS "netsnmp_mib_handler* netsnmp_find_table_array_handler (netsnmp_handler_registration * reginfo)"
+.PP
+find the handler for the table_array helper.
+.PP
+Definition at line 163 of file table_array.c.
+.PP
+Referenced by netsnmp_table_array_get_by_index(), and netsnmp_table_array_get_subset().
+.PP
+.SS "int netsnmp_register_table_array (netsnmp_handler_registration * reginfo, netsnmp_table_registration_info * tabreg, netsnmp_table_array_callbacks * cb, int group_rows)"
+.PP
+register specified callbacks for the specified table/oid.
+.PP
+If the group_rows parameter is set, the row related callbacks will be called once for each unique row index. Otherwise, each callback will be called only once, for all objects.
+.PP
+Definition at line 144 of file table_array.c.
+.SS "int netsnmp_table_array_check_row_status (netsnmp_table_array_callbacks * cb, netsnmp_oid_array_header * ctx_new, netsnmp_oid_array_header * ctx_old, netsnmp_array_group * ag, int * rs_new, int * rs_old)"
+.PP
+this function is called to validate RowStatus transitions.
+.PP
+Definition at line 257 of file table_array.c.
+.SS "const netsnmp_oid_array_header* netsnmp_table_array_get_by_index (netsnmp_handler_registration * reginfo, netsnmp_oid_array_header * hdr)"
+.PP
+search for the specified index.
+.PP
+This routine searches for modified rows first (i.e. during SET request processing).
+.PP
+Definition at line 186 of file table_array.c.
+.SS "const netsnmp_oid_array_header** netsnmp_table_array_get_subset (netsnmp_handler_registration * reginfo, netsnmp_oid_array_header * hdr, int * len)"
+.PP
+returns all rows in the data set with the same prefix.
+.PP
+This is usefull when a table contains multiple indices.
+.PP
+Definition at line 224 of file table_array.c.
\ No newline at end of file
diff --git a/man/netsnmp_table_data.3 b/man/netsnmp_table_data.3
new file mode 100644
index 0000000..b95ff51
--- /dev/null
+++ b/man/netsnmp_table_data.3
@@ -0,0 +1,251 @@
+.TH "table_data: Helps you implement a table with datamatted storage." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+table_data: Helps you implement a table with datamatted storage. \- This helper helps you implement a table where all the indexes are expected to be stored within the agent itself and not in some external storage location.
+More...
+.SS "Modules"
+
+.in +1c
+.ti -1c
+.RI "\fBtable_dataset: Helps you implement a table with automatted storage.\fP"
+.br
+.RI "\fIThis handler helps you implement a table where all the data is expected to be stored within the agent itself and not in some external storage location.\fP"
+.PP
+
+.in -1c
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "void \fBnetsnmp_table_data_generate_index_oid\fP (netsnmp_table_row *row)"
+.br
+.RI "\fIgenerates the index portion of an table oid from a varlist.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_data_add_row\fP (netsnmp_table_data *table, netsnmp_table_row *row)"
+.br
+.RI "\fIAdds a row of data to a given table (stored in proper lexographical order).\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_table_data_remove_row\fP (netsnmp_table_data *table, netsnmp_table_row *row)"
+.br
+.RI "\fIremoves a row of data to a given table and returns it (no free's called).\fP"
+.ti -1c
+.RI "void * \fBnetsnmp_table_data_delete_row\fP (netsnmp_table_row *row)"
+.br
+.RI "\fIdeletes a row's memory.\fP"
+.ti -1c
+.RI "void * \fBnetsnmp_table_data_remove_and_delete_row\fP (netsnmp_table_data *table, netsnmp_table_row *row)"
+.br
+.RI "\fIremoves and frees a row of data to a given table and returns the void *.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_data_replace_row\fP (netsnmp_table_data *table, netsnmp_table_row *origrow, netsnmp_table_row *newrow)"
+.br
+.RI "\fIswaps out origrow with newrow.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_table_data_get\fP (netsnmp_table_data *table, netsnmp_variable_list *indexes)"
+.br
+.RI "\fIfinds the data in 'datalist' stored at 'indexes'.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_table_data_get_from_oid\fP (netsnmp_table_data *table, oid *searchfor, size_t searchfor_len)"
+.br
+.RI "\fIfinds the data in 'datalist' stored at the searchfor oid.\fP"
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_table_data_handler\fP (netsnmp_table_data *table)"
+.br
+.RI "\fICreates a table_data handler and returns it.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_table_data\fP (netsnmp_handler_registration *reginfo, netsnmp_table_data *table, netsnmp_table_registration_info *table_info)"
+.br
+.RI "\fIregisters a handler as a data table.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_read_only_table_data\fP (netsnmp_handler_registration *reginfo, netsnmp_table_data *table, netsnmp_table_registration_info *table_info)"
+.br
+.RI "\fIregisters a handler as a read-only data table If table_info != NULL, it registers it as a normal table too.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_data_helper_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIThe helper handler that takes care of passing a specific row of data down to the lower handler(s).\fP"
+.ti -1c
+.RI "netsnmp_table_data * \fBnetsnmp_create_table_data\fP (const char *name)"
+.br
+.RI "\fIcreates and returns a pointer to table data set.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_create_table_data_row\fP (void)"
+.br
+.RI "\fIcreates and returns a pointer to table data set.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_extract_table_row\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIextracts the row being accessed passed from the table_data helper.\fP"
+.ti -1c
+.RI "void * \fBnetsnmp_extract_table_row_data\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIextracts the data from the row being accessed passed from the table_data helper.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_data_build_result\fP (netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *request, netsnmp_table_row *row, int column, u_char type, u_char *result_data, size_t result_data_len)"
+.br
+.RI "\fIbuilds a result given a row, a varbind to set and the data.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_table_data_clone_row\fP (netsnmp_table_row *row)"
+.br
+.RI "\fIclones a data row.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This helper helps you implement a table where all the indexes are expected to be stored within the agent itself and not in some external storage location.
+.PP
+It can be used to store a list of rows, where a row consists of the indexes to the table and a generic data pointer. You can then implement a subhandler which is passed the exact row definition and data it must return data for or accept data for. Complex GETNEXT handling is greatly simplified in this case.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "netsnmp_table_data* netsnmp_create_table_data (const char * name)"
+.PP
+creates and returns a pointer to table data set.
+.PP
+Definition at line 404 of file table_data.c.
+.PP
+Referenced by netsnmp_create_table_data_set().
+.PP
+.SS "netsnmp_table_row* netsnmp_create_table_data_row (void)"
+.PP
+creates and returns a pointer to table data set.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 414 of file table_data.c.
+.PP
+Referenced by netsnmp_config_parse_add_row(), and netsnmp_table_data_set_create_row_from_defaults().
+.PP
+.SS "netsnmp_table_row* netsnmp_extract_table_row (netsnmp_request_info * request)"
+.PP
+extracts the row being accessed passed from the table_data helper.
+.PP
+Definition at line 422 of file table_data.c.
+.PP
+Referenced by netsnmp_extract_table_row_data(), and netsnmp_table_data_set_helper_handler().
+.PP
+.SS "void* netsnmp_extract_table_row_data (netsnmp_request_info * request)"
+.PP
+extracts the data from the row being accessed passed from the table_data helper.
+.PP
+Definition at line 430 of file table_data.c.
+.SS "netsnmp_mib_handler* netsnmp_get_table_data_handler (netsnmp_table_data * table)"
+.PP
+Creates a table_data handler and returns it.
+.PP
+Definition at line 207 of file table_data.c.
+.PP
+Referenced by netsnmp_register_table_data().
+.PP
+.SS "int netsnmp_register_read_only_table_data (netsnmp_handler_registration * reginfo, netsnmp_table_data * table, netsnmp_table_registration_info * table_info)"
+.PP
+registers a handler as a read-only data table If table_info != NULL, it registers it as a normal table too.
+.PP
+Definition at line 236 of file table_data.c.
+.SS "int netsnmp_register_table_data (netsnmp_handler_registration * reginfo, netsnmp_table_data * table, netsnmp_table_registration_info * table_info)"
+.PP
+registers a handler as a data table.
+.PP
+If table_info != NULL, it registers it as a normal table too.
+.PP
+Definition at line 226 of file table_data.c.
+.PP
+Referenced by netsnmp_register_read_only_table_data(), and netsnmp_register_table_data_set().
+.PP
+.SS "int netsnmp_table_data_add_row (netsnmp_table_data * table, netsnmp_table_row * row)"
+.PP
+Adds a row of data to a given table (stored in proper lexographical order).
+.PP
+returns SNMPERR_SUCCESS on successful addition. or SNMPERR_GENERR on failure (E.G., indexes already existed)
+.PP
+Definition at line 52 of file table_data.c.
+.PP
+Referenced by netsnmp_config_parse_add_row(), netsnmp_table_data_replace_row(), and netsnmp_table_dataset_add_row().
+.PP
+.SS "int netsnmp_table_data_build_result (netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * request, netsnmp_table_row * row, int column, u_char type, u_char * result_data, size_t result_data_len)"
+.PP
+builds a result given a row, a varbind to set and the data.
+.PP
+Definition at line 437 of file table_data.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "netsnmp_table_row* netsnmp_table_data_clone_row (netsnmp_table_row * row)"
+.PP
+clones a data row.
+.PP
+DOES NOT CLONE THE CONTAINED DATA.
+.PP
+Definition at line 466 of file table_data.c.
+.PP
+Referenced by netsnmp_table_data_set_clone_row().
+.PP
+.SS "void* netsnmp_table_data_delete_row (netsnmp_table_row * row)"
+.PP
+deletes a row's memory.
+.PP
+returns the void data that it doesn't know how to delete.
+.PP
+Definition at line 136 of file table_data.c.
+.PP
+Referenced by netsnmp_table_data_remove_and_delete_row(), and netsnmp_table_dataset_delete_row().
+.PP
+.SS "void netsnmp_table_data_generate_index_oid (netsnmp_table_row * row)"
+.PP
+generates the index portion of an table oid from a varlist.
+.PP
+Definition at line 39 of file table_data.c.
+.PP
+Referenced by netsnmp_table_data_add_row().
+.PP
+.SS "netsnmp_table_row* netsnmp_table_data_get (netsnmp_table_data * table, netsnmp_variable_list * indexes)"
+.PP
+finds the data in 'datalist' stored at 'indexes'.
+.PP
+Definition at line 182 of file table_data.c.
+.SS "netsnmp_table_row* netsnmp_table_data_get_from_oid (netsnmp_table_data * table, oid * searchfor, size_t searchfor_len)"
+.PP
+finds the data in 'datalist' stored at the searchfor oid.
+.PP
+Definition at line 193 of file table_data.c.
+.PP
+Referenced by netsnmp_table_data_get(), and netsnmp_table_data_helper_handler().
+.PP
+.SS "int netsnmp_table_data_helper_handler (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+The helper handler that takes care of passing a specific row of data down to the lower handler(s).
+.PP
+It sets request->processed if the request should not be handled.
+.PP
+Definition at line 250 of file table_data.c.
+.SS "void* netsnmp_table_data_remove_and_delete_row (netsnmp_table_data * table, netsnmp_table_row * row)"
+.PP
+removes and frees a row of data to a given table and returns the void *.
+.PP
+returns the void * data on successful deletion. or NULL on failure (bad arguments)
+.PP
+Definition at line 161 of file table_data.c.
+.PP
+Referenced by netsnmp_table_dataset_remove_and_delete_row(), and netsnmp_table_dataset_remove_row().
+.PP
+.SS "netsnmp_table_row* netsnmp_table_data_remove_row (netsnmp_table_data * table, netsnmp_table_row * row)"
+.PP
+removes a row of data to a given table and returns it (no free's called).
+.PP
+returns the row pointer itself on successful removing. or NULL on failure (bad arguments)
+.PP
+Definition at line 117 of file table_data.c.
+.PP
+Referenced by netsnmp_table_data_remove_and_delete_row(), and netsnmp_table_data_replace_row().
+.PP
+.SS "void netsnmp_table_data_replace_row (netsnmp_table_data * table, netsnmp_table_row * origrow, netsnmp_table_row * newrow)\fC [inline]\fP"
+.PP
+swaps out origrow with newrow.
+.PP
+This does *not* delete/free anything!
+.PP
+Definition at line 173 of file table_data.c.
+.PP
+Referenced by netsnmp_table_dataset_replace_row().
+.PP
diff --git a/man/netsnmp_table_dataset.3 b/man/netsnmp_table_dataset.3
new file mode 100644
index 0000000..b0d91b9
--- /dev/null
+++ b/man/netsnmp_table_dataset.3
@@ -0,0 +1,334 @@
+.TH "table_dataset: Helps you implement a table with automatted storage." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+table_dataset: Helps you implement a table with automatted storage. \- This handler helps you implement a table where all the data is expected to be stored within the agent itself and not in some external storage location.
+More...
+.SS "Functions"
+
+.in +1c
+.ti -1c
+.RI "netsnmp_table_data_set * \fBnetsnmp_create_table_data_set\fP (const char *table_name)"
+.br
+.RI "\fICreate a netsnmp_table_data_set structure given a table_data definition.\fP"
+.ti -1c
+.RI "netsnmp_mib_handler * \fBnetsnmp_get_table_data_set_handler\fP (netsnmp_table_data_set *data_set)"
+.br
+.RI "\fIGiven a netsnmp_table_data_set definition, create a handler for it.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_register_table_data_set\fP (netsnmp_handler_registration *reginfo, netsnmp_table_data_set *data_set, netsnmp_table_registration_info *table_info)"
+.br
+.RI "\fIregister a given data_set at a given oid (specified in the netsnmp_handler_registration pointer).\fP"
+.ti -1c
+.RI "netsnmp_table_data_set_storage * \fBnetsnmp_table_data_set_find_column\fP (netsnmp_table_data_set_storage *start, unsigned int column)"
+.br
+.RI "\fIFinds a column within a given storage set, given the pointer to the start of the storage set list.\fP"
+.ti -1c
+.RI "netsnmp_table_data_set * \fBnetsnmp_extract_table_data_set\fP (netsnmp_request_info *request)"
+.br
+.RI "\fIextracts a netsnmp_table_data_set pointer from a given request.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_mark_row_column_writable\fP (netsnmp_table_row *row, int column, int writable)"
+.br
+.RI "\fImarks a given column in a row as writable or not.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_set_row_column\fP (netsnmp_table_row *row, unsigned int column, int type, const char *value, size_t value_len)"
+.br
+.RI "\fIsets a given column in a row with data given a type, value, and length.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_set_add_default_row\fP (netsnmp_table_data_set *table_set, unsigned int column, int type, int writable, void *default_value, size_t default_value_len)"
+.br
+.RI "\fIadds a new default row to a table_set.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_table_data_set_clone_row\fP (netsnmp_table_row *row)"
+.br
+.RI "\fIclones a dataset row, including all data.\fP"
+.ti -1c
+.RI "netsnmp_table_row * \fBnetsnmp_table_data_set_create_row_from_defaults\fP (netsnmp_table_data_set_storage *defrow)"
+.br
+.RI "\fIcreates a new row from an existing defined default set.\fP"
+.ti -1c
+.RI "int \fBnetsnmp_table_data_set_helper_handler\fP (netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)"
+.br
+.RI "\fIimplements the table data helper.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_register_auto_data_table\fP (netsnmp_table_data_set *table_set, char *registration_name)"
+.br
+.RI "\fIregisters a table_dataset so that the 'add_row' snmpd.conf token can be used to add data to this table.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_config_parse_table_set\fP (const char *token, char *line)"
+.br
+.ti -1c
+.RI "void \fBnetsnmp_config_parse_add_row\fP (const char *token, char *line)"
+.br
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_add_index\fP (netsnmp_table_data_set *table, u_char type)"
+.br
+.RI "\fIadds an index to the table.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_add_row\fP (netsnmp_table_data_set *table, netsnmp_table_row *row)"
+.br
+.RI "\fIadds a new row to a dataset table.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_replace_row\fP (netsnmp_table_data_set *table, netsnmp_table_row *origrow, netsnmp_table_row *newrow)"
+.br
+.RI "\fIadds a new row to a dataset table.\fP"
+.ti -1c
+.RI "netsnmp_table_data_set_storage * \fBnetsnmp_table_dataset_delete_data\fP (netsnmp_table_data_set_storage *data)"
+.br
+.RI "\fIdeletes a single dataset table data.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_delete_all_data\fP (netsnmp_table_data_set_storage *data)"
+.br
+.RI "\fIdeletes all the data from this node and beyond in the linked list.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_delete_row\fP (netsnmp_table_row *row)"
+.br
+.RI "\fIdeletes all the data from this node and beyond in the linked list.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_remove_row\fP (netsnmp_table_data_set *table, netsnmp_table_row *row)"
+.br
+.RI "\fIremoves a row from the table, but doesn't delete/free anything.\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_dataset_remove_and_delete_row\fP (netsnmp_table_data_set *table, netsnmp_table_row *row)"
+.br
+.RI "\fIremoves a row from the table and then deletes it (and all it's data).\fP"
+.ti -1c
+.RI "void \fBnetsnmp_table_set_multi_add_default_row\fP (va_dcl) va_dcl"
+.br
+.RI "\fIadds multiple data column definitions to each row.\fP"
+.in -1c
+.SH "DETAILED DESCRIPTION"
+.PP
+This handler helps you implement a table where all the data is expected to be stored within the agent itself and not in some external storage location.
+.PP
+It handles all MIB requests including GETs, GETNEXTs and SETs. It's possible to simply create a table without actually ever defining a handler to be called when SNMP requests come in. To use the data, you can either attach a sub-handler that merely uses/manipulates the data further when requests come in, or you can loop through it externally when it's actually needed. This handler is most useful in cases where a table is holding configuration data for something which gets triggered via another event.
+.PP
+NOTE NOTE NOTE: This helper isn't complete and is likely to change somewhat over time. Specifically, the way it stores data internally may change drastically.
+.SH "FUNCTION DOCUMENTATION"
+.PP
+.SS "void netsnmp_config_parse_add_row (const char * token, char * line)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 707 of file table_dataset.c.
+.SS "void netsnmp_config_parse_table_set (const char * token, char * line)"
+.PP
+.PP
+For internal use only.
+.PP
+Definition at line 613 of file table_dataset.c.
+.SS "netsnmp_table_data_set* netsnmp_create_table_data_set (const char * table_name)"
+.PP
+Create a netsnmp_table_data_set structure given a table_data definition.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 63 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_table_set().
+.PP
+.SS "netsnmp_table_data_set* netsnmp_extract_table_data_set (netsnmp_request_info * request)\fC [inline]\fP"
+.PP
+extracts a netsnmp_table_data_set pointer from a given request.
+.PP
+Definition at line 144 of file table_dataset.c.
+.SS "netsnmp_mib_handler* netsnmp_get_table_data_set_handler (netsnmp_table_data_set * data_set)"
+.PP
+Given a netsnmp_table_data_set definition, create a handler for it.
+.PP
+Definition at line 72 of file table_dataset.c.
+.PP
+Referenced by netsnmp_register_table_data_set().
+.PP
+.SS "int netsnmp_mark_row_column_writable (netsnmp_table_row * row, int column, int writable)"
+.PP
+marks a given column in a row as writable or not.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 154 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_add_row(), and netsnmp_table_data_set_create_row_from_defaults().
+.PP
+.SS "void netsnmp_register_auto_data_table (netsnmp_table_data_set * table_set, char * registration_name)"
+.PP
+registers a table_dataset so that the 'add_row' snmpd.conf token can be used to add data to this table.
+.PP
+If registration_name is NULL then the name used when the table was created will be used instead.
+.PP
+\fB\fBTodo: \fP\fP
+.in +1c
+ create a properly free'ing registeration pointer for the datalist, and get the datalist freed at shutdown.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 598 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_table_set().
+.PP
+.SS "int netsnmp_register_table_data_set (netsnmp_handler_registration * reginfo, netsnmp_table_data_set * data_set, netsnmp_table_registration_info * table_info)"
+.PP
+register a given data_set at a given oid (specified in the netsnmp_handler_registration pointer).
+.PP
+The reginfo->handler->access_method *may* be null if the call doesn't ever want to be called for SNMP operations.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 95 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_table_set().
+.PP
+.SS "int netsnmp_set_row_column (netsnmp_table_row * row, unsigned int column, int type, const char * value, size_t value_len)"
+.PP
+sets a given column in a row with data given a type, value, and length.
+.PP
+Data is memdup'ed by the function.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 182 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_add_row(), and netsnmp_table_data_set_create_row_from_defaults().
+.PP
+.SS "netsnmp_table_row* netsnmp_table_data_set_clone_row (netsnmp_table_row * row)"
+.PP
+clones a dataset row, including all data.
+.PP
+Definition at line 270 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "netsnmp_table_row* netsnmp_table_data_set_create_row_from_defaults (netsnmp_table_data_set_storage * defrow)"
+.PP
+creates a new row from an existing defined default set.
+.PP
+Definition at line 305 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "netsnmp_table_data_set_storage* netsnmp_table_data_set_find_column (netsnmp_table_data_set_storage * start, unsigned int column)"
+.PP
+Finds a column within a given storage set, given the pointer to the start of the storage set list.
+.PP
+Definition at line 133 of file table_dataset.c.
+.PP
+Referenced by netsnmp_mark_row_column_writable(), netsnmp_set_row_column(), netsnmp_table_data_set_helper_handler(), and netsnmp_table_set_add_default_row().
+.PP
+.SS "int netsnmp_table_data_set_helper_handler (netsnmp_mib_handler * handler, netsnmp_handler_registration * reginfo, netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)"
+.PP
+implements the table data helper.
+.PP
+This is the routine that takes care of all SNMP requests coming into the table.
+.PP
+Definition at line 324 of file table_dataset.c.
+.SS "void netsnmp_table_dataset_add_index (netsnmp_table_data_set * table, u_char type)\fC [inline]\fP"
+.PP
+adds an index to the table.
+.PP
+Call this repeatly for each index.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 761 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_table_set().
+.PP
+.SS "void netsnmp_table_dataset_add_row (netsnmp_table_data_set * table, netsnmp_table_row * row)\fC [inline]\fP"
+.PP
+adds a new row to a dataset table.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 768 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "void netsnmp_table_dataset_delete_all_data (netsnmp_table_data_set_storage * data)\fC [inline]\fP"
+.PP
+deletes all the data from this node and beyond in the linked list.
+.PP
+Definition at line 800 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_dataset_delete_row(), and netsnmp_table_dataset_remove_and_delete_row().
+.PP
+.SS "netsnmp_table_data_set_storage* netsnmp_table_dataset_delete_data (netsnmp_table_data_set_storage * data)\fC [inline]\fP"
+.PP
+deletes a single dataset table data.
+.PP
+returns the (possibly still good) next pointer of the deleted data object.
+.PP
+Definition at line 787 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_dataset_delete_all_data().
+.PP
+.SS "void netsnmp_table_dataset_delete_row (netsnmp_table_row * row)\fC [inline]\fP"
+.PP
+deletes all the data from this node and beyond in the linked list.
+.PP
+Definition at line 810 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "void netsnmp_table_dataset_remove_and_delete_row (netsnmp_table_data_set * table, netsnmp_table_row * row)\fC [inline]\fP"
+.PP
+removes a row from the table and then deletes it (and all it's data).
+.PP
+Definition at line 832 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "void netsnmp_table_dataset_remove_row (netsnmp_table_data_set * table, netsnmp_table_row * row)\fC [inline]\fP"
+.PP
+removes a row from the table, but doesn't delete/free anything.
+.PP
+Definition at line 823 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "void netsnmp_table_dataset_replace_row (netsnmp_table_data_set * table, netsnmp_table_row * origrow, netsnmp_table_row * newrow)\fC [inline]\fP"
+.PP
+adds a new row to a dataset table.
+.PP
+Definition at line 776 of file table_dataset.c.
+.PP
+Referenced by netsnmp_table_data_set_helper_handler().
+.PP
+.SS "int netsnmp_table_set_add_default_row (netsnmp_table_data_set * table_set, unsigned int column, int type, int writable, void * default_value, size_t default_value_len)"
+.PP
+adds a new default row to a table_set.
+.PP
+Arguments should be the table_set, column number, variable type and finally a 1 if it is allowed to be writable, or a 0 if not. If the default_value field is not NULL, it will be used to populate new valuse in that column fro newly created rows. It is copied into the storage template (free your calling argument).
+.PP
+returns SNMPERR_SUCCESS or SNMPERR_FAILURE
+.PP
+Definition at line 231 of file table_dataset.c.
+.PP
+Referenced by netsnmp_config_parse_table_set().
+.PP
+.SS "void netsnmp_table_set_multi_add_default_row (va_dcl)"
+.PP
+adds multiple data column definitions to each row.
+.PP
+Functionally, this is a wrapper around calling netsnmp_table_set_add_default_row repeatedly for you.
+.PP
+\fBExamples: \fP
+.in +1c
+\fBdata_set.c\fP.
+.PP
+Definition at line 851 of file table_dataset.c.
\ No newline at end of file
diff --git a/man/netsnmp_table_iterator.3 b/man/netsnmp_table_iterator.3
new file mode 100644
index 0000000..abe0847
--- /dev/null
+++ b/man/netsnmp_table_iterator.3
@@ -0,0 +1,6 @@
+.TH "table_iterator: The table iterator helper is designed to simplify the task of writing a table handler for the net-snmp agent when the data being accessed is not in an oid sorted form and must be accessed externally." 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+table_iterator: The table iterator helper is designed to simplify the task of writing a table handler for the net-snmp agent when the data being accessed is not in an oid sorted form and must be accessed externally. \- Functionally, it is a specialized version of the more generic table helper but easies the burden of GETNEXT processing by manually looping through all the data indexes retrieved through function calls which should be supplied by the module that wishes help.
+More...The module the table_iterator helps should, afterwards, never be called for the case of 'MODE_GETNEXT' and only for the GET and SET related modes instead.
\ No newline at end of file
diff --git a/man/netsnmp_todo.3 b/man/netsnmp_todo.3
new file mode 100644
index 0000000..a959e0d
--- /dev/null
+++ b/man/netsnmp_todo.3
@@ -0,0 +1,13 @@
+.TH "todo" 3 "19 Apr 2002" "net-snmp" \" -*- nroff -*-
+.ad l
+.nh
+.SH NAME
+todo \- Todo List
+.IP "Global \fBnetsnmp_table_get_or_create_row_stash\fP(netsnmp_agent_request_info *reqinfo, const u_char *storage_name) " 1c
+ This function will likely change to add free pointer functions.
+.PP
+.IP "Global \fBhandler_mark_doneit\fP(int majorID, int minorID, void *serverarg, void *clientarg) " 1c
+ replace this with a method to check the handler chain instead.
+.PP
+.IP "Global \fBnetsnmp_register_auto_data_table\fP(netsnmp_table_data_set *table_set, char *registration_name) " 1c
+ create a properly free'ing registeration pointer for the datalist, and get the datalist freed at shutdown.
\ No newline at end of file