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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #include <sys/types.h>
  3. #include <net-snmp/net-snmp-includes.h>
  4. #include <net-snmp/agent/net-snmp-agent-includes.h>
  5. #include <net-snmp/agent/multiplexer.h>
  6. #if HAVE_DMALLOC_H
  7. #include <dmalloc.h>
  8. #endif
  9. /** @defgroup multiplexer multiplexer: splits mode requests into calls to different handlers.
  10.  *  @ingroup utilities
  11.  * The multiplexer helper lets you split the calling chain depending
  12.  * on the calling mode (get vs getnext vs set).  Useful if you want
  13.  * different routines to handle different aspects of SNMP requests,
  14.  * which is very common for GET vs SET type actions.
  15.  *
  16.  * Functionally:
  17.  *
  18.  * -# GET requests call the get_method
  19.  * -# GETNEXT requests call the getnext_method, or if not present, the
  20.  *    get_method.
  21.  * -# GETBULK requests call the getbulk_method, or if not present, the
  22.  *    getnext_method, or if even that isn't present the get_method.
  23.  * -# SET requests call the set_method, or if not present return a
  24.  *    SNMP_ERR_NOTWRITABLE error.
  25.  *  @{
  26.  */
  27. /** returns a multiplixer handler given a netsnmp_mib_handler_methods structure of subhandlers.
  28.  */
  29. netsnmp_mib_handler *
  30. netsnmp_get_multiplexer_handler(netsnmp_mib_handler_methods *req)
  31. {
  32.     netsnmp_mib_handler *ret = NULL;
  33.     if (!req) {
  34.         snmp_log(LOG_INFO,
  35.                  "netsnmp_get_multiplexer_handler(NULL) calledn");
  36.         return NULL;
  37.     }
  38.     ret =
  39.         netsnmp_create_handler("multiplexer",
  40.                                netsnmp_multiplexer_helper_handler);
  41.     if (ret) {
  42.         ret->myvoid = (void *) req;
  43.     }
  44.     return ret;
  45. }
  46. /** implements the multiplexer helper */
  47. int
  48. netsnmp_multiplexer_helper_handler(netsnmp_mib_handler *handler,
  49.                                    netsnmp_handler_registration *reginfo,
  50.                                    netsnmp_agent_request_info *reqinfo,
  51.                                    netsnmp_request_info *requests)
  52. {
  53.     netsnmp_mib_handler_methods *methods;
  54.     if (!handler->myvoid) {
  55.         snmp_log(LOG_INFO, "improperly registered multiplexer foundn");
  56.         return SNMP_ERR_GENERR;
  57.     }
  58.     methods = (netsnmp_mib_handler_methods *) handler->myvoid;
  59.     switch (reqinfo->mode) {
  60.     case MODE_GETBULK:
  61.         handler = methods->getbulk_handler;
  62.         if (handler)
  63.             break;
  64.         /* Deliberate fallthrough to use GetNext handler */
  65.     case MODE_GETNEXT:
  66.         handler = methods->getnext_handler;
  67.         if (handler)
  68.             break;
  69.         /* Deliberate fallthrough to use Get handler */
  70.     case MODE_GET:
  71.         handler = methods->get_handler;
  72.         if (!handler) {
  73.             netsnmp_set_all_requests_error(reqinfo, requests,
  74.                                            SNMP_NOSUCHOBJECT);
  75.         }
  76.         break;
  77.     case MODE_SET_RESERVE1:
  78.     case MODE_SET_RESERVE2:
  79.     case MODE_SET_ACTION:
  80.     case MODE_SET_COMMIT:
  81.     case MODE_SET_FREE:
  82.     case MODE_SET_UNDO:
  83.         handler = methods->set_handler;
  84.         if (!handler) {
  85.             netsnmp_set_all_requests_error(reqinfo, requests,
  86.                                            SNMP_ERR_NOTWRITABLE);
  87.             return SNMP_ERR_NOERROR;
  88.         }
  89.         break;
  90.         /*
  91.          * XXX: process SETs specially, and possibly others 
  92.          */
  93.     default:
  94.         snmp_log(LOG_ERR, "unsupported mode for multiplexer: %dn",
  95.                  reqinfo->mode);
  96.         return SNMP_ERR_GENERR;
  97.     }
  98.     if (!handler) {
  99.         snmp_log(LOG_ERR,
  100.                  "No handler enabled for mode %d in multiplexern",
  101.                  reqinfo->mode);
  102.         return SNMP_ERR_GENERR;
  103.     }
  104.     return netsnmp_call_handler(handler, reginfo, reqinfo, requests);
  105. }