In some cases telling OS version is redundant as ISO image
with specified OS is passed some arguments later as disk.
Don't require --os then.
---
examples/virtxml.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 71 insertions(+), 5 deletions(-)
diff --git a/examples/virtxml.c b/examples/virtxml.c
index 468bc2a..131c462 100644
--- a/examples/virtxml.c
+++ b/examples/virtxml.c
@@ -253,6 +253,67 @@ add_iface(gpointer data,
}
}
+static OsinfoOs *
+guess_os_from_disk(GList *disk_str_list)
+{
+ OsinfoOs *ret = NULL;
+ GList *tmp = g_list_first(disk_str_list);
+ OsinfoLoader *loader = osinfo_loader_new();
+ GError *error = NULL;
+ OsinfoDb *db;
+
+ osinfo_loader_process_default_path(loader, &error);
+ if (error) {
+ print_error("Error loading libosinfo data: %s", error->message);
+ goto cleanup;
+ }
+
+ db = osinfo_loader_get_db(loader);
+
+ while (tmp) {
+ char *path = (char *) tmp->data;
+ char *sep = strchr(path, ',');
+ OsinfoMedia *media = NULL;
+ OsinfoMedia *matched_media = NULL;
+
+ if (sep) {
+ path = g_strndup(path, sep-path);
+ }
+
+ media = osinfo_media_create_from_location(path, NULL, &error);
+ if (error) {
+ /* don't report error but silently continue to next disk */
+ print_error("%s", error->message);
+ g_error_free(error);
+ error = NULL;
+ tmp = g_list_next(tmp);
+ continue;
+ }
+
+ ret = osinfo_db_guess_os_from_media(db, media, &matched_media);
+
+ if (sep)
+ g_free(path);
+
+ if (ret) {
+ g_object_ref(ret);
+ break;
+ }
+
+ tmp = g_list_next(tmp);
+ }
+
+cleanup:
+ g_clear_object(&loader);
+ return ret;
+}
+
+static OsinfoPlatform *
+guess_platform_from_connect(virConnectPtr conn)
+{
+ return NULL;
+}
+
#define CHECK_ERROR \
if (error) { \
print_error("%s", error->message); \
@@ -371,10 +432,6 @@ main(int argc, char *argv[])
}
}
- if (!os_str) {
- print_error("Operating system was not specified");
- exit(EXIT_FAILURE);
- }
if (!platform_str) {
print_error("Platform was not specified");
exit(EXIT_FAILURE);
@@ -391,10 +448,19 @@ main(int argc, char *argv[])
goto cleanup;
}
- os = osinfo_os_new(os_str);
platform = osinfo_platform_new(platform_str);
caps = gvir_config_capabilities_new_from_xml(caps_str, NULL);
+ if (os_str) {
+ os = osinfo_os_new(os_str);
+ } else {
+ os = guess_os_from_disk(disk_str_list);
+ if (!os) {
+ print_error("Operating system was not specified and could not be
guessed");
+ exit(EXIT_FAILURE);
+ }
+ }
+
domain = gvir_designer_domain_new(os, platform, caps);
gvir_designer_domain_setup_machine(domain, &error);
--
1.7.8.6