[virt-tools-list] [libosinfo 3/6] API to indicate media is live and/or installer
Zeeshan Ali (Khattak)
zeeshanak at gnome.org
Thu Nov 24 15:19:00 UTC 2011
From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>
Add live and installer boolean getters to Media.
---
data/95-osinfo.rules.in | 6 ++++--
osinfo/libosinfo.syms | 2 ++
osinfo/osinfo_loader.c | 15 +++++++++++++++
osinfo/osinfo_media.c | 40 ++++++++++++++++++++++++++++++++++++++++
osinfo/osinfo_media.h | 4 ++++
tools/osinfo-detect.c | 25 +++++++++++++++++--------
6 files changed, 82 insertions(+), 10 deletions(-)
diff --git a/data/95-osinfo.rules.in b/data/95-osinfo.rules.in
index 8edcf5c..2d0defd 100644
--- a/data/95-osinfo.rules.in
+++ b/data/95-osinfo.rules.in
@@ -27,11 +27,13 @@ ACTION=="change", \
SUBSYSTEM=="block", \
ENV{ID_FS_TYPE}!="iso9660", \
OSINFO_BOOTABLE="", \
- OSINFO_INSTALLER=""
+ OSINFO_INSTALLER="" \
+ OSINFO_LIVE=""
ACTION=="change", \
SUBSYSTEM=="block", \
ENV{ID_FS_TYPE}!="udf", \
OSINFO_BOOTABLE="", \
- OSINFO_INSTALLER=""
+ OSINFO_INSTALLER="" \
+ OSINFO_LIVE=""
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 5b4113e..f1411f7 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -157,6 +157,8 @@ LIBOSINFO_0.0.1 {
osinfo_media_get_publisher_id;
osinfo_media_get_kernel_path;
osinfo_media_get_initrd_path;
+ osinfo_media_get_installer;
+ osinfo_media_get_live;
osinfo_medialist_get_type;
osinfo_medialist_new;
osinfo_medialist_new_copy;
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 8a3de6a..79cc815 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -489,6 +489,8 @@ static OsinfoMedia *osinfo_loader_media (OsinfoLoader *loader,
guint i;
gchar *arch = (gchar *)xmlGetProp(root, BAD_CAST "arch");
+ xmlChar *live = xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_LIVE);
+ xmlChar *installer = xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_INSTALLER);
const gchar *const keys[] = {
OSINFO_MEDIA_PROP_URL,
OSINFO_MEDIA_PROP_KERNEL,
@@ -499,6 +501,19 @@ static OsinfoMedia *osinfo_loader_media (OsinfoLoader *loader,
OsinfoMedia *media = osinfo_media_new(id, arch);
osinfo_loader_entity(loader, OSINFO_ENTITY(media), keys, ctxt, root, err);
+ if (live) {
+ osinfo_entity_set_param(OSINFO_ENTITY(media),
+ OSINFO_MEDIA_PROP_LIVE,
+ (gchar *)live);
+ xmlFree(live);
+ }
+
+ if (installer) {
+ osinfo_entity_set_param(OSINFO_ENTITY(media),
+ OSINFO_MEDIA_PROP_INSTALLER,
+ (gchar *)installer);
+ xmlFree(installer);
+ }
gint nnodes = osinfo_loader_nodeset("./iso/*", ctxt, &nodes, err);
if (*err)
diff --git a/osinfo/osinfo_media.c b/osinfo/osinfo_media.c
index 6c98ba7..ff5b597 100644
--- a/osinfo/osinfo_media.c
+++ b/osinfo/osinfo_media.c
@@ -577,6 +577,46 @@ const gchar *osinfo_media_get_initrd_path(OsinfoMedia *media)
OSINFO_MEDIA_PROP_INITRD);
}
+static gboolean get_param_as_bool (OsinfoMedia *media,
+ const char *key,
+ gboolean default_value)
+{
+ const gchar *value;
+
+ value = osinfo_entity_get_param_value(OSINFO_ENTITY(media), key);
+ if (value == NULL)
+ return default_value;
+
+ return (g_strcmp0 ("true", value) == 0 ||
+ g_strcmp0 ("yes", value) == 0);
+}
+
+/**
+ * osinfo_media_get_installer:
+ * @media: a #OsinfoMedia instance
+ *
+ * Whether @media provides a installer for an OS.
+ *
+ * Returns: #TRUE if media is installer, #FALSE otherwise
+ */
+gboolean osinfo_media_get_installer(OsinfoMedia *media)
+{
+ return get_param_as_bool (media, OSINFO_MEDIA_PROP_INSTALLER, TRUE);
+}
+
+/**
+ * osinfo_media_get_live:
+ * @media: a #OsinfoMedia instance
+ *
+ * Whether @media can boot directly an OS without any installations.
+ *
+ * Returns: #TRUE if media is live, #FALSE otherwise
+ */
+gboolean osinfo_media_get_live(OsinfoMedia *media)
+{
+ return get_param_as_bool (media, OSINFO_MEDIA_PROP_LIVE, FALSE);
+}
+
/*
* Local variables:
* indent-tabs-mode: nil
diff --git a/osinfo/osinfo_media.h b/osinfo/osinfo_media.h
index 4a82025..6b15861 100644
--- a/osinfo/osinfo_media.h
+++ b/osinfo/osinfo_media.h
@@ -77,6 +77,8 @@ typedef struct _OsinfoMediaPrivate OsinfoMediaPrivate;
#define OSINFO_MEDIA_PROP_PUBLISHER_ID "publisher-id"
#define OSINFO_MEDIA_PROP_KERNEL "kernel"
#define OSINFO_MEDIA_PROP_INITRD "initrd"
+#define OSINFO_MEDIA_PROP_LIVE "live"
+#define OSINFO_MEDIA_PROP_INSTALLER "installer"
/* object */
struct _OsinfoMedia
@@ -118,6 +120,8 @@ const gchar *osinfo_media_get_system_id(OsinfoMedia *media);
const gchar *osinfo_media_get_publisher_id(OsinfoMedia *media);
const gchar *osinfo_media_get_kernel_path(OsinfoMedia *media);
const gchar *osinfo_media_get_initrd_path(OsinfoMedia *media);
+gboolean osinfo_media_get_installer(OsinfoMedia *media);
+gboolean osinfo_media_get_live(OsinfoMedia *media);
#endif /* __OSINFO_MEDIA_H__ */
/*
diff --git a/tools/osinfo-detect.c b/tools/osinfo-detect.c
index 0051cf4..750f98f 100644
--- a/tools/osinfo-detect.c
+++ b/tools/osinfo-detect.c
@@ -79,17 +79,26 @@ static void print_bootable(gboolean bootable)
g_print("Media is not bootable.\n");
}
-static void print_os(OsinfoOs *os)
+static void print_os(OsinfoOs *os, OsinfoMedia *media)
{
if (os == NULL)
return;
- if (format == OUTPUT_FORMAT_ENV)
- g_print("OSINFO_INSTALLER=%s\n",
- osinfo_entity_get_id(OSINFO_ENTITY(os)));
- else
- g_print("Media is an installer for OS '%s'\n",
- osinfo_product_get_name(OSINFO_PRODUCT(os)));
+ if (format == OUTPUT_FORMAT_ENV) {
+ const gchar *id = osinfo_entity_get_id(OSINFO_ENTITY(os));
+
+ if (osinfo_media_get_installer (media))
+ g_print("OSINFO_INSTALLER=%s\n", id);
+ if (osinfo_media_get_live (media))
+ g_print("OSINFO_LIVE=%s\n", id);
+ } else {
+ const gchar *name = osinfo_product_get_name(OSINFO_PRODUCT(os));
+
+ if (osinfo_media_get_installer (media))
+ g_print("Media is an installer for OS '%s'\n", name);
+ if (osinfo_media_get_live (media))
+ g_print("Media is live media for OS '%s'\n", name);
+ }
}
gint main(gint argc, gchar **argv)
@@ -148,7 +157,7 @@ gint main(gint argc, gchar **argv)
db = osinfo_loader_get_db(loader);
os = osinfo_db_guess_os_from_media(db, media, &matched_media);
- print_os(os);
+ print_os(os, matched_media);
EXIT:
g_clear_error(&error);
--
1.7.7.1
More information about the virt-tools-list
mailing list