summaryrefslogtreecommitdiff
path: root/agent/mibgroup/host/data_access/swinst.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/host/data_access/swinst.c')
-rw-r--r--agent/mibgroup/host/data_access/swinst.c224
1 files changed, 224 insertions, 0 deletions
diff --git a/agent/mibgroup/host/data_access/swinst.c b/agent/mibgroup/host/data_access/swinst.c
new file mode 100644
index 0000000..3ef05e9
--- /dev/null
+++ b/agent/mibgroup/host/data_access/swinst.c
@@ -0,0 +1,224 @@
+/*
+ * swinst.c : hrSWInstalledTable data access
+ */
+/*
+ * Copyright (C) 2007 Apple, 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 <net-snmp/net-snmp-features.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include <net-snmp/data_access/swinst.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+netsnmp_feature_child_of(software_installed, libnetsnmpmibs)
+
+netsnmp_feature_child_of(swinst_entry_remove, netsnmp_unused)
+
+/* ---------------------------------------------------------------------
+ */
+
+static void netsnmp_swinst_entry_free_cb(netsnmp_swinst_entry *, void *);
+
+extern void netsnmp_swinst_arch_init(void);
+extern void netsnmp_swinst_arch_shutdown(void);
+extern int netsnmp_swinst_arch_load(netsnmp_container *, u_int);
+
+void init_swinst( void )
+{
+ static int initialized = 0;
+
+ DEBUGMSGTL(("swinst", "init called\n"));
+
+ if (initialized)
+ return; /* already initialized */
+
+
+ /*
+ * call arch init code
+ */
+ netsnmp_swinst_arch_init();
+}
+
+void shutdown_swinst( void )
+{
+ DEBUGMSGTL(("swinst", "shutdown called\n"));
+
+ netsnmp_swinst_arch_shutdown();
+}
+
+/* ---------------------------------------------------------------------
+ */
+
+/*
+ * load a container with installed software. If user_container is NULL,
+ * a new container will be allocated and returned, and the caller
+ * is responsible for releasing the allocated memory when done.
+ *
+ * if flags contains NETSNMP_SWINST_ALL_OR_NONE and any error occurs,
+ * the container will be completely cleared.
+ */
+netsnmp_container *
+netsnmp_swinst_container_load( netsnmp_container *user_container, int flags )
+{
+ netsnmp_container *container = user_container;
+ int arch_rc;
+
+ DEBUGMSGTL(("swinst:container", "load\n"));
+
+ /*
+ * create the container, if needed
+ */
+ if (NULL == container) {
+ container = netsnmp_container_find("swinst:table_container");
+ if (NULL == container)
+ return NULL;
+ }
+ if (NULL == container->container_name)
+ container->container_name = strdup("swinst container");
+
+ /*
+ * call the arch specific code to load the container
+ */
+ arch_rc = netsnmp_swinst_arch_load( container, flags );
+ if (arch_rc && (flags & NETSNMP_SWINST_ALL_OR_NONE)) {
+ /*
+ * caller does not want a partial load, so empty the container.
+ * if we created the container, destroy it.
+ */
+ netsnmp_swinst_container_free_items(container);
+ if (container != user_container) {
+ netsnmp_swinst_container_free(container, flags);
+ }
+ }
+
+ return container;
+}
+
+void
+netsnmp_swinst_container_free(netsnmp_container *container, u_int free_flags)
+{
+ DEBUGMSGTL(("swinst:container", "free\n"));
+
+ if (NULL == container) {
+ snmp_log(LOG_ERR,
+ "invalid container for netsnmp_swinst_container_free\n");
+ return;
+ }
+
+ if(! (free_flags & NETSNMP_SWINST_DONT_FREE_ITEMS))
+ netsnmp_swinst_container_free_items(container);
+
+ CONTAINER_FREE(container);
+}
+
+/*
+ * free a swinst container
+ */
+void netsnmp_swinst_container_free_items(netsnmp_container *container)
+{
+ DEBUGMSGTL(("swinst:container", "free_items\n"));
+
+ if (NULL == container) {
+ snmp_log(LOG_ERR,
+ "invalid container for netsnmp_swinst_container_free_items\n");
+ return;
+ }
+
+ /*
+ * free all items.
+ */
+ CONTAINER_CLEAR(container,
+ (netsnmp_container_obj_func*)netsnmp_swinst_entry_free_cb,
+ NULL);
+}
+
+
+/* ---------------------------------------------------------------------
+ */
+
+/*
+ * create a new row in the table
+ */
+netsnmp_swinst_entry *
+netsnmp_swinst_entry_create(int32_t swIndex)
+{
+ netsnmp_swinst_entry *entry;
+
+ entry = SNMP_MALLOC_TYPEDEF(netsnmp_swinst_entry);
+ if (!entry)
+ return NULL;
+
+ entry->swIndex = swIndex;
+ entry->oid_index.len = 1;
+ entry->oid_index.oids = &entry->swIndex;
+
+ entry->swType = HRSWINSTALLEDTYPE_APPLICATION;
+
+ return entry;
+}
+
+/*
+ * free a row
+ */
+void
+netsnmp_swinst_entry_free(netsnmp_swinst_entry *entry)
+{
+ DEBUGMSGTL(("swinst:entry:free", "index %" NETSNMP_PRIo "u\n",
+ entry->swIndex));
+
+ free(entry);
+}
+
+/*
+ * free a row
+ */
+static void
+netsnmp_swinst_entry_free_cb(netsnmp_swinst_entry *entry, void *context)
+{
+ free(entry);
+}
+
+/*
+ * remove a row from the table
+ */
+#ifndef NETSNMP_FEATURE_REMOVE_SWINST_ENTRY_REMOVE
+void
+netsnmp_swinst_entry_remove(netsnmp_container * container,
+ netsnmp_swinst_entry *entry)
+{
+ DEBUGMSGTL(("swinst:container", "remove\n"));
+ if (!entry)
+ return; /* Nothing to remove */
+ CONTAINER_REMOVE(container, entry);
+}
+#endif /* NETSNMP_FEATURE_REMOVE_SWINST_ENTRY_REMOVE */
+
+/* ---------------------------------------------------------------------
+ */
+
+#ifdef TEST
+int main(int argc, char *argv[])
+{
+ const char *tokens = getenv("SNMP_DEBUG");
+
+ netsnmp_container_init_list();
+
+ /** swinst,verbose:swinst */
+ if (tokens)
+ debug_register_tokens(tokens);
+ else
+ debug_register_tokens("swinst");
+ snmp_set_do_debugging(1);
+
+ init_swinst();
+ netsnmp_swinst_container_load(NULL, 0);
+ shutdown_swinst();
+
+ return 0;
+}
+#endif