summaryrefslogtreecommitdiff
path: root/agent/helpers/scalar.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/helpers/scalar.c')
-rw-r--r--agent/helpers/scalar.c196
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;
+}
+
+/** @}
+ */