From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> In addition to loading the system files from /usr/share/libosinfo/db, it will now also load files in /etc/libosinfo/db/ (if it exists) and $HOME/.local/config/libosinfo/db/ (if it exists) New APIs are also added to allow an application to load a subset of these locations, if they don't like the default behaviour --- osinfo/Makefile.am | 4 +- osinfo/osinfo_loader.c | 96 ++++++++++++++++++++++++++++++++++++++++++----- osinfo/osinfo_loader.h | 3 + 3 files changed, 91 insertions(+), 12 deletions(-) diff --git a/osinfo/Makefile.am b/osinfo/Makefile.am index 23447d1..66ce999 100644 --- a/osinfo/Makefile.am +++ b/osinfo/Makefile.am @@ -28,7 +28,9 @@ libosinfo_1_0_la_CFLAGS = \ $(LIBXML_CFLAGS) \ $(GOBJECT_CFLAGS) \ $(GIO_CFLAGS) \ - -DPKG_DATA_DIR='"$(pkgdatadir)"' + -DPKG_DATA_DIR='"$(pkgdatadir)"' \ + -DSYS_CONF_DIR='"$(sysconfdir)"' \ + $(NULL) libosinfo_1_0_la_LDFLAGS = \ $(COVERAGE_LDFLAGS) \ diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c index b009323..e61f3c1 100644 --- a/osinfo/osinfo_loader.c +++ b/osinfo/osinfo_loader.c @@ -1106,6 +1106,7 @@ osinfo_loader_process_file_reg_pci(OsinfoLoader *loader, static void osinfo_loader_process_file(OsinfoLoader *loader, GFile *file, + gboolean ignoreMissing, GError **err); static void @@ -1148,7 +1149,7 @@ osinfo_loader_process_file_dir(OsinfoLoader *loader, const gchar *name = g_file_info_get_name(child); GFile *ent = g_file_get_child(file, name); - osinfo_loader_process_file(loader, ent, err); + osinfo_loader_process_file(loader, ent, FALSE, err); g_object_unref(ent); g_object_unref(child); @@ -1163,17 +1164,26 @@ osinfo_loader_process_file_dir(OsinfoLoader *loader, static void osinfo_loader_process_file(OsinfoLoader *loader, GFile *file, + gboolean ignoreMissing, GError **err) { + GError *error = NULL; GFileInfo *info = g_file_query_info(file, "standard::*", G_FILE_QUERY_INFO_NONE, NULL, - err); + &error); const char *name; - if (error_is_set(err)) + if (error) { + if (ignoreMissing && + (error->code == G_IO_ERROR_NOT_FOUND)) { + g_error_free(error); + return; + } + g_propagate_error(err, error); return; + } name = g_file_info_get_name(info); @@ -1183,15 +1193,15 @@ osinfo_loader_process_file(OsinfoLoader *loader, switch (type) { case G_FILE_TYPE_REGULAR: if (g_str_has_suffix(name, ".xml")) - osinfo_loader_process_file_reg_xml(loader, file, info, err); + osinfo_loader_process_file_reg_xml(loader, file, info, &error); else if (strcmp(name, "usb.ids") == 0) - osinfo_loader_process_file_reg_usb(loader, file, info, err); + osinfo_loader_process_file_reg_usb(loader, file, info, &error); else if (strcmp(name, "pci.ids") == 0) - osinfo_loader_process_file_reg_pci(loader, file, info, err); + osinfo_loader_process_file_reg_pci(loader, file, info, &error); break; case G_FILE_TYPE_DIRECTORY: - osinfo_loader_process_file_dir(loader, file, info, err); + osinfo_loader_process_file_dir(loader, file, info, &error); break; default: @@ -1199,6 +1209,9 @@ osinfo_loader_process_file(OsinfoLoader *loader, } g_object_unref(info); + + if (error) + g_propagate_error(err, error); } /** @@ -1234,6 +1247,7 @@ void osinfo_loader_process_path(OsinfoLoader *loader, GFile *file = g_file_new_for_path(path); osinfo_loader_process_file(loader, file, + FALSE, err); g_object_unref(file); } @@ -1256,19 +1270,45 @@ void osinfo_loader_process_uri(OsinfoLoader *loader, GFile *file = g_file_new_for_uri(uri); osinfo_loader_process_file(loader, file, + FALSE, err); g_object_unref(file); } + +void osinfo_loader_process_default_path(OsinfoLoader *loader, GError **err) +{ + GError *error = NULL; + + osinfo_loader_process_system_path(loader, &error); + if (error) + goto error; + + osinfo_loader_process_local_path(loader, &error); + if (error) + goto error; + + osinfo_loader_process_user_path(loader, &error); + if (error) + goto error; + + return; + + error: + g_print("Fail\n"); + g_propagate_error(err, error); + return; +} + /** - * osinfo_loader_process_default_path: + * osinfo_loader_process_system_path: * @loader: the loader object * @err: (out): filled with error information upon failure * - * Loads data from the default path. + * Loads data from the default paths. */ -void osinfo_loader_process_default_path(OsinfoLoader *loader, - GError **err) +void osinfo_loader_process_system_path(OsinfoLoader *loader, + GError **err) { GFile *file; gchar *dbdir; @@ -1281,8 +1321,42 @@ void osinfo_loader_process_default_path(OsinfoLoader *loader, file = g_file_new_for_path(dbdir); osinfo_loader_process_file(loader, file, + FALSE, + err); + g_object_unref(file); +} + +void osinfo_loader_process_local_path(OsinfoLoader *loader, GError **err) +{ + GFile *file; + gchar *dbdir; + gchar *path = SYS_CONF_DIR; + + dbdir = g_strdup_printf("%s/libosinfo/db", path); + + file = g_file_new_for_path(dbdir); + osinfo_loader_process_file(loader, + file, + TRUE, + err); + g_object_unref(file); + g_free(dbdir); +} + +void osinfo_loader_process_user_path(OsinfoLoader *loader, GError **err) +{ + GFile *file; + gchar *dbdir; + const gchar *configdir = g_get_user_config_dir(); + + dbdir = g_strdup_printf("%s/libosinfo/db", configdir); + file = g_file_new_for_path(dbdir); + osinfo_loader_process_file(loader, + file, + TRUE, err); g_object_unref(file); + g_free(dbdir); } /* diff --git a/osinfo/osinfo_loader.h b/osinfo/osinfo_loader.h index 7bf6a57..0706f41 100644 --- a/osinfo/osinfo_loader.h +++ b/osinfo/osinfo_loader.h @@ -72,6 +72,9 @@ OsinfoDb *osinfo_loader_get_db(OsinfoLoader *loader); void osinfo_loader_process_path(OsinfoLoader *loader, const gchar *path, GError **err); void osinfo_loader_process_uri(OsinfoLoader *loader, const gchar *uri, GError **err); void osinfo_loader_process_default_path(OsinfoLoader *loader, GError **err); +void osinfo_loader_process_system_path(OsinfoLoader *loader, GError **err); +void osinfo_loader_process_local_path(OsinfoLoader *loader, GError **err); +void osinfo_loader_process_user_path(OsinfoLoader *loader, GError **err); #endif /* __OSINFO_LOADER_H__ */ -- 1.7.7.6