--- osinfo/libosinfo.syms | 1 + osinfo/osinfo_db.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ osinfo/osinfo_db.h | 2 ++ osinfo/osinfo_media.c | 5 +++- test/test-isodetect.c | 10 ++++---- tools/osinfo-detect.c | 13 ++++++---- 6 files changed, 91 insertions(+), 11 deletions(-) diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms index c5ab005..8d1e27a 100644 --- a/osinfo/libosinfo.syms +++ b/osinfo/libosinfo.syms @@ -386,6 +386,7 @@ LIBOSINFO_0.2.3 { osinfo_db_add_datamap; osinfo_db_get_datamap; osinfo_db_get_datamap_list; + osinfo_db_identify_media; osinfo_install_config_new_for_script; osinfo_install_config_get_valid_params; diff --git a/osinfo/osinfo_db.c b/osinfo/osinfo_db.c index dcda2fe..eea8d12 100644 --- a/osinfo/osinfo_db.c +++ b/osinfo/osinfo_db.c @@ -527,6 +527,77 @@ OsinfoOs *osinfo_db_guess_os_from_media(OsinfoDb *db, return ret; } +static void fill_media (OsinfoMedia *media, OsinfoMedia *matched_media, OsinfoOs *os) +{ + gboolean is_installer; + gboolean is_live; + gint reboots; + const gchar *kernel_path; + const gchar *initrd_path; + const gchar *arch; + const gchar *url; + + arch = osinfo_media_get_architecture(matched_media); + if (arch != NULL) + g_object_set(G_OBJECT(media), "architecture", arch, NULL); + url = osinfo_media_get_url(matched_media); + if (url != NULL) + g_object_set(G_OBJECT(media), "url", url, NULL); + + kernel_path = osinfo_media_get_kernel_path(matched_media); + if (kernel_path != NULL) + g_object_set(G_OBJECT(media), "kernel_path", kernel_path, NULL); + + initrd_path = osinfo_media_get_initrd_path(matched_media); + if (initrd_path != NULL) + g_object_set(G_OBJECT(media), "initrd_path", initrd_path, NULL); + is_installer = osinfo_media_get_installer(matched_media); + is_live = osinfo_media_get_live(matched_media); + g_object_set(G_OBJECT(media), + "installer", is_installer, + "live", is_live, + NULL); + if (is_installer) { + reboots = osinfo_media_get_installer_reboots(matched_media); + g_object_set(G_OBJECT(media), "installer-reboots", reboots, NULL); + } + if (os != NULL) + osinfo_media_set_os(media, os); +} + +/** + * osinfo_db_identify_media: + * @db: a #OsinfoDb database + * @media: the installation media + * data + * + * Try to match the @media created using osinfo_media_create_from_location() + * with a media description from @db. If found, @media will be filled with + * the corresponding information stored in @db. In particular, after a call + * to osinfo_media_create_from_location(), if the media could be + * identified, its OsinfoMedia::os property will be set. + * + * Returns: (transfer none): TRUE if @media was found in @db, FALSE + * otherwise + */ +gboolean osinfo_db_identify_media(OsinfoDb *db, OsinfoMedia *media) +{ + OsinfoMedia *matched_media; + OsinfoOs *matched_os; + + g_return_val_if_fail(OSINFO_IS_MEDIA(media), FALSE); + g_return_val_if_fail(OSINFO_IS_DB(db), FALSE); + + matched_os = osinfo_db_guess_os_from_media(db, media, &matched_media); + if (matched_os == NULL) { + return FALSE; + } + + fill_media(media, matched_media, matched_os); + + return TRUE; +} + /** * osinfo_db_guess_os_from_tree: diff --git a/osinfo/osinfo_db.h b/osinfo/osinfo_db.h index 824a224..09a58f0 100644 --- a/osinfo/osinfo_db.h +++ b/osinfo/osinfo_db.h @@ -103,6 +103,8 @@ void osinfo_db_add_install_script(OsinfoDb *db, OsinfoInstallScript *script); OsinfoOs *osinfo_db_guess_os_from_media(OsinfoDb *db, OsinfoMedia *media, OsinfoMedia **matched_media); +gboolean osinfo_db_identify_media(OsinfoDb *db, + OsinfoMedia *media); OsinfoOs *osinfo_db_guess_os_from_tree(OsinfoDb *db, OsinfoTree *tree, diff --git a/osinfo/osinfo_media.c b/osinfo/osinfo_media.c index e073ff6..7654cf7 100644 --- a/osinfo/osinfo_media.c +++ b/osinfo/osinfo_media.c @@ -504,7 +504,10 @@ osinfo_media_class_init (OsinfoMediaClass *klass) /** * OsinfoMedia::os: * - * Os information for the current media. + * Os information for the current media. For media stored in an + * #OsinfoDB, it will be filled when the database is loaded, otherwise + * the property will be filled after a successful call to + * osinfo_db_identify_media(). */ pspec = g_param_spec_object ("os", "Os", diff --git a/test/test-isodetect.c b/test/test-isodetect.c index 9033b32..f627300 100644 --- a/test/test-isodetect.c +++ b/test/test-isodetect.c @@ -252,18 +252,18 @@ static void test_one(const gchar *vendor) tmp = isos; while (tmp) { struct ISOInfo *info = tmp->data; - OsinfoMedia *media = NULL; - OsinfoOs *os = osinfo_db_guess_os_from_media(db, - info->media, - &media); + gboolean matched = osinfo_db_identify_media(db, info->media); + OsinfoOs *os; - fail_unless(os != NULL, "ISO %s was not matched by OS %s", + fail_unless(matched, "ISO %s was not matched by OS %s", info->filename, info->shortid); + g_object_get(info->media, "os", &os, NULL); const gchar *shortid = osinfo_product_get_short_id(OSINFO_PRODUCT(os)); fail_unless(g_str_equal(shortid, info->shortid), "ISO %s matched OS %s instead of expected %s", info->filename, shortid, info->shortid); + g_object_unref(G_OBJECT(os)); tmp = tmp->next; } diff --git a/tools/osinfo-detect.c b/tools/osinfo-detect.c index 60aabba..0caa4ca 100644 --- a/tools/osinfo-detect.c +++ b/tools/osinfo-detect.c @@ -118,8 +118,11 @@ static void print_bootable(gboolean bootable) g_print(_("Media is not bootable.\n")); } -static void print_os_media(OsinfoOs *os, OsinfoMedia *media) +static void print_media(OsinfoMedia *media) { + OsinfoOs *os; + + g_object_get(G_OBJECT(media), "os", &os, NULL); if (os == NULL) return; @@ -140,6 +143,7 @@ static void print_os_media(OsinfoOs *os, OsinfoMedia *media) if (osinfo_media_get_live (media)) g_print(_("Media is live media for OS '%s'\n"), name); } + g_object_unref(os); } static void print_os_tree(OsinfoOs *os, OsinfoTree *tree, OsinfoTree *matched_tree) @@ -182,7 +186,6 @@ gint main(gint argc, gchar **argv) GError *error = NULL; OsinfoLoader *loader = NULL; OsinfoDb *db = NULL; - OsinfoOs *os = NULL; gint ret = 0; setlocale(LC_ALL, ""); @@ -227,7 +230,6 @@ gint main(gint argc, gchar **argv) if (type == URL_TYPE_MEDIA) { OsinfoMedia *media = NULL; - OsinfoMedia *matched_media = NULL; media = osinfo_media_create_from_location(argv[1], NULL, &error); if (error != NULL) { if (error->code != OSINFO_MEDIA_ERROR_NOT_BOOTABLE) { @@ -241,9 +243,10 @@ gint main(gint argc, gchar **argv) } else { print_bootable(TRUE); } - os = osinfo_db_guess_os_from_media(db, media, &matched_media); - print_os_media(os, matched_media); + osinfo_db_identify_media(db, media); + print_media(media); } else if (type == URL_TYPE_TREE) { + OsinfoOs *os = NULL; OsinfoTree *tree = NULL; OsinfoTree *matched_tree = NULL; tree = osinfo_tree_create_from_location(argv[1], NULL, &error); -- 1.8.0.1 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list