diff options
Diffstat (limited to 'osinfo')
-rw-r--r-- | osinfo/osinfo_db.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/osinfo/osinfo_db.c b/osinfo/osinfo_db.c index 3781712..efe7ba5 100644 --- a/osinfo/osinfo_db.c +++ b/osinfo/osinfo_db.c @@ -596,29 +596,34 @@ static gboolean compare_media(OsinfoMedia *media, return FALSE; } -static OsinfoOs * +static gboolean osinfo_db_guess_os_from_media_internal(OsinfoDb *db, OsinfoMedia *media, + OsinfoOs **matched_os, OsinfoMedia **matched_media) { - OsinfoOs *ret = NULL; GList *oss = NULL; GList *fallback_oss = NULL; + gboolean matched = FALSE; - g_return_val_if_fail(OSINFO_IS_DB(db), NULL); - g_return_val_if_fail(media != NULL, NULL); + if (matched_os) + *matched_os = NULL; + + g_return_val_if_fail(OSINFO_IS_DB(db), FALSE); + g_return_val_if_fail(media != NULL, FALSE); oss = osinfo_list_get_elements(OSINFO_LIST(db->priv->oses)); - if (compare_media(media, oss, &ret, matched_media, &fallback_oss)) - goto end; + if (compare_media(media, oss, matched_os, matched_media, &fallback_oss)) + matched = TRUE; - compare_media(media, fallback_oss, &ret, matched_media, NULL); + if (!matched && + compare_media(media, fallback_oss, matched_os, matched_media, NULL)) + matched = TRUE; - end: g_list_free(oss); g_list_free(fallback_oss); - return ret; + return matched; } /** @@ -637,7 +642,12 @@ OsinfoOs *osinfo_db_guess_os_from_media(OsinfoDb *db, OsinfoMedia *media, OsinfoMedia **matched_media) { - return osinfo_db_guess_os_from_media_internal(db, media, matched_media); + OsinfoOs *ret; + + if (!osinfo_db_guess_os_from_media_internal(db, media, &ret, matched_media)) + return NULL; + + return ret; } static void fill_media(OsinfoDb *db, OsinfoMedia *media, @@ -744,9 +754,9 @@ gboolean osinfo_db_identify_media(OsinfoDb *db, OsinfoMedia *media) 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_internal(db, media, - &matched_media); - if (matched_os == NULL) { + if (!osinfo_db_guess_os_from_media_internal(db, media, + &matched_os, + &matched_media)) { return FALSE; } |