[Libosinfo] [libosinfo PATCH v3 07/12] loader: Make loader aware of Guest Features
Fabiano Fidêncio
fidencio at redhat.com
Fri Jan 18 12:30:42 UTC 2019
Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
osinfo/osinfo_loader.c | 71 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 8f7b2bf..b4bad60 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -39,6 +39,7 @@
#include "osinfo_install_script_private.h"
#include "osinfo_device_driver_private.h"
#include "osinfo_resources_private.h"
+#include "osinfo_feature_private.h"
#ifndef USB_IDS
#define USB_IDS PKG_DATA_DIR "/usb.ids"
@@ -658,6 +659,54 @@ static void osinfo_loader_device_link(OsinfoLoader *loader,
g_free(related);
}
+static void osinfo_loader_features(OsinfoOs *os,
+ OsinfoLoader *loader,
+ xmlXPathContextPtr ctxt,
+ xmlNodePtr root,
+ const gchar *id,
+ GError **err)
+{
+ gchar *arch;
+ xmlNodePtr *nodes = NULL;
+ int nnodes, i;
+
+ arch = (gchar *)xmlGetProp(root, BAD_CAST "arch");
+
+ nnodes = osinfo_loader_nodeset("./feature", loader, ctxt, &nodes, err);
+ if (error_is_set(err))
+ goto cleanup;
+
+ for (i = 0; i < nnodes; i++) {
+ gchar *supported;
+ gchar *feature_id;
+ const gchar *name;
+
+ if (nodes[i]->children->type != XML_TEXT_NODE ||
+ !g_str_equal((const gchar *)nodes[i]->name, "feature"))
+ continue;
+
+ name = (const gchar *)nodes[i]->children->content;
+ feature_id = g_strdup_printf("%s:%u", id, i);
+ OsinfoFeature *feature = osinfo_feature_new(feature_id, name, arch);
+ osinfo_os_add_feature(os, feature);
+
+ supported = (gchar *)xmlGetProp(nodes[i],
+ BAD_CAST OSINFO_FEATURE_PROP_SUPPORTED);
+ if (supported != NULL) {
+ osinfo_feature_set_supported(feature,
+ g_str_equal(supported, "true") ? TRUE: FALSE);
+ g_free(supported);
+ }
+
+ g_free(feature_id);
+ g_object_unref(feature);
+ }
+
+ cleanup:
+ g_free(nodes);
+ g_free(arch);
+}
+
static void osinfo_loader_product_relshp(OsinfoLoader *loader,
OsinfoProduct *product,
OsinfoProductRelationship relshp,
@@ -1515,6 +1564,28 @@ static void osinfo_loader_os(OsinfoLoader *loader,
if (error_is_set(err))
goto cleanup;
+ nnodes = osinfo_loader_nodeset("./features", loader, ctxt, &nodes, err);
+ if (error_is_set(err))
+ goto cleanup;
+
+ for (i = 0; i < nnodes; i++) {
+ xmlNodePtr saved;
+ gchar *features_id;
+
+ saved = ctxt->node;
+ ctxt->node = nodes[i];
+ features_id = g_strdup_printf("%s:%u", id, i);
+ osinfo_loader_features(os, loader, ctxt, nodes[i], features_id, err);
+ g_free(features_id);
+
+ ctxt->node = saved;
+
+ if (error_is_set(err))
+ goto cleanup;
+ }
+
+ g_free(nodes);
+
nnodes = osinfo_loader_nodeset("./media", loader, ctxt, &nodes, err);
if (error_is_set(err))
goto cleanup;
--
2.19.2
More information about the Libosinfo
mailing list