@open -@
mib2c has multiple configuration files depending on the type of
code you need to write.  You must pick one depending on your need.

You requested mib2c to be run on the following part of the MIB tree:
  OID:                       	    $name
  numeric translation:       	    $name.objectID
@eval $num = count_scalars@
  number of scalars within:         $num
@eval $num = count_tables@
  number of tables within:          $num
@eval $num = count_notifications@
  number of notifications within:   $num

First, do you want to generate code that is compatible with the
ucd-snmp 4.X line of code, or code for the newer Net-SNMP 5.X code
base (which provides a much greater choice of APIs to pick from):

  1) ucd-snmp style code
  2) Net-SNMP style code

@prompt $ans Select your choice : @
@if $ans == 1@
**********************************************************************
  GENERATING CODE FOR THE 4.X LINE OF CODE (THE OLDER API)
**********************************************************************

  using the mib2c.old-api.conf configuration file to generate your code.
  @run mib2c.old-api.conf@

@elsif $ans != 2@
Invalid answer.
@else@
@if count_scalars() > 0@

**********************************************************************
		 GENERATING CODE FOR SCALAR OBJECTS:
**********************************************************************

  It looks like you have some scalars in the mib you requested, so I
  will now generate code for them if you wish.  You have two choices
  for scalar API styles currently.  Pick between them, or choose not
  to generate any code for the scalars:

  1) If you're writing code for some generic scalars
     (by hand use: "mib2c -c mib2c.scalar.conf $name")

  2) If you want to magically "tie" integer variables to integer
     scalars
     (by hand use: "mib2c -c mib2c.int_watch.conf $name")

  3) Don't generate any code for the scalars

  @prompt $ans Select your choice: @
  @if $ans == 1@
    using the mib2c.scalar.conf configuration file to generate your code.
    @run mib2c.scalar.conf@
  @elsif $ans == 2@
      using the mib2c.int_watch.conf configuration file to generate your code.
      @run mib2c.int_watch.conf@
  @elsif $ans != 3@
        WARNING: Unknown response.  Skipping code generation for scalars.
  @end@
@end@ # scalars

@if count_tables() > 0@
**********************************************************************
		     GENERATING CODE FOR TABLES:
