00001 #include <net-snmp/net-snmp-config.h>
00002
00003 #include <sys/types.h>
00004
00005 #include <net-snmp/net-snmp-includes.h>
00006 #include <net-snmp/agent/net-snmp-agent-includes.h>
00007
00008 #include <net-snmp/agent/multiplexer.h>
00009
00032 netsnmp_mib_handler *
00033 netsnmp_get_multiplexer_handler(netsnmp_mib_handler_methods *req)
00034 {
00035 netsnmp_mib_handler *ret = NULL;
00036
00037 if (!req) {
00038 snmp_log(LOG_INFO,
00039 "netsnmp_get_multiplexer_handler(NULL) called\n");
00040 return NULL;
00041 }
00042
00043 ret =
00044 netsnmp_create_handler("multiplexer",
00045 netsnmp_multiplexer_helper_handler);
00046 if (ret) {
00047 ret->myvoid = (void *) req;
00048 }
00049 return ret;
00050 }
00051
00053 int
00054 netsnmp_multiplexer_helper_handler(netsnmp_mib_handler *handler,
00055 netsnmp_handler_registration *reginfo,
00056 netsnmp_agent_request_info *reqinfo,
00057 netsnmp_request_info *requests)
00058 {
00059
00060 netsnmp_mib_handler_methods *methods;
00061
00062 if (!handler->myvoid) {
00063 snmp_log(LOG_INFO, "improperly registered multiplexer found\n");
00064 return SNMP_ERR_GENERR;
00065 }
00066
00067 methods = (netsnmp_mib_handler_methods *) handler->myvoid;
00068
00069 switch (reqinfo->mode) {
00070 case MODE_GETBULK:
00071 handler = methods->getbulk_handler;
00072 if (handler)
00073 break;
00074
00075 case MODE_GETNEXT:
00076 handler = methods->getnext_handler;
00077 if (handler)
00078 break;
00079
00080 case MODE_GET:
00081 handler = methods->get_handler;
00082 if (!handler) {
00083 netsnmp_request_set_error_all(requests, SNMP_NOSUCHOBJECT);
00084 }
00085 break;
00086
00087 case MODE_SET_RESERVE1:
00088 case MODE_SET_RESERVE2:
00089 case MODE_SET_ACTION:
00090 case MODE_SET_COMMIT:
00091 case MODE_SET_FREE:
00092 case MODE_SET_UNDO:
00093 handler = methods->set_handler;
00094 if (!handler) {
00095 netsnmp_request_set_error_all(requests, SNMP_ERR_NOTWRITABLE);
00096 return SNMP_ERR_NOERROR;
00097 }
00098 break;
00099
00100
00101
00102
00103 default:
00104 snmp_log(LOG_ERR, "unsupported mode for multiplexer: %d\n",
00105 reqinfo->mode);
00106 return SNMP_ERR_GENERR;
00107 }
00108 if (!handler) {
00109 snmp_log(LOG_ERR,
00110 "No handler enabled for mode %d in multiplexer\n",
00111 reqinfo->mode);
00112 return SNMP_ERR_GENERR;
00113 }
00114 return netsnmp_call_handler(handler, reginfo, reqinfo, requests);
00115 }