blob: 54785d5561640f61b2a86964a9afb35a8696b687 [file] [log] [blame]
#include <net-snmp/net-snmp-config.h>
#if HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/agent/bulk_to_next.h>
#if HAVE_DMALLOC_H
#include <dmalloc.h>
#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());
}