diff options
Diffstat (limited to 'agent/helpers/scalar.c')
-rw-r--r-- | agent/helpers/scalar.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/agent/helpers/scalar.c b/agent/helpers/scalar.c new file mode 100644 index 0000000..42c66b4 --- /dev/null +++ b/agent/helpers/scalar.c @@ -0,0 +1,196 @@ +/* Portions of this file are subject to the following copyright(s). See + * the Net-SNMP's COPYING file for more details and other copyrights + * that may apply: + */ +/* + * Portions of this file are copyrighted by: + * Copyright © 2003 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms specified in the COPYING file + * distributed with the Net-SNMP package. + */ +#include <net-snmp/net-snmp-config.h> + +#include <stdlib.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/scalar.h> +#include <net-snmp/agent/instance.h> +#include <net-snmp/agent/serialize.h> +#include <net-snmp/agent/read_only.h> + +/** @defgroup scalar scalar + * Process scalars easily. + * @ingroup leaf + * @{ + */ + +/** + * Creates a scalar handler calling netsnmp_create_handler with a + * handler name defaulted to "scalar" and access method, + * netsnmp_scalar_helper_handler. + * + * @return Returns a pointer to a netsnmp_mib_handler struct which contains + * the handler's name and the access method + * + * @see netsnmp_get_scalar_handler + * @see netsnmp_register_scalar + */ +netsnmp_mib_handler * +netsnmp_get_scalar_handler(void) +{ + return netsnmp_create_handler("scalar", + netsnmp_scalar_helper_handler); +} + +/** + * This function registers a scalar helper handler. The registered OID, + * reginfo->rootoid, space is extended for the instance subid using + * realloc() but the reginfo->rootoid_len length is not extended just yet. + * .This function subsequently injects the instance, scalar, and serialize + * helper handlers before actually registering reginfo. + * + * Each handler is injected/pushed to the top of the handler chain list + * and will be processed last in first out, LIFO. + * + * @param reginfo a handler registration structure which could get created + * using netsnmp_create_handler_registration. Used to register + * a scalar helper handler. + * + * @return MIB_REGISTERED_OK is returned if the registration was a success. + * Failures are MIB_REGISTRATION_FAILURE and MIB_DUPLICATE_REGISTRATION. + * + * @see netsnmp_register_read_only_scalar + * @see netsnmp_get_scalar_handler + */ + +int +netsnmp_register_scalar(netsnmp_handler_registration *reginfo) +{ + /* + * Extend the registered OID with space for the instance subid + * (but don't extend the length just yet!) + */ + reginfo->rootoid = realloc(reginfo->rootoid, + (reginfo->rootoid_len+1) * sizeof(oid) ); + reginfo->rootoid[ reginfo->rootoid_len ] = 0; + + netsnmp_inject_handler(reginfo, netsnmp_get_instance_handler()); + netsnmp_inject_handler(reginfo, netsnmp_get_scalar_handler()); + return netsnmp_register_serialize(reginfo); +} + + +/** + * This function registers a read only scalar helper handler. This + * function is very similar to netsnmp_register_scalar the only addition + * is that the "read_only" handler is injected into the handler chain + * prior to injecting the serialize handler and registering reginfo. + * + * @param reginfo a handler registration structure which could get created + * using netsnmp_create_handler_registration. Used to register + * a read only scalar helper handler. + * + * @return MIB_REGISTERED_OK is returned if the registration was a success. + * Failures are MIB_REGISTRATION_FAILURE and MIB_DUPLICATE_REGISTRATION. + * + * @see netsnmp_register_scalar + * @see netsnmp_get_scalar_handler + * + */ + +int +netsnmp_register_read_only_scalar(netsnmp_handler_registration *reginfo) +{ + /* + * Extend the registered OID with space for the instance subid + * (but don't extend the length just yet!) + */ + reginfo->rootoid = realloc(reginfo->rootoid, + (reginfo->rootoid_len+1) * sizeof(oid) ); + reginfo->rootoid[ reginfo->rootoid_len ] = 0; + + netsnmp_inject_handler(reginfo, netsnmp_get_instance_handler()); + netsnmp_inject_handler(reginfo, netsnmp_get_scalar_handler()); + netsnmp_inject_handler(reginfo, netsnmp_get_read_only_handler()); + return netsnmp_register_serialize(reginfo); +} + + + +int +netsnmp_scalar_helper_handler(netsnmp_mib_handler *handler, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests) +{ + + netsnmp_variable_list *var = requests->requestvb; + + int ret, cmp; + int namelen; + + DEBUGMSGTL(("helper:scalar", "Got request:\n")); + namelen = SNMP_MIN(requests->requestvb->name_length, + reginfo->rootoid_len); + cmp = snmp_oid_compare(requests->requestvb->name, namelen, + reginfo->rootoid, reginfo->rootoid_len); + + DEBUGMSGTL(("helper:scalar", " oid:")); + DEBUGMSGOID(("helper:scalar", var->name, var->name_length)); + DEBUGMSG(("helper:scalar", "\n")); + + switch (reqinfo->mode) { + case MODE_GET: + if (cmp != 0) { + netsnmp_set_request_error(reqinfo, requests, + SNMP_NOSUCHOBJECT); + return SNMP_ERR_NOERROR; + } else { + reginfo->rootoid[reginfo->rootoid_len++] = 0; + ret = netsnmp_call_next_handler(handler, reginfo, reqinfo, + requests); + reginfo->rootoid_len--; + return ret; + } + break; + + case MODE_SET_RESERVE1: + case MODE_SET_RESERVE2: + case MODE_SET_ACTION: + case MODE_SET_COMMIT: + case MODE_SET_UNDO: + case MODE_SET_FREE: + if (cmp != 0) { + netsnmp_set_request_error(reqinfo, requests, + SNMP_ERR_NOCREATION); + return SNMP_ERR_NOERROR; + } else { + reginfo->rootoid[reginfo->rootoid_len++] = 0; + ret = netsnmp_call_next_handler(handler, reginfo, reqinfo, + requests); + reginfo->rootoid_len--; + return ret; + } + break; + + case MODE_GETNEXT: + reginfo->rootoid[reginfo->rootoid_len++] = 0; + ret = netsnmp_call_next_handler(handler, reginfo, reqinfo, requests); + reginfo->rootoid_len--; + return ret; + } + /* + * got here only if illegal mode found + */ + return SNMP_ERR_GENERR; +} + +/** @} + */ |