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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #include <net-snmp/net-snmp-includes.h>
  3. /*
  4.  *
  5.  *  Convenience routines to make various requests
  6.  *  over the specified SNMP session.
  7.  *
  8.  */
  9. static netsnmp_session *_def_query_session = NULL;
  10. void
  11. netsnmp_query_set_default_session( netsnmp_session *sess) {
  12.     _def_query_session = sess;
  13. }
  14. netsnmp_session *
  15. netsnmp_query_get_default_session( void ) {
  16.     return _def_query_session;
  17. }
  18. /*
  19.  * Internal utility routine to actually send the query
  20.  */
  21. static int _query(netsnmp_variable_list *list,
  22.                   int                    request,
  23.                   netsnmp_session       *session) {
  24.     netsnmp_pdu *pdu      = snmp_pdu_create( request );
  25.     netsnmp_pdu *response = NULL;
  26.     netsnmp_variable_list *vb1, *vb2, *vtmp;
  27.     int ret;
  28.     /*
  29.      * Clone the varbind list into the request PDU...
  30.      */
  31.     pdu->variables = snmp_clone_varbind( list );
  32.     if ( session )
  33.         ret = snmp_synch_response(            session, pdu, &response );
  34.     else if (_def_query_session)
  35.         ret = snmp_synch_response( _def_query_session, pdu, &response );
  36.     else {
  37.         /* No session specified */
  38.         return SNMP_ERR_GENERR;
  39.     }
  40.     /*
  41.      * ....then copy the results back into the
  42.      * list (assuming the request succeeded!).
  43.      * This avoids having to worry about how this
  44.      * list was originally allocated.
  45.      */
  46.     if ( ret == SNMP_ERR_NOERROR ) {
  47.         if ( response->errstat != SNMP_ERR_NOERROR ) {
  48.             ret = response->errstat;
  49.         } else {
  50.             for (vb1 = response->variables, vb2 = list;
  51.                  vb1;
  52.                  vb1 = vb1->next_variable,  vb2 = vb2->next_variable) {
  53.                 if ( !vb2 ) {
  54.                     ret = SNMP_ERR_GENERR;
  55.                     break;
  56.                 }
  57.                 vtmp = vb2->next_variable;
  58.                 snmp_clone_var( vb1, vb2 );
  59.                 vb2->next_variable = vtmp;
  60.             }
  61.         }
  62.     } else {
  63.         /* Distinguish snmp_send errors from SNMP errStat errors */
  64.         ret = -ret;
  65.     }
  66.     snmp_free_pdu( response );
  67.     return ret;
  68. }
  69. /*
  70.  * These are simple wrappers round the internal utility routine
  71.  */
  72. int netsnmp_query_get(netsnmp_variable_list *list,
  73.                       netsnmp_session       *session){
  74.     return _query( list, SNMP_MSG_GET, session );
  75. }
  76. int netsnmp_query_getnext(netsnmp_variable_list *list,
  77.                           netsnmp_session       *session){
  78.     return _query( list, SNMP_MSG_GETNEXT, session );
  79. }
  80. int netsnmp_query_set(netsnmp_variable_list *list,
  81.                       netsnmp_session       *session){
  82.     return _query( list, SNMP_MSG_SET, session );
  83. }
  84. /*
  85.  * A walk needs a bit more work.
  86.  */
  87. int netsnmp_query_walk(netsnmp_variable_list *list,
  88.                        netsnmp_session       *session) {
  89.     /*
  90.      * Create a working copy of the original (single)
  91.      * varbind, so we can use this varbind parameter
  92.      * to check when we've finished walking this subtree.
  93.      */
  94.     netsnmp_variable_list *vb = snmp_clone_varbind( list );
  95.     netsnmp_variable_list *res_list = NULL;
  96.     netsnmp_variable_list *res_last = NULL;
  97.     int ret;
  98.     /*
  99.      * Now walk the tree as usual
  100.      */
  101.     ret = _query( vb, SNMP_MSG_GETNEXT, session );
  102.     while ( ret == SNMP_ERR_NOERROR &&
  103.         snmp_oidtree_compare( list->name, list->name_length,
  104.                                 vb->name,   vb->name_length ) == 0) {
  105.         /*
  106.          * Copy each response varbind to the end of the result list
  107.          * and then re-use this to ask for the next entry.
  108.          */
  109.         if ( res_last ) {
  110.             res_last->next_variable = snmp_clone_varbind( vb );
  111.             res_last = res_last->next_variable;
  112.         } else {
  113.             res_list = snmp_clone_varbind( vb );
  114.             res_last = res_list;
  115.         }
  116.         ret = _query( vb, SNMP_MSG_GETNEXT, session );
  117.     }
  118.     /*
  119.      * Copy the first result back into the original varbind parameter,
  120.      * add the rest of the results (if any), and clean up.
  121.      */
  122.     if ( res_list ) {
  123.         snmp_clone_var( res_list, list );
  124.         list->next_variable = res_list->next_variable;
  125.         res_list->next_variable = NULL;
  126.         snmp_free_varbind( res_list );
  127.     }
  128.     snmp_free_varbind( vb );
  129.     return ret;
  130. }