nsModuleTable.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:11k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * Note: this file originally auto-generated by mib2c using
  3.  *        : mib2c.iterate.conf,v 1.5 2001/12/04 21:36:27 hardaker Exp $
  4.  */
  5. #include <net-snmp/net-snmp-config.h>
  6. #include <net-snmp/net-snmp-includes.h>
  7. #include <net-snmp/agent/net-snmp-agent-includes.h>
  8. #include "nsModuleTable.h"
  9. void
  10. nsModuleTable_free(void *context, netsnmp_iterator_info *dont_care)
  11. {
  12.     free(context);
  13. }
  14.     
  15. /** Initialize the nsModuleTable table by defining it's contents and how it's structured */
  16. void
  17. initialize_table_nsModuleTable(void)
  18. {
  19.     static oid      nsModuleTable_oid[] =
  20.         { 1, 3, 6, 1, 4, 1, 8072, 1, 2, 1 };
  21.     netsnmp_table_registration_info *table_info;
  22.     netsnmp_handler_registration *my_handler;
  23.     netsnmp_iterator_info *iinfo;
  24.     /*
  25.      * create the table structure itself 
  26.      */
  27.     table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
  28.     iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
  29.     /*
  30.      * if your table is read only, it's easiest to change the
  31.      * HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY 
  32.      */
  33.     my_handler = netsnmp_create_handler_registration("nsModuleTable",
  34.                                                      nsModuleTable_handler,
  35.                                                      nsModuleTable_oid,
  36.                                                      OID_LENGTH
  37.                                                      (nsModuleTable_oid),
  38.                                                      HANDLER_CAN_RWRITE);
  39.     if (!my_handler || !table_info || !iinfo)
  40.         return;                 /* mallocs failed */
  41.     /***************************************************
  42.      * Setting up the table's definition
  43.      */
  44.     netsnmp_table_helper_add_indexes(table_info, ASN_OCTET_STR, /* context name */
  45.                                      ASN_OBJECT_ID,     /* reg point */
  46.                                      ASN_INTEGER,       /* priority */
  47.                                      0);
  48.     table_info->min_column = 4;
  49.     table_info->max_column = 6;
  50.     /*
  51.      * iterator access routines 
  52.      */
  53.     iinfo->get_first_data_point = nsModuleTable_get_first_data_point;
  54.     iinfo->get_next_data_point = nsModuleTable_get_next_data_point;
  55.     iinfo->free_loop_context_at_end = nsModuleTable_free;
  56.     iinfo->table_reginfo = table_info;
  57.     /***************************************************
  58.      * registering the table with the master agent
  59.      */
  60.     DEBUGMSGTL(("initialize_table_nsModuleTable",
  61.                 "Registering table nsModuleTable as a table iteratorn"));
  62.     netsnmp_register_table_iterator(my_handler, iinfo);
  63. }
  64. /** Initialzies the nsModuleTable module */
  65. void
  66. init_nsModuleTable(void)
  67. {
  68.     /*
  69.      * here we initialize all the tables we're planning on supporting 
  70.      */
  71.     initialize_table_nsModuleTable();
  72. }
  73. /** returns the first data point within the nsModuleTable table data.
  74.     Set the my_loop_context variable to the first data point structure
  75.     of your choice (from which you can find the next one).  This could
  76.     be anything from the first node in a linked list, to an integer
  77.     pointer containing the beginning of an array variable.
  78.     Set the my_data_context variable to something to be returned to
  79.     you later that will provide you with the data to return in a given
  80.     row.  This could be the same pointer as what my_loop_context is
  81.     set to, or something different.
  82.     The put_index_data variable contains a list of snmp variable
  83.     bindings, one for each index in your table.  Set the values of
  84.     each appropriately according to the data matching the first row
  85.     and return the put_index_data variable at the end of the function.
  86. */
  87. typedef struct context_tree_ptr_s {
  88.     netsnmp_subtree *tree;
  89.     subtree_context_cache *context_ptr;
  90. } context_tree_ptr;
  91. netsnmp_variable_list *
  92. nsModuleTable_get_first_data_point(void **my_loop_context,
  93.                                    void **my_data_context,
  94.                                    netsnmp_variable_list * put_index_data,
  95.                                    netsnmp_iterator_info *otherstuff)
  96. {
  97.     struct variable_list *vptr;
  98.     u_long          ultmp;
  99.     context_tree_ptr *ctree;
  100.     ctree = SNMP_MALLOC_TYPEDEF(context_tree_ptr);
  101.     ctree->context_ptr = get_top_context_cache();
  102.     /* Skip empty context registrations */
  103.     while (!ctree->context_ptr->first_subtree) {
  104.         ctree->context_ptr = ctree->context_ptr->next;
  105.         if (!ctree->context_ptr)
  106.             return NULL;
  107.     }
  108.     ctree->tree = ctree->context_ptr->first_subtree;
  109.     *my_loop_context = ctree;
  110.     *my_data_context = ctree->tree;
  111.     vptr = put_index_data;
  112.     snmp_set_var_value(vptr, (u_char *) ctree->context_ptr->context_name,
  113.                        strlen(ctree->context_ptr->context_name));
  114.     vptr = vptr->next_variable;
  115.     snmp_set_var_value(vptr,
  116.                        (u_char *)ctree->context_ptr->first_subtree->name_a,
  117.                        ctree->context_ptr->first_subtree->namelen *
  118.                        sizeof(oid));
  119.     ultmp = ctree->context_ptr->first_subtree->priority;
  120.     vptr = vptr->next_variable;
  121.     snmp_set_var_value(vptr, (u_char *) & ultmp, sizeof(ultmp));
  122.     return put_index_data;
  123. }
  124. /** functionally the same as nsModuleTable_get_first_data_point, but
  125.    my_loop_context has already been set to a previous value and should
  126.    be updated to the next in the list.  For example, if it was a
  127.    linked list, you might want to cast it and the return
  128.    my_loop_context->next.  The my_data_context pointer should be set
  129.    to something you need later and the indexes in put_index_data
  130.    updated again. */
  131. struct variable_list *
  132. nsModuleTable_get_next_data_point(void **my_loop_context,
  133.                                   void **my_data_context,
  134.                                   struct variable_list *put_index_data,
  135.                                   netsnmp_iterator_info *otherstuff)
  136. {
  137.     struct variable_list *vptr;
  138.     context_tree_ptr *ctree = (context_tree_ptr *) * my_loop_context;
  139.     u_long          ultmp;
  140.     if (ctree->tree->next)
  141.         ctree->tree = ctree->tree->next;
  142.     else {
  143.         ctree->context_ptr = ctree->context_ptr->next;
  144.         if (!ctree->context_ptr) {
  145.             return NULL;
  146.         }
  147.         ctree->tree = ctree->context_ptr->first_subtree;
  148.     }
  149.     *my_data_context = ctree->tree;
  150.     vptr = put_index_data;
  151.     snmp_set_var_value(vptr, (u_char *) ctree->context_ptr->context_name,
  152.                        strlen(ctree->context_ptr->context_name));
  153.     vptr = vptr->next_variable;
  154.     snmp_set_var_value(vptr, (u_char *) ctree->tree->name_a,
  155.                        ctree->tree->namelen * sizeof(oid));
  156.     ultmp = ctree->tree->priority;
  157.     vptr = vptr->next_variable;
  158.     snmp_set_var_value(vptr, (u_char *) & ultmp, sizeof(ultmp));
  159.     return put_index_data;
  160. }
  161. /** handles requests for the nsModuleTable table, if anything else needs to be done */
  162. int
  163. nsModuleTable_handler(netsnmp_mib_handler *handler,
  164.                       netsnmp_handler_registration *reginfo,
  165.                       netsnmp_agent_request_info *reqinfo,
  166.                       netsnmp_request_info *requests)
  167. {
  168.     netsnmp_table_request_info *table_info;
  169.     netsnmp_request_info *request;
  170.     netsnmp_variable_list *var;
  171.     netsnmp_subtree *tree;
  172.     u_long          ultmp;
  173.     u_char          modes[1];
  174.     for (request = requests; request; request = request->next) {
  175.         var = request->requestvb;
  176.         if (request->processed != 0)
  177.             continue;
  178.         /*
  179.          * perform anything here that you need to do.  The request have
  180.          * already been processed by the master table_dataset handler, but
  181.          * this gives you chance to act on the request in some other way if 
  182.          * need be. 
  183.          */
  184.         /*
  185.          * the following extracts the my_data_context pointer set in the
  186.          * loop functions above.  You can then use the results to help
  187.          * return data for the columns of the nsModuleTable table in
  188.          * question 
  189.          */
  190.         tree = (netsnmp_subtree *)netsnmp_extract_iterator_context(request);
  191.         if (tree == NULL) {
  192.             if (reqinfo->mode == MODE_GET) {
  193.                 netsnmp_set_request_error(reqinfo, request,
  194.                                           SNMP_NOSUCHINSTANCE);
  195.                 continue;
  196.             }
  197.             /*
  198.              * XXX: no row existed, if you support creation and this is a
  199.              * set, start dealing with it here, else continue 
  200.              */
  201.         }
  202.         /*
  203.          * extracts the information about the table from the request 
  204.          */
  205.         table_info = netsnmp_extract_table_info(request);
  206.         /*
  207.          * table_info->colnum contains the column number requested 
  208.          */
  209.         /*
  210.          * table_info->indexes contains a linked list of snmp variable
  211.          * bindings for the indexes of the table.  Values in the list have 
  212.          * been set corresponding to the indexes of the request 
  213.          */
  214.         if (table_info == NULL) {
  215.             continue;
  216.         }
  217.         switch (reqinfo->mode) {
  218.             /*
  219.              * the table_iterator helper should change all GETNEXTs into
  220.              * GETs for you automatically, so you don't have to worry
  221.              * about the GETNEXT case.  Only GETs and SETs need to be
  222.              * dealt with here 
  223.              */
  224.         case MODE_GET:
  225.             switch (table_info->colnum) {
  226.             case COLUMN_NSMODULENAME:
  227. if (tree->reginfo->handlerName) {
  228.                     snmp_set_var_typed_value(var, ASN_OCTET_STR,
  229.                                            tree->reginfo->handlerName,
  230.                                            strlen(tree->reginfo->handlerName));
  231.                 } else {
  232.                     snmp_set_var_typed_value(var, ASN_OCTET_STR, "", 0);
  233. }
  234.                 break;
  235.             case COLUMN_NSMODULEMODES:
  236.                 /*
  237.                  * basically, these BITS needs to be inverted in order 
  238.                  */
  239.                 modes[0] =
  240.                     ((HANDLER_CAN_GETANDGETNEXT & tree->reginfo->
  241.                       modes) << 7) | ((HANDLER_CAN_SET & tree->reginfo->
  242.                                        modes) << 5) | ((HANDLER_CAN_GETBULK
  243.                                                         & tree->reginfo->
  244.                                                         modes) << 3);
  245. /*  yuck  */
  246.                 snmp_set_var_typed_value(var, ASN_OCTET_STR, modes, 1);
  247.                 break;
  248.             case COLUMN_NSMODULETIMEOUT:
  249.                 ultmp = tree->timeout;
  250.                 snmp_set_var_typed_value(var, ASN_INTEGER,
  251.                                          (u_char *) & ultmp,
  252.                                          sizeof(u_long));
  253.                 break;
  254.             default:
  255.                 /*
  256.                  * We shouldn't get here 
  257.                  */
  258.                 snmp_log(LOG_ERR,
  259.                          "problem encountered in nsModuleTable_handler: unknown columnn");
  260.             }
  261.             break;
  262.         default:
  263.             snmp_log(LOG_ERR,
  264.                      "problem encountered in nsModuleTable_handler: unsupported moden");
  265.         }
  266.     }
  267.     return SNMP_ERR_NOERROR;
  268. }