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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * Note: this file originally auto-generated by mib2c 
  3.  */
  4. #include <net-snmp/net-snmp-config.h>
  5. #include <net-snmp/net-snmp-includes.h>
  6. #include <net-snmp/agent/net-snmp-agent-includes.h>
  7. #include <net-snmp/agent/table.h>
  8. #include <net-snmp/agent/table_iterator.h>
  9. #include "nsTransactionTable.h"
  10. /** Initialize the nsTransactionTable table by defining it's contents
  11.    and how it's structured */
  12. void
  13. initialize_table_nsTransactionTable(void)
  14. {
  15.     static oid      nsTransactionTable_oid[] =
  16.         { 1, 3, 6, 1, 4, 1, 8072, 1, 8, 1 };
  17.     size_t          nsTransactionTable_oid_len =
  18.         OID_LENGTH(nsTransactionTable_oid);
  19.     netsnmp_table_registration_info *table_info;
  20.     netsnmp_handler_registration *my_handler;
  21.     netsnmp_iterator_info *iinfo;
  22.     /*
  23.      * create the table structure itself 
  24.      */
  25.     table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
  26.     iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
  27.     /*
  28.      * if your table is read only, it's easiest to change the
  29.      * HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY 
  30.      */
  31.     my_handler = netsnmp_create_handler_registration("nsTransactionTable",
  32.                                                      nsTransactionTable_handler,
  33.                                                      nsTransactionTable_oid,
  34.                                                      nsTransactionTable_oid_len,
  35.                                                      HANDLER_CAN_RONLY);
  36.     if (!my_handler || !table_info || !iinfo)
  37.         return;                 /* mallocs failed */
  38.     /***************************************************
  39.      * Setting up the table's definition
  40.      */
  41.     netsnmp_table_helper_add_index(table_info, ASN_INTEGER);    /* index:
  42.                                                                  * * nsTransactionID 
  43.                                                                  */
  44.     table_info->min_column = 2;
  45.     table_info->max_column = 2;
  46.     iinfo->get_first_data_point = nsTransactionTable_get_first_data_point;
  47.     iinfo->get_next_data_point = nsTransactionTable_get_next_data_point;
  48.     iinfo->table_reginfo = table_info;
  49.     /***************************************************
  50.      * registering the table with the master agent
  51.      */
  52.     DEBUGMSGTL(("initialize_table_nsTransactionTable",
  53.                 "Registering table nsTransactionTable as a table iteratorn"));
  54.     netsnmp_register_table_iterator(my_handler, iinfo);
  55. }
  56. /** Initialzies the nsTransactionTable module */
  57. void
  58. init_nsTransactionTable(void)
  59. {
  60.     /*
  61.      * here we initialize all the tables we're planning on supporting 
  62.      */
  63.     initialize_table_nsTransactionTable();
  64. }
  65. /** returns the first data point within the nsTransactionTable table data.
  66.     Set the my_loop_context variable to the first data point structure
  67.     of your choice (from which you can find the next one).  This could
  68.     be anything from the first node in a linked list, to an integer
  69.     pointer containing the beginning of an array variable.
  70.     Set the my_data_context variable to something to be returned to
  71.     you later that will provide you with the data to return in a given
  72.     row.  This could be the same pointer as what my_loop_context is
  73.     set to, or something different.
  74.     The put_index_data variable contains a list of snmp variable
  75.     bindings, one for each index in your table.  Set the values of
  76.     each appropriately according to the data matching the first row
  77.     and return the put_index_data variable at the end of the function.
  78. */
  79. extern netsnmp_agent_session *agent_delegated_list;
  80. netsnmp_variable_list *
  81. nsTransactionTable_get_first_data_point(void **my_loop_context,
  82.                                         void **my_data_context,
  83.                                         netsnmp_variable_list
  84.                                         * put_index_data,
  85.                                         netsnmp_iterator_info *iinfo)
  86. {
  87.     netsnmp_variable_list *vptr;
  88.     if (!agent_delegated_list)
  89.         return NULL;
  90.     *my_loop_context = (void *) agent_delegated_list;
  91.     *my_data_context = (void *) agent_delegated_list;
  92.     vptr = put_index_data;
  93.     snmp_set_var_value(vptr,
  94.                        (u_char *) & agent_delegated_list->pdu->transid,
  95.                        sizeof(agent_delegated_list->pdu->transid));
  96.     return put_index_data;
  97. }
  98. /** functionally the same as nsTransactionTable_get_first_data_point, but
  99.    my_loop_context has already been set to a previous value and should
  100.    be updated to the next in the list.  For example, if it was a
  101.    linked list, you might want to cast it and the return
  102.    my_loop_context->next.  The my_data_context pointer should be set
  103.    to something you need later and the indexes in put_index_data
  104.    updated again. */
  105. netsnmp_variable_list *
  106. nsTransactionTable_get_next_data_point(void **my_loop_context,
  107.                                        void **my_data_context,
  108.                                        netsnmp_variable_list
  109.                                        * put_index_data,
  110.                                        netsnmp_iterator_info *iinfo)
  111. {
  112.     netsnmp_variable_list *vptr;
  113.     netsnmp_agent_session *alist = (netsnmp_agent_session *)
  114.         *my_loop_context;
  115.     if (!alist->next)
  116.         return NULL;
  117.     alist = alist->next;
  118.     *my_loop_context = (void *) alist;
  119.     *my_data_context = (void *) alist;
  120.     vptr = put_index_data;
  121.     snmp_set_var_value(vptr, (u_char *) & alist->pdu->transid,
  122.                        sizeof(alist->pdu->transid));
  123.     return put_index_data;
  124. }
  125. /** handles requests for the nsTransactionTable table, if anything
  126.    else needs to be done */
  127. int
  128. nsTransactionTable_handler(netsnmp_mib_handler *handler,
  129.                            netsnmp_handler_registration *reginfo,
  130.                            netsnmp_agent_request_info *reqinfo,
  131.                            netsnmp_request_info *requests)
  132. {
  133.     netsnmp_table_request_info *table_info;
  134.     netsnmp_variable_list *var;
  135.     netsnmp_agent_session *asp;
  136.     for (; requests; requests = requests->next) {
  137.         var = requests->requestvb;
  138.         if (requests->processed != 0)
  139.             continue;
  140.         /*
  141.          * perform anything here that you need to do.  The requests have
  142.          * already been processed by the master table_dataset handler, but
  143.          * this gives you chance to act on the request in some other way if 
  144.          * need be. 
  145.          */
  146.         /*
  147.          * the following extracts the my_data_context pointer set in the
  148.          * loop functions above.  You can then use the results to help
  149.          * return data for the columns of the nsTransactionTable table in
  150.          * question 
  151.          */
  152.         asp =
  153.             (netsnmp_agent_session *)
  154.             netsnmp_extract_iterator_context(requests);
  155.         if (asp == NULL) {
  156.             netsnmp_set_request_error(reqinfo, requests,
  157.                                       SNMP_NOSUCHINSTANCE);
  158.         }
  159.         /*
  160.          * extracts the information about the table from the request 
  161.          */
  162.         table_info = netsnmp_extract_table_info(requests);
  163.         /*
  164.          * table_info->colnum contains the column number requested 
  165.          */
  166.         /*
  167.          * table_info->indexes contains a linked list of snmp variable
  168.          * bindings for the indexes of the table.  Values in the list have 
  169.          * been set corresponding to the indexes of the request 
  170.          */
  171.         if (table_info == NULL) {
  172.             continue;
  173.         }
  174.         switch (reqinfo->mode) {
  175.             /*
  176.              * the table_iterator helper should change all GETNEXTs into
  177.              * GETs for you automatically, so you don't have to worry
  178.              * about the GETNEXT case.  Only GETs and SETs need to be
  179.              * dealt with here 
  180.              */
  181.         case MODE_GET:
  182.             switch (table_info->colnum) {
  183.             case COLUMN_NSTRANSACTIONMODE:
  184.                 snmp_set_var_typed_value(var, ASN_INTEGER,
  185.                                          (u_char *) & asp->mode,
  186.                                          sizeof(asp->mode));
  187.                 break;
  188.             default:
  189.                 /*
  190.                  * We shouldn't get here 
  191.                  */
  192.                 snmp_log(LOG_ERR,
  193.                          "problem encountered in nsTransactionTable_handler: unknown columnn");
  194.             }
  195.             break;
  196.         default:
  197.             snmp_log(LOG_ERR,
  198.                      "problem encountered in nsTransactionTable_handler: unsupported moden");
  199.         }
  200.     }
  201.     return SNMP_ERR_NOERROR;
  202. }