#include #if HAVE_STRING_H #include #else #include #endif #include #include #include #if HAVE_DMALLOC_H #include #endif /** @defgroup bulk_to_next bulk_to_next: convert GETBULK requests into GETNEXT requests for the handler. * The only purpose of this handler is to convert a GETBULK request * to a GETNEXT request. It is inserted into handler chains where * the handler has not set the HANDLER_CAN_GETBULK flag. * @ingroup handler * @{ */ /** returns a bulk_to_next handler that can be injected into a given * handler chain. */ netsnmp_mib_handler * netsnmp_get_bulk_to_next_handler(void) { return netsnmp_create_handler("bulk_to_next", netsnmp_bulk_to_next_helper); } /** takes answered requests and decrements the repeat count and * updates the requests to the next to-do varbind in the list */ void netsnmp_bulk_to_next_fix_requests(netsnmp_request_info *requests) { netsnmp_request_info *request; /* * update the varbinds for the next request series */ for (request = requests; request; request = request->next) { if (request->repeat > 0 && request->requestvb->type != ASN_NULL && request->requestvb->type != ASN_PRIV_RETRY) { request->repeat--; snmp_set_var_objid(request->requestvb->next_variable, request->requestvb->name, request->requestvb->name_length); request->requestvb = request->requestvb->next_variable; request->requestvb->type = ASN_PRIV_RETRY; } } } /** @internal Implements the bulk_to_next handler */ int netsnmp_bulk_to_next_helper(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { int ret; switch (reqinfo->mode) { case MODE_GETBULK: reqinfo->mode = MODE_GETNEXT; ret = netsnmp_call_next_handler(handler, reginfo, reqinfo, requests); reqinfo->mode = MODE_GETBULK; /* * update the varbinds for the next request series */ netsnmp_bulk_to_next_fix_requests(requests); return ret; default: return netsnmp_call_next_handler(handler, reginfo, reqinfo, requests); } return SNMP_ERR_GENERR; /* should never get here */ } /** initializes the bulk_to_next helper which then registers a bulk_to_next * handler as a run-time injectable handler for configuration file * use. */ void netsnmp_init_bulk_to_next_helper(void) { netsnmp_register_handler_by_name("bulk_to_next", netsnmp_get_bulk_to_next_handler()); }