**********************************************************************

  Your tables will likely either fall into one of two categories:

    1) tables where the list of rows is external to the agent.
       This is suited to MIBs which monitor or manipulate external
       data (perhaps extracted from the operating system kernel
       or other system interfaces), and where rows are typically
       created or destroyed independently of the SNMP agent.

    2) tables where the list of rows is held by the agent itself.
       This is particularly suited to tables that are primarily
       manipulated via SNMP, or where the rows of the table are
       relatively static.

    3) Do not generate code for the tables.

  @prompt $ans Select the option that best fits you: @
  @if $ans != 3@
    @if $ans == 1@

      This style of table tends to use the iterator helper to instrument
      the external data, so it can be represented by an SNMP table.
      The main characteristic of this helper is the use of a pair
      of "iteration hook" routines to loop through the rows in turn
      (in the most natural order for the underlying data).
        There are a couple of different template configurations that
      can be used as a framework for this:

      1) One based around a single handler, that includes code to handle
         both GET and SET requests, as well as row creation and deletion.
         This template defines a suitable data structure, and implements
         the table as an internally-held linked list, but both of these
         are mainly for illustration, and could reasonably be replaced by
         code more appropriate for the table being implemented.
           The same template can be generated using
                 mib2c -c mib2c.iterate.conf $name
 
      2) An alternative framework, designed as an API wrapper on top of
         the basic iterator helper, that seeks to separate the standard
         processing of the syntax of a MIB table (which can be generated
         automaticall), from the semantics of a given table (which cannot).
           It generates a number of separate code files, but typically
         only one or two of these will need to be edited.  These contain
         separate 'get_column()' and 'set_column()' functions for each
         column in the table, plus some other routines for manipulating
         rows (plus the standard iterator hook routines).
           The same templates can be generated using
                 mib2c -c mib2c.iterate_access.conf $name
         (See the agent/mibgroup/example/netSnmpHostsTable.c file for example)

      3) An API layer (not based on the iterator helper) that attempts
         to reduce the amount of SNMP specific knowledge required to
         implement a module. It provides more APIs than 2, which are
         (hopefully) smaller and more specific, with less SNMP terminology.
           This API is also known as "MIBs for Dummies".  Numerous tables
         in the Net-SNMP agent have been re-written to use this API.
           The same templates can be generated using
                 mib2c -c mib2c.mfd.conf $name
         (See the agent/mibgroup/if-mib/ifTable/ifTable*.c files for examples)

      4) Do not generate code for the tables.

      If you are unsure which option to pick, choices 2) or 3) are perhaps
      more suited for those less familiar with the concepts behind the SNMP
      protocol operations, while choice 1) gives more control over exactly
      what is done.

     @prompt $ans Select the API style you wish to use: @
     @if $ans != 5@
       @if $ans == 1@
         using the mib2c.iterate.conf configuration file to generate your code.
         @run mib2c.iterate.conf@
       @elsif $ans == 2@
         using the mib2c.iterate_access.conf configuration file to
         generate your code.
         @run mib2c.iterate_access.conf@
       @elsif $ans == 3@
         using the mib2c.mfd.conf configuration file to
         generate your code.
         @run mib2c.mfd.conf@
       @else@
         WARNING: Unknown response.  Skipping code generation for tables.
       @end@
     @end@
    @else@
      @if $ans == 2@
      This style of table holds a list of the table rows internally
      within the agent itself.  Typically this will tend to include
      the column values for each particular row, and that is the
      model used by the generated template code.  But it should usually
      be possible to read in some or all of the column values from an
      external source, should this be necessary for a particular MIB table.
        There are a number of different template configurations that
      can be used as a framework for this:
      

      1) dataset storage: The data for the table is stored completely
         within the agent, and the user-visible code does not need to
         be concerned with the internal representation of an individual
         row.  This is most suited to MIB tables that are purely internal
         to the agent, rather than modelling external data, or using
         existing data structures.
           The same template can be generated using
                 mib2c -c mib2c.create-dataset.conf $name

      2) row-data storage: The data for the table is held by the agent,
         but using an arbitrary (user-provided) data structure for the
         representation of an individual row. This is suited for MIB
         tables where there is a natural existing data structure,
         or where the contents of the table may need to be interpreted
         for some additional purpose, other than simply implementing
         the table for SNMP requests.
           The same template can be generated using
                 mib2c -c mib2c.table_data.conf $name

      3) container storage: This is very similar to the previous row-data
         mechanism, but uses a different (and slightly more efficient)
         internal representation.  The main practical effect is to
         introduce a slight constraint on the form of the per-row data
         structure.
           The same template can be generated using
                 mib2c -c mib2c.container.conf $name

      All three of these templates generate a single code file, and
      use a "single handler" format for the driving code.

      4) sorted array:  The data for the table is stored in a sorted
         array.
         (manually mib2c -c mib2c.array-user.conf ${name})

      5) Net-SNMP container: (Also known as "MIBs for Dummies", or MFD.)
         The data for the table is stored via a
         generic interface. Various types of containers may be
         selected, including linked lists or binary arrays.
         (manually mib2c -c mib2c.mfd.conf ${name})

      6) Do not generate code for the tables.

      All APIs are fully functional with little-to-no required code
      to make the table operational on your end once the template
      code is produced.  The MFD and dataset APIs are a bit better
      documented, but the sorted array is probably better tested
      as it was used heavily in the net-policy sourceforge project.
      The MFD API is the successor to the array-user API, and several
      tables in the Net-SNMP agent have been re-written to use it.
      The dataset API is used inside the snmptrapd application for
      logging incoming traps.

      @prompt $ans Select the API style you wish to use: @
      @if $ans != 6@
        @if $ans == 1@
          using the mib2c.create-dataset.conf configuration file
          to generate your code.
          @run mib2c.create-dataset.conf@
        @elsif $ans == 2@
          using the mib2c.array-user.conf configuration file to
          generate your code.
          @run mib2c.table_data.conf@
        @elsif $ans == 3@
          using the mib2c.container.conf configuration file to
          generate your code.
          @run mib2c.container.conf@
        @elsif $ans == 4@
          using the mib2c.array-user.conf configuration file to
          generate your code.
          @run mib2c.array-user.conf@
        @elsif $ans == 5@
          using the mib2c.mfd.conf configuration file to generate your code.
          @run mib2c.mfd.conf@
        @else@
          WARNING: Unknown response.  Skipping code generation for tables.
        @end@
      @else@
        WARNING: Unknown response.  Skipping code generation for tables.
      @end@
    @end@
  @end@
 @end@ # != 3
@end@ # tables

@if count_notifications() > 0@
**********************************************************************
		 GENERATING CODE FOR NOTIFICATIONS:
**********************************************************************

Would you like to generate code for sending notifications from within
the agent?

 @prompt $ans "y" or "n": @
 @if ("$ans" eq "y") or ("$ans" eq "yes")@
   using mib2c.notify.conf to generate code for sending notifications
   @run mib2c.notify.conf@
 @end@

#  GENERATING HEADER FILE DEFINITIONS
#
#    To generate just a header with a define for each column number in
#    your table:
#
#      mib2c -c mib2c.column_defines.conf ${name}
#
#    To generate just a header with a define for each enum for any
#    column containing enums:
#
#      mib2c -c mib2c.column_enums.conf ${name}

@end@ # notifications
@end@ # new style code

**********************************************************************
* NOTE WELL: The code generated by mib2c is only a template.  *YOU*  *
* must fill in the code before it'll work most of the time.  In many *
* cases, spots that MUST be edited within the files are marked with  *
* /* XXX */ or /* TODO */ comments.                                  *
**********************************************************************
