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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #if HAVE_STRING_H
  3. #include <string.h>
  4. #else
  5. #include <strings.h>
  6. #endif
  7. #include <net-snmp/net-snmp-includes.h>
  8. #include <net-snmp/agent/net-snmp-agent-includes.h>
  9. #include <net-snmp/agent/bulk_to_next.h>
  10. #if HAVE_DMALLOC_H
  11. #include <dmalloc.h>
  12. #endif
  13. /** @defgroup bulk_to_next bulk_to_next: convert GETBULK requests into GETNEXT requests for the handler.
  14.  *  The only purpose of this handler is to convert a GETBULK request
  15.  *  to a GETNEXT request.  It is inserted into handler chains where
  16.  *  the handler has not set the HANDLER_CAN_GETBULK flag.
  17.  *  @ingroup utilities
  18.  *  @{
  19.  */
  20. /** returns a bulk_to_next handler that can be injected into a given
  21.  *  handler chain.
  22.  */
  23. netsnmp_mib_handler *
  24. netsnmp_get_bulk_to_next_handler(void)
  25. {
  26.     netsnmp_mib_handler *handler =
  27.         netsnmp_create_handler("bulk_to_next",
  28.                                netsnmp_bulk_to_next_helper);
  29.     if (NULL != handler)
  30.         handler->flags |= MIB_HANDLER_AUTO_NEXT;
  31.     return handler;
  32. }
  33. /** takes answered requests and decrements the repeat count and
  34.  *  updates the requests to the next to-do varbind in the list */
  35. void
  36. netsnmp_bulk_to_next_fix_requests(netsnmp_request_info *requests)
  37. {
  38.     netsnmp_request_info *request;
  39.     /*
  40.      * update the varbinds for the next request series 
  41.      */
  42.     for (request = requests; request; request = request->next) {
  43.         if (request->repeat > 0 &&
  44.             request->requestvb->type != ASN_NULL &&
  45.             request->requestvb->type != ASN_PRIV_RETRY &&
  46.             request->requestvb->next_variable ) {
  47.             request->repeat--;
  48.             snmp_set_var_objid(request->requestvb->next_variable,
  49.                                request->requestvb->name,
  50.                                request->requestvb->name_length);
  51.             request->requestvb = request->requestvb->next_variable;
  52.             request->requestvb->type = ASN_PRIV_RETRY;
  53.         }
  54.     }
  55. }
  56. /** @internal Implements the bulk_to_next handler */
  57. int
  58. netsnmp_bulk_to_next_helper(netsnmp_mib_handler *handler,
  59.                             netsnmp_handler_registration *reginfo,
  60.                             netsnmp_agent_request_info *reqinfo,
  61.                             netsnmp_request_info *requests)
  62. {
  63.     int             ret = SNMP_ERR_NOERROR;
  64.     /*
  65.      * this code depends on AUTO_NEXT being set
  66.      */
  67.     netsnmp_assert(handler->flags & MIB_HANDLER_AUTO_NEXT);
  68.     /*
  69.      * don't do anything for any modes besides GETBULK. Just return, and
  70.      * the agent will call the next handler (AUTO_NEXT).
  71.      *
  72.      * for GETBULK, we munge the mode, call the next handler ourselves
  73.      * (setting AUTO_NEXT_OVERRRIDE so the agent knows what we did),
  74.      * restore the mode and fix up the requests.
  75.      */
  76.     if(MODE_GETBULK == reqinfo->mode) {
  77.         reqinfo->mode = MODE_GETNEXT;
  78.         ret =
  79.             netsnmp_call_next_handler(handler, reginfo, reqinfo, requests);
  80.         reqinfo->mode = MODE_GETBULK;
  81.         /*
  82.          * update the varbinds for the next request series 
  83.          */
  84.         netsnmp_bulk_to_next_fix_requests(requests);
  85.         /*
  86.          * let agent handler know that we've already called next handler
  87.          */
  88.         handler->flags |= MIB_HANDLER_AUTO_NEXT_OVERRIDE_ONCE;
  89.     }
  90.     return ret;
  91. }
  92. /** initializes the bulk_to_next helper which then registers a bulk_to_next
  93.  *  handler as a run-time injectable handler for configuration file
  94.  *  use.
  95.  */
  96. void
  97. netsnmp_init_bulk_to_next_helper(void)
  98. {
  99.     netsnmp_register_handler_by_name("bulk_to_next",
  100.                                      netsnmp_get_bulk_to_next_handler());
  101. }