[Libosinfo] [libosinfo PATCH 2/3] media: Add installer to the media
Fabiano Fidêncio
fidencio at redhat.com
Wed Feb 6 15:54:07 UTC 2019
Having the installer tied to the OS is something that has been shown not
optimal, unfortunately.
An OS may have a few different medias and each media may support a
specific type of script or, even, not support an installer script at
all. With this in mind, let's have the installer scripts tied to the
medias themselves.
Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
osinfo/libosinfo.syms | 5 +++++
osinfo/osinfo_loader.c | 26 ++++++++++++++++++++++++++
osinfo/osinfo_media.c | 36 ++++++++++++++++++++++++++++++++++++
osinfo/osinfo_media.h | 2 ++
4 files changed, 69 insertions(+)
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 2a60689..dad0c3b 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -562,6 +562,11 @@ LIBOSINFO_1.3.0 {
osinfo_tree_has_treeinfo;
} LIBOSINFO_0.2.13;
+LIBOSINFO_1.4.0 {
+ osinfo_media_add_install_script;
+ osinfo_media_get_install_script_list;
+} LIBOSINFO_1.3.0;
+
/* Symbols in next release...
LIBOSINFO_0.0.2 {
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index a6f111c..95d4424 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -1192,6 +1192,32 @@ static OsinfoMedia *osinfo_loader_media(OsinfoLoader *loader,
g_free(nodes);
+ nnodes = osinfo_loader_nodeset("./installer/script", loader, ctxt, &nodes,
+ err);
+ if (error_is_set(err)) {
+ g_object_unref(media);
+ return NULL;
+ }
+
+ for (i = 0; i < nnodes; i++) {
+ OsinfoInstallScript *script;
+ gchar *scriptid;
+
+ scriptid = (gchar *)xmlGetProp(nodes[i], BAD_CAST "id");
+ if (scriptid == NULL) {
+ OSINFO_LOADER_SET_ERROR(err, _("Missing Media install script property"));
+ g_object_unref(media);
+ return NULL;
+ }
+
+ script = osinfo_loader_get_install_script(loader, scriptid);
+ xmlFree(scriptid);
+
+ osinfo_media_add_install_script(media, script);
+ }
+
+ g_free(nodes);
+
return media;
}
diff --git a/osinfo/osinfo_media.c b/osinfo/osinfo_media.c
index 6bd1f66..6720736 100644
--- a/osinfo/osinfo_media.c
+++ b/osinfo/osinfo_media.c
@@ -193,6 +193,7 @@ G_DEFINE_TYPE(OsinfoMedia, osinfo_media, OSINFO_TYPE_ENTITY);
struct _OsinfoMediaPrivate
{
GWeakRef os;
+ OsinfoInstallScriptList *scripts;
};
enum {
@@ -421,6 +422,10 @@ osinfo_media_set_property(GObject *object,
static void
osinfo_media_finalize(GObject *object)
{
+ OsinfoMedia *media = OSINFO_MEDIA(object);
+
+ g_object_unref(media->priv->scripts);
+
/* Chain up to the parent class */
G_OBJECT_CLASS(osinfo_media_parent_class)->finalize(object);
}
@@ -694,6 +699,7 @@ osinfo_media_init(OsinfoMedia *media)
{
media->priv = OSINFO_MEDIA_GET_PRIVATE(media);
g_weak_ref_init(&media->priv->os, NULL);
+ media->priv->scripts = osinfo_install_scriptlist_new();
}
OsinfoMedia *osinfo_media_new(const gchar *id,
@@ -1670,6 +1676,36 @@ gboolean osinfo_media_supports_installer_script(OsinfoMedia *media)
return ret;
}
+/**
+ * osinfo_media_add_install_script:
+ * @media: an #OsinfoMedia instance
+ * @script: an #OsinfoInstallScript instance
+ *
+ * Adds an @script to the specified @media
+ */
+void osinfo_media_add_install_script(OsinfoMedia *media, OsinfoInstallScript *script)
+{
+ g_return_if_fail(OSINFO_IS_MEDIA(media));
+
+ osinfo_list_add(OSINFO_LIST(media->priv->scripts), OSINFO_ENTITY(script));
+}
+
+/**
+ * osinfo_media_get_install_script_list:
+ * @media: an #OsinfoMedia instance
+ *
+ * Returns: (transfer full): a list of the install scripts for the specified media
+ */
+OsinfoInstallScriptList *osinfo_media_get_install_script_list(OsinfoMedia *media)
+{
+ OsinfoList *new_list;
+
+ g_return_val_if_fail(OSINFO_IS_MEDIA(media), NULL);
+ new_list = osinfo_list_new_copy(OSINFO_LIST(media->priv->scripts));
+
+ return OSINFO_INSTALL_SCRIPTLIST(new_list);
+}
+
/*
* Local variables:
* indent-tabs-mode: nil
diff --git a/osinfo/osinfo_media.h b/osinfo/osinfo_media.h
index 6adc4be..3cac587 100644
--- a/osinfo/osinfo_media.h
+++ b/osinfo/osinfo_media.h
@@ -145,6 +145,8 @@ gint osinfo_media_get_installer_reboots(OsinfoMedia *media);
gint64 osinfo_media_get_volume_size(OsinfoMedia *media);
gboolean osinfo_media_get_eject_after_install(OsinfoMedia *media);
gboolean osinfo_media_supports_installer_script(OsinfoMedia *media);
+void osinfo_media_add_install_script(OsinfoMedia *media, OsinfoInstallScript *install_script);
+OsinfoInstallScriptList *osinfo_media_get_install_script_list(OsinfoMedia *media);
#endif /* __OSINFO_MEDIA_H__ */
/*
--
2.20.1
More information about the Libosinfo
mailing list