summaryrefslogtreecommitdiff
path: root/src/osinfo_hypervisor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osinfo_hypervisor.c')
-rw-r--r--src/osinfo_hypervisor.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/osinfo_hypervisor.c b/src/osinfo_hypervisor.c
new file mode 100644
index 0000000..30eb445
--- /dev/null
+++ b/src/osinfo_hypervisor.c
@@ -0,0 +1,122 @@
+#include <osinfo.h>
+
+G_DEFINE_TYPE (OsinfoHypervisor, osinfo_hypervisor, OSINFO_TYPE_ENTITY);
+
+#define OSINFO_HYPERVISOR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OSINFO_TYPE_HYPERVISOR, OsinfoHypervisorPrivate))
+
+static void osinfo_hypervisor_finalize (GObject *object);
+
+static void
+osinfo_hypervisor_finalize (GObject *object)
+{
+ OsinfoHypervisor *self = OSINFO_HYPERVISOR (object);
+
+ g_tree_destroy (self->priv->sections);
+ g_tree_destroy (self->priv->sectionsAsList);
+
+ /* Chain up to the parent class */
+ G_OBJECT_CLASS (osinfo_hypervisor_parent_class)->finalize (object);
+}
+
+/* Init functions */
+static void
+osinfo_hypervisor_class_init (OsinfoHypervisorClass *klass)
+{
+ GObjectClass *g_klass = G_OBJECT_CLASS (klass);
+
+ g_klass->finalize = osinfo_hypervisor_finalize;
+ g_type_class_add_private (klass, sizeof (OsinfoHypervisorPrivate));
+}
+
+static void
+osinfo_hypervisor_init (OsinfoHypervisor *self)
+{
+ OsinfoHypervisorPrivate *priv;
+ self->priv = priv = OSINFO_HYPERVISOR_GET_PRIVATE(self);
+
+ self->priv->sections = g_tree_new_full(__osinfoStringCompare, NULL, g_free, __osinfoFreeDeviceSection);
+ self->priv->sectionsAsList = g_tree_new_full(__osinfoStringCompare, NULL, g_free, __osinfoFreePtrArray);
+}
+
+int __osinfoAddDeviceToSectionHv(OsinfoHypervisor *self, gchar *section, gchar *id, gchar *driver)
+{
+ if( !OSINFO_IS_HYPERVISOR(self) || !section || !id || !driver)
+ return -EINVAL;
+
+ return __osinfoAddDeviceToSection(self->priv->sections, self->priv->sectionsAsList, section, id, driver);
+}
+
+void __osinfoClearDeviceSectionHv(OsinfoHypervisor *self, gchar *section)
+{
+ if (!OSINFO_IS_HYPERVISOR(self) || !section)
+ return;
+
+ __osinfoClearDeviceSection(self->priv->sections, self->priv->sectionsAsList, section);
+}
+
+GPtrArray *osinfoGetHypervisorDeviceTypes(OsinfoHypervisor *self, GError **err)
+{
+ if (!__osinfoCheckGErrorParamValid(err))
+ return NULL;
+
+ if (!OSINFO_IS_HYPERVISOR(self)) {
+ g_set_error_literal(err, g_quark_from_static_string("libosinfo"), -EINVAL, OSINFO_OBJ_NOT_HV);
+ return NULL;
+ }
+
+ GPtrArray *deviceTypes = g_ptr_array_sized_new(g_tree_nnodes(self->priv->sections));
+ if (!deviceTypes) {
+ g_set_error_literal(err, g_quark_from_static_string("libosinfo"), -ENOMEM, OSINFO_NO_MEM);
+ return NULL;
+ }
+
+ // For each key in our tree of device sections, dup and add to the array
+ struct __osinfoPtrArrayErr arrayErr = {deviceTypes, 0};
+ g_tree_foreach(self->priv->sections, __osinfoGetKeys, &arrayErr);
+ return deviceTypes;
+}
+
+OsinfoDeviceList *osinfoGetHypervisorDevicesByType(OsinfoHypervisor *self, gchar *devType, OsinfoFilter *filter, GError **err)
+{
+ if (!__osinfoCheckGErrorParamValid(err))
+ return NULL;
+
+ if (!OSINFO_IS_HYPERVISOR(self)) {
+ g_set_error_literal(err, g_quark_from_static_string("libosinfo"), -EINVAL, OSINFO_OBJ_NOT_HV);
+ return NULL;
+ }
+
+ if (filter && !OSINFO_IS_FILTER(filter)) {
+ g_set_error_literal(err, g_quark_from_static_string("libosinfo"), -EINVAL, OSINFO_OBJ_NOT_FILTER);
+ return NULL;
+ }
+
+ if (!devType) {
+ g_set_error_literal(err, g_quark_from_static_string("libosinfo"), -EINVAL, OSINFO_NO_DEVTYPE);
+ return NULL;
+ }
+
+ // Create our device list
+ OsinfoDeviceList *newList = g_object_new(OSINFO_TYPE_DEVICELIST, NULL);
+ if (!newList) {
+ g_set_error_literal(err, g_quark_from_static_string("libosinfo"), -ENOMEM, OSINFO_NO_MEM);
+ return NULL;
+ }
+
+ // If section does not exist, return empty list
+ GPtrArray *sectionList = NULL;
+ sectionList = g_tree_lookup(self->priv->sectionsAsList, devType);
+ if (!sectionList)
+ return newList;
+
+ // For each device in section list, apply filter. If filter passes, add device to list.
+ int i;
+ struct __osinfoDeviceLink *deviceLink;
+ for (i = 0; i < sectionList->len; i++) {
+ deviceLink = g_ptr_array_index(sectionList, i);
+ if (__osinfoDevicePassesFilter(filter, deviceLink->dev))
+ __osinfoListAdd(OSINFO_LIST (newList), OSINFO_ENTITY (deviceLink->dev));
+ }
+
+ return newList;
+}