00001 #include <net-snmp/net-snmp-config.h>
00002
00003 #if HAVE_STRING_H
00004 #include <string.h>
00005 #else
00006 #include <strings.h>
00007 #endif
00008
00009 #include <net-snmp/net-snmp-includes.h>
00010 #include <net-snmp/agent/net-snmp-agent-includes.h>
00011
00012 #include <net-snmp/agent/bulk_to_next.h>
00013
00026 netsnmp_mib_handler *
00027 netsnmp_get_bulk_to_next_handler(void)
00028 {
00029 netsnmp_mib_handler *handler =
00030 netsnmp_create_handler("bulk_to_next",
00031 netsnmp_bulk_to_next_helper);
00032
00033 if (NULL != handler)
00034 handler->flags |= MIB_HANDLER_AUTO_NEXT;
00035
00036 return handler;
00037 }
00038
00041 void
00042 netsnmp_bulk_to_next_fix_requests(netsnmp_request_info *requests)
00043 {
00044 netsnmp_request_info *request;
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 for (request = requests; request; request = request->next) {
00055 if (request->repeat > 0 &&
00056 request->requestvb->type != ASN_NULL &&
00057 request->requestvb->type != ASN_PRIV_RETRY &&
00058 (snmp_oid_compare(request->requestvb->name,
00059 request->requestvb->name_length,
00060 request->range_end,
00061 request->range_end_len) < 0) &&
00062 request->requestvb->next_variable ) {
00063 request->repeat--;
00064 snmp_set_var_objid(request->requestvb->next_variable,
00065 request->requestvb->name,
00066 request->requestvb->name_length);
00067 request->requestvb = request->requestvb->next_variable;
00068 request->requestvb->type = ASN_PRIV_RETRY;
00069
00070
00071
00072
00073 if (2 == request->inclusive)
00074 request->inclusive = 0;
00075 }
00076 }
00077 }
00078
00080 int
00081 netsnmp_bulk_to_next_helper(netsnmp_mib_handler *handler,
00082 netsnmp_handler_registration *reginfo,
00083 netsnmp_agent_request_info *reqinfo,
00084 netsnmp_request_info *requests)
00085 {
00086
00087 int ret = SNMP_ERR_NOERROR;
00088
00089
00090
00091
00092 netsnmp_assert(handler->flags & MIB_HANDLER_AUTO_NEXT);
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 if(MODE_GETBULK == reqinfo->mode) {
00103
00104 DEBUGIF("bulk_to_next") {
00105 netsnmp_request_info *req = requests;
00106 while(req) {
00107 DEBUGMSGTL(("bulk_to_next", "Got request: "));
00108 DEBUGMSGOID(("bulk_to_next", req->requestvb->name,
00109 req->requestvb->name_length));
00110 DEBUGMSG(("bulk_to_next", "\n"));
00111 req = req->next;
00112 }
00113 }
00114
00115 reqinfo->mode = MODE_GETNEXT;
00116 ret =
00117 netsnmp_call_next_handler(handler, reginfo, reqinfo, requests);
00118 reqinfo->mode = MODE_GETBULK;
00119
00120
00121
00122
00123 netsnmp_bulk_to_next_fix_requests(requests);
00124
00125
00126
00127
00128 handler->flags |= MIB_HANDLER_AUTO_NEXT_OVERRIDE_ONCE;
00129 }
00130
00131 return ret;
00132 }
00133
00138 void
00139 netsnmp_init_bulk_to_next_helper(void)
00140 {
00141 netsnmp_register_handler_by_name("bulk_to_next",
00142 netsnmp_get_bulk_to_next_handler());
00143 }