virtxml was doing its own loading of the libosinfo database, and gvir_designer_init() was loading it a second time. By adding a gvir_designer_get_osinfo_db() method, virtxml can use the same libosinfo database as the rest of libvirt-designer. --- examples/virtxml.c | 51 ++++++++++++---------------- libvirt-designer/libvirt-designer-domain.c | 9 ++++- libvirt-designer/libvirt-designer-internal.h | 3 -- libvirt-designer/libvirt-designer-main.c | 39 ++++++++++++++++----- libvirt-designer/libvirt-designer-main.h | 3 ++ libvirt-designer/libvirt-designer.sym | 1 + 6 files changed, 64 insertions(+), 42 deletions(-) diff --git a/examples/virtxml.c b/examples/virtxml.c index a68843d..8137c5a 100644 --- a/examples/virtxml.c +++ b/examples/virtxml.c @@ -35,7 +35,6 @@ GList *disk_str_list = NULL; GList *iface_str_list = NULL; -OsinfoDb *db = NULL; #define print_error(...) \ print_error_impl(__FUNCTION__, __LINE__, __VA_ARGS__) @@ -59,28 +58,6 @@ print_error_impl(const char *funcname, fprintf(stderr,"\n"); } -static gboolean -load_osinfo(void) -{ - GError *err = NULL; - gboolean ret = FALSE; - OsinfoLoader *loader = NULL; - - loader = osinfo_loader_new(); - osinfo_loader_process_default_path(loader, &err); - if (err) { - print_error("Unable to load default libosinfo DB: %s", err->message); - g_clear_error(&err); - } - - db = osinfo_loader_get_db(loader); - g_object_ref(db); - ret = TRUE; - - g_object_unref(loader); - return ret; -} - static gint entity_compare(gconstpointer a, gconstpointer b) { @@ -97,12 +74,14 @@ print_oses(const gchar *option_name, gpointer data, GError **error) { + OsinfoDb *db; OsinfoOsList *list = NULL; GList *oses = NULL; GList *os_iter; int ret = EXIT_FAILURE; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) goto cleanup; printf(" Operating System ID\n" @@ -137,12 +116,14 @@ print_platforms(const gchar *option_name, gpointer data, GError **error) { + OsinfoDb *db; OsinfoPlatformList *list = NULL; GList *platforms = NULL; GList *platform_iter; int ret = EXIT_FAILURE; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) goto cleanup; printf(" Platform ID\n" @@ -313,9 +294,11 @@ find_entity_by_short_id(OsinfoList *ent_list, static OsinfoOs * find_os(const gchar *os_str) { + OsinfoDb *db; OsinfoOs *ret = NULL; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) return NULL; ret = osinfo_db_get_os(db, os_str); @@ -326,11 +309,13 @@ find_os(const gchar *os_str) static OsinfoOs * find_os_by_short_id(const char *short_id) { + OsinfoDb *db; OsinfoOs *ret = NULL; OsinfoOsList *oses = NULL; OsinfoEntity *found = NULL; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) return NULL; oses = osinfo_db_get_os_list(db); @@ -353,10 +338,12 @@ cleanup: static OsinfoOs * guess_os_from_disk(GList *disk_list) { + OsinfoDb *db; OsinfoOs *ret = NULL; GList *list_it = NULL; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) return NULL; for (list_it = disk_list; list_it; list_it = list_it->next) { @@ -387,9 +374,11 @@ guess_os_from_disk(GList *disk_list) static OsinfoPlatform * find_platform(const char *platform_str) { + OsinfoDb *db; OsinfoPlatform *ret = NULL; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) return NULL; ret = osinfo_db_get_platform(db, platform_str); @@ -400,11 +389,13 @@ find_platform(const char *platform_str) static OsinfoPlatform * find_platform_by_short_id(const char *short_id) { + OsinfoDb *db; OsinfoPlatform *ret = NULL; OsinfoPlatformList *platforms = NULL; OsinfoEntity *found = NULL; - if (!db && !load_osinfo()) + db = gvir_designer_get_osinfo_db(); + if (!db) goto cleanup; platforms = osinfo_db_get_platform_list(db); diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c index 3e31bd1..862daba 100644 --- a/libvirt-designer/libvirt-designer-domain.c +++ b/libvirt-designer/libvirt-designer-domain.c @@ -721,7 +721,14 @@ gvir_designer_domain_get_preferred_device(GVirDesignerDomain *design, OsinfoDeviceLink *dev_link = NULL; if (!deployment) { - priv->deployment = deployment = osinfo_db_find_deployment(osinfo_db, + OsinfoDb *db; + db = gvir_designer_get_osinfo_db(); + if (!db) { + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, + "Unable to find any deployment in libosinfo database"); + goto cleanup; + } + priv->deployment = deployment = osinfo_db_find_deployment(db, priv->os, priv->platform); if (!deployment) { diff --git a/libvirt-designer/libvirt-designer-internal.h b/libvirt-designer/libvirt-designer-internal.h index bbef922..e95edfc 100644 --- a/libvirt-designer/libvirt-designer-internal.h +++ b/libvirt-designer/libvirt-designer-internal.h @@ -24,7 +24,4 @@ #ifndef __LIBVIRT_DESIGNER_INTERNAL_H__ #define __LIBVIRT_DESIGNER_INTERNAL_H__ -extern OsinfoLoader *osinfo_loader; -extern OsinfoDb *osinfo_db; - #endif /* __LIBVIRT_DESIGNER_INTERNAL_H__ */ diff --git a/libvirt-designer/libvirt-designer-main.c b/libvirt-designer/libvirt-designer-main.c index 5c70b57..7d730bf 100644 --- a/libvirt-designer/libvirt-designer-main.c +++ b/libvirt-designer/libvirt-designer-main.c @@ -30,7 +30,6 @@ #include <libvirt-designer/libvirt-designer.h> #include <libvirt-gconfig/libvirt-gconfig.h> -OsinfoLoader *osinfo_loader = NULL; OsinfoDb *osinfo_db = NULL; /** @@ -58,6 +57,20 @@ static void gvir_log_handler(const gchar *log_domain G_GNUC_UNUSED, } +static void gvir_designer_load_osinfo(void) +{ + /* Init libosinfo and load databases from default paths */ + /* XXX maybe we want to let users tell a different path via + * env variable or argv */ + OsinfoLoader *osinfo_loader = NULL; + + osinfo_loader = osinfo_loader_new(); + osinfo_loader_process_default_path(osinfo_loader, NULL); + + osinfo_db = g_object_ref(osinfo_loader_get_db(osinfo_loader)); + g_object_unref(G_OBJECT(osinfo_loader)); +} + /** * gvir_designer_init_check: * @argc: (inout): pointer to application's argc @@ -85,13 +98,23 @@ gboolean gvir_designer_init_check(int *argc, gvir_log_handler, NULL); #endif - /* Init libosinfo and load databases from default paths */ - /* XXX maybe we want to let users tell a different path via - * env variable or argv */ - osinfo_loader = osinfo_loader_new(); - osinfo_loader_process_default_path(osinfo_loader, NULL); - - osinfo_db = osinfo_loader_get_db(osinfo_loader); + gvir_designer_load_osinfo(); return TRUE; } + +/** + * gvir_designer_get_osinfo_db: + * + * Retrieves the global #OsinfoDb database + * + * Returns: (transfer none): an #OsinfoDb database owned by + * libvirt-designer which must not be unreferenced + */ +OsinfoDb *gvir_designer_get_osinfo_db(void) +{ + if (osinfo_db == NULL) + gvir_designer_load_osinfo(); + + return osinfo_db; +} diff --git a/libvirt-designer/libvirt-designer-main.h b/libvirt-designer/libvirt-designer-main.h index 2500ef7..9b874a4 100644 --- a/libvirt-designer/libvirt-designer-main.h +++ b/libvirt-designer/libvirt-designer-main.h @@ -24,6 +24,8 @@ #error "Only <libvirt-gdesigner/libvirt-gdesigner.h> can be included directly." #endif +#include <osinfo/osinfo.h> + #ifndef __LIBVIRT_DESIGNER_MAIN_H__ #define __LIBVIRT_DESIGNER_MAIN_H__ @@ -34,6 +36,7 @@ void gvir_designer_init(int *argc, gboolean gvir_designer_init_check(int *argc, char ***argv, GError **err); +OsinfoDb *gvir_designer_get_osinfo_db(void); G_END_DECLS diff --git a/libvirt-designer/libvirt-designer.sym b/libvirt-designer/libvirt-designer.sym index 79db09f..6f63abc 100644 --- a/libvirt-designer/libvirt-designer.sym +++ b/libvirt-designer/libvirt-designer.sym @@ -2,6 +2,7 @@ LIBVIRT_DESIGNER_0.0.1 { global: gvir_designer_init; gvir_designer_init_check; + gvir_designer_get_osinfo_db; gvir_designer_domain_new; gvir_designer_domain_get_type; -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list