This directory holds the implementation of individual MIB groups.
Currently, this contains the eight MIB-2 groups, plus a basic template
for new MIB groups (examples/example.c and examples/example.h)

Additionally, you may wish to check out the 'mib2c' perl script in the 
SRCDIR/local directory that can convert a written mib into C template
files for use with this package as mib modules.

Each group consists of two files:

  examples/example.h:	interface information

	- declaration of the initialisation function 'init_example'
		(optional)
	- declaration of the function(s) for retrieving variable
		information 'var_example'
	- declaration of the function(s) for setting variable
		information (if appropriate)

	- declaration of the function(s) for parsing the snmpd.conf file
		(optional)
        - a call to config_parse_dot_conf() to explain to the .conf
		parser which tokens we want to parse.
		(optional)

	- definitions of the MIB group 'magic numbers'
		declarations of the 'public' functions

	- a list of the variables in the group, including
		type information, mapping between magic numbers
		and OID sub-identifiers within the group,
		accessibility information, and the relevant
		function for retrieving this variable's value.
                They *must* be listed in the mib-descending order.
	- a call to 'config_load_mib', identifying the location of
		this MIB group within the general MIB structure.
	- a call to 'config_require' to identify any other files
		that are required by the implementation of this group.
		(optional)

    (these last three are only visible within the 'glue' file 'snmp_vars.c'
	(if at all), but are declared here for ease of maintainance)



  examples/example.c:	implementation code
		(can be non-existant if only the .h file is needed)

	- a list of kernel information needed to report
		on this group
	- an initialisation function (optional)
        - a routine to parse an snmpd.conf line.
        - a routine to free resources from above and return to 
                default settings.
	- 'header' function(s) to map the OID requested
		to the next appropriate OID
		(and similar system-independent setup)
	- function(s) (possibly system-specific) to
		determine and return the value of the
		variable requested.
	- (optionally) functions used to set values
	- other functions used internally


To implement a new MIB group, copy the two files 'example.c'
and 'example.h' to appropriate new files ({MODULENAME}.c and {MODULENAME}.h),
and edit them as follows:

	example.h:
		globally change "example" to the new module name
		    and update the initial comment.
		replace the EXAMPLE* defines with the list of
		    variables within this new group
		fill in the 'MODULENAME_variables' structure with these
		    new variables, updating the type, accessibility
		    and sub-identifier information as appropriate.
		replace 'variableN' with the maximum size of the
		    returned OID (omitting the group prefix).
		    For non-table values, this will probably be one
		    greater than the length of the sub-identifier.
                update or remove the 'config_parse_dot_conf' call if
                    you need to handle lines in the snmpd.conf files.
		update the 'config_load_mib' call with the appropriate
		    location within the global MIB structure, and
		    its length (note that 'MIB' has length 6)
		provide a suitable 'config_require' call if this
		    code uses routines from any other files within
		    the 'mibgroup' directory (such as 'util_funcs.c')



	example.c:
		globally change "example" to the new module name
		    and update the initial comment.
		replace the 'MODULENAME_nl' name list with any necessary
		    kernel variables, and update the associated #define's
		replace the name length definition within the 'header'
		    function with the length of the requesting OID
		    (i.e. the sum of the lengths given in the subtree
		     definition, and the variable structure above).
		replace the basic 'switch' structure within the
		    'var_MODULENAME' function with the necessary code
		    to calculate the required information.
		(plus any other internal functions as needed).

  It will then be necessary to (re-)run the configure script with the
option
	--with-mib-modules="MODULENAME"

(where MODULENAME matches the name of the .c/.h file pair exactly).
Note that if anything in the config_* macros changes, or the init function
is added or removed, then the configure script will need to be re-run.

