[Libosinfo] [PATCH v3 57/60] loader: rework handling of pci.ids and usb.ids
Christophe Fergeau
cfergeau at redhat.com
Fri Oct 16 10:38:48 UTC 2015
On Mon, Oct 12, 2015 at 06:11:18PM +0100, Daniel P. Berrange wrote:
> Currently we have the option to download pci.ids/usb.ids or
> symlink to the distro provided version given to configure.
>
> Change configure so that it searches for the files in a
> variety of expected locations. This ensures we always use
> the external files, in any modern Linux distro, without
> the user needing to give an arg. We look for them in
>
> /usr/share/hwdata/{pci.ids,usb.ids} (RHEL/Fedora)
> /usr/share/misc/{pci.ids,usb.ids} (Ubuntu/Debian/Gentoo)
> /usr/share/{pci.ids,usb.ids} (SLES/OpenSuse)
>
> Instead of loading the pci.ids/usb.ids files as part of
> the main database file enumeration process, explicitly
> load them from their expected location. This avoids the
> need to symlink the distro provided files into the database
> dir.
I would probably have split the configure.ac/.spec changes from the
OsinfoLoader changes, but fine with me either way, changes look good.
Christophe
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> configure.ac | 79 ++++++++++++++++++++++++++++-----
> data/Makefile.am | 32 ++++----------
> libosinfo.spec.in | 5 +--
> mingw-libosinfo.spec.in | 8 ++--
> osinfo/osinfo_loader.c | 114 ++++++++++++++++++++++++++++++++++--------------
> 5 files changed, 162 insertions(+), 76 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 465a16c..a7eaf26 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -135,25 +135,80 @@ fi
> AC_SUBST(COVERAGE_CFLAGS)
> AC_SUBST(COVERAGE_LDFLAGS)
>
> -# Path to the usb.ids file -- to know if we use one shipped with another
> -# package, or an internal file
> +
> +USB_ID_FILES="/usr/share/usb.ids /usr/share/misc/usb.ids /usr/share/hwdata/usb.ids"
> +
> AC_ARG_WITH(usb-ids-path,
> [AC_HELP_STRING([--with-usb-ids-path],
> - [Specify the path to usb.ids @<:@default=(internal)@:>@])],,
> - [with_usb_ids_path="\${usb_databasedir}/usb.ids"])
> + [Specify the path to usb.ids @<:@default=(internal)@:>@])])
> +
> +AC_MSG_CHECKING([location of usb.ids database])
> +local_usb_ids=0
> +if test -z "$with_usb_ids_path"
> +then
> + if test $host = $build
> + then
> + for FILE in $USB_ID_FILES
> + do
> + if test -f $FILE
> + then
> + with_usb_ids_path="$FILE"
> + break
> + fi
> + done
> + fi
> +
> + if test -z "$with_usb_ids_path"
> + then
> + local_usb_ids=1
> + fi
> +fi
> +AM_CONDITIONAL([LOCAL_USB_IDS], [test "$local_usb_ids" = "1"])
> +if test -n "$with_usb_ids_path"
> +then
> + AC_DEFINE_UNQUOTED([USB_IDS], ["$with_usb_ids_path"], ["location of usb.ids database"])
> + AC_MSG_RESULT([$with_usb_ids_path])
> +else
> + AC_MSG_RESULT([<built-in>])
> +fi
>
> -AM_CONDITIONAL(USE_INTERNAL_USB_IDS, test "x$with_usb_ids_path" = "x\${usb_databasedir}/usb.ids")
> -AC_SUBST([USB_IDS], ["$with_usb_ids_path"])
>
> -# Path to the pci.ids file -- to know if we use one shipped with another
> -# package, or an internal file
> +PCI_ID_FILES="/usr/share/pci.ids /usr/share/misc/pci.ids /usr/share/hwdata/pci.ids"
> +
> AC_ARG_WITH(pci-ids-path,
> [AC_HELP_STRING([--with-pci-ids-path],
> - [Specify the path to pci.ids @<:@default=(internal)@:>@])],,
> - [with_pci_ids_path="\${pci_databasedir}/pci.ids"])
> + [Specify the path to pci.ids @<:@default=(internal)@:>@])])
> +
> +AC_MSG_CHECKING([location of pci.ids database])
> +local_pci_ids=0
> +if test -z "$with_pci_ids_path"
> +then
> + if test $host = $build
> + then
> + for FILE in $PCI_ID_FILES
> + do
> + if test -f $FILE
> + then
> + with_pci_ids_path="$FILE"
> + break
> + fi
> + done
> + fi
> +
> + if test -z "$with_pci_ids_path"
> + then
> + local_pci_ids=1
> + fi
> +fi
> +AM_CONDITIONAL([LOCAL_PCI_IDS], [test "$local_pci_ids" = "1"])
> +if test -n "$with_pci_ids_path"
> +then
> + AC_DEFINE_UNQUOTED([PCI_IDS], ["$with_pci_ids_path"], ["location of pci.ids database"])
> + AC_MSG_RESULT([$with_pci_ids_path])
> +else
> + AC_MSG_RESULT([<built-in>])
> +fi
>
> -AM_CONDITIONAL(USE_INTERNAL_PCI_IDS, test "x$with_pci_ids_path" = "x\${pci_databasedir}/pci.ids")
> -AC_SUBST([PCI_IDS], ["$with_pci_ids_path"])
>
> # Setup GLIB_MKENUMS to use glib-mkenums even if GLib is uninstalled.
> GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
> diff --git a/data/Makefile.am b/data/Makefile.am
> index 2001b42..ff0e84f 100644
> --- a/data/Makefile.am
> +++ b/data/Makefile.am
> @@ -1,36 +1,20 @@
> -INSTALL_DATA_HOOK_DEPS =
>
> SUBDIRS = datamap device os platform install-script schemas
> -EXTRA_DIST = usb.ids pci.ids
> -CLEANFILES = usb.ids pci.ids
>
> -if USE_INTERNAL_USB_IDS
> +CLEANFILES =
> +
> +if LOCAL_USB_IDS
> usb_database_DATA = usb.ids
> -usb_databasedir = $(pkgdatadir)/db/
> +usb_databasedir = $(pkgdatadir)/
> usb.ids:
> -wget -q -O $@ http://www.linux-usb.org/usb.ids
> -else
> -usb_ids_install:
> - ($(MKDIR_P) $(DESTDIR)$(pkgdatadir)/db && \
> - cd $(DESTDIR)$(pkgdatadir)/db/ && \
> - rm -f usb.ids && \
> - $(LN_S) $(USB_IDS) usb.ids)
> -INSTALL_DATA_HOOK_DEPS += usb_ids_install
> +CLEANFILES += usb.ids
> endif
>
> -if USE_INTERNAL_PCI_IDS
> +if LOCAL_PCI_IDS
> pci_database_DATA = pci.ids
> -pci_databasedir = $(pkgdatadir)/db/
> +pci_databasedir = $(pkgdatadir)/
> pci.ids:
> -wget -q -O $@ http://pciids.sourceforge.net/v2.2/pci.ids
> -else
> -pci_ids_install:
> - ($(MKDIR_P) $(DESTDIR)$(pkgdatadir)/db && \
> - cd $(DESTDIR)$(pkgdatadir)/db/ && \
> - rm -f pci.ids && \
> - $(LN_S) $(PCI_IDS) pci.ids)
> -INSTALL_DATA_HOOK_DEPS += pci_ids_install
> +CLEANFILES += pci.ids
> endif
> -
> -
> -install-data-hook: $(INSTALL_DATA_HOOK_DEPS)
> diff --git a/libosinfo.spec.in b/libosinfo.spec.in
> index 8ef688a..0feed84 100644
> --- a/libosinfo.spec.in
> +++ b/libosinfo.spec.in
> @@ -28,6 +28,7 @@ BuildRequires: vala
> BuildRequires: vala-tools
> BuildRequires: libsoup-devel
> BuildRequires: /usr/bin/pod2man
> +BuildRequires: hwdata
> %if %{with_gir}
> BuildRequires: gobject-introspection-devel
> %endif
> @@ -74,7 +75,7 @@ This package provides the Vala bindings for libosinfo library.
> %define gir_arg --enable-introspection=no
> %endif
>
> -%configure %{gir_arg} --enable-vala=yes --with-usb-ids-path=/usr/share/hwdata/usb.ids --with-pci-ids-path=/usr/share/hwdata/pci.ids
> +%configure %{gir_arg} --enable-vala=yes
> %__make %{?_smp_mflags} V=1
>
> chmod a-x examples/*.js examples/*.py
> @@ -107,8 +108,6 @@ rm -fr %{buildroot}
> %dir %{_datadir}/libosinfo/
> %dir %{_datadir}/libosinfo/db/
> %dir %{_datadir}/libosinfo/schemas/
> -%{_datadir}/libosinfo/db/usb.ids
> -%{_datadir}/libosinfo/db/pci.ids
> %{_datadir}/libosinfo/db/datamap
> %{_datadir}/libosinfo/db/device
> %{_datadir}/libosinfo/db/os
> diff --git a/mingw-libosinfo.spec.in b/mingw-libosinfo.spec.in
> index 2529471..16c5699 100644
> --- a/mingw-libosinfo.spec.in
> +++ b/mingw-libosinfo.spec.in
> @@ -103,8 +103,8 @@ rm -rf $RPM_BUILD_ROOT%{mingw64_datadir}/gtk-doc
> %dir %{mingw32_datadir}/libosinfo
> %dir %{mingw32_datadir}/libosinfo/db
> %dir %{mingw32_datadir}/libosinfo/schemas
> -%{mingw32_datadir}/libosinfo/db/usb.ids
> -%{mingw32_datadir}/libosinfo/db/pci.ids
> +%{mingw32_datadir}/libosinfo/usb.ids
> +%{mingw32_datadir}/libosinfo/pci.ids
> %{mingw32_datadir}/libosinfo/db/datamap
> %{mingw32_datadir}/libosinfo/db/device
> %{mingw32_datadir}/libosinfo/db/os
> @@ -128,8 +128,8 @@ rm -rf $RPM_BUILD_ROOT%{mingw64_datadir}/gtk-doc
> %dir %{mingw64_datadir}/libosinfo
> %dir %{mingw64_datadir}/libosinfo/db
> %dir %{mingw64_datadir}/libosinfo/schemas
> -%{mingw64_datadir}/libosinfo/db/usb.ids
> -%{mingw64_datadir}/libosinfo/db/pci.ids
> +%{mingw64_datadir}/libosinfo/usb.ids
> +%{mingw64_datadir}/libosinfo/pci.ids
> %{mingw64_datadir}/libosinfo/db/datamap
> %{mingw64_datadir}/libosinfo/db/device
> %{mingw64_datadir}/libosinfo/db/os
> diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
> index c516c92..f7b841d 100644
> --- a/osinfo/osinfo_loader.c
> +++ b/osinfo/osinfo_loader.c
> @@ -38,6 +38,13 @@
> #include "osinfo_install_script_private.h"
> #include "osinfo_device_driver_private.h"
>
> +#ifndef USB_IDS
> +#define USB_IDS PKG_DATA_DIR "/usb.ids"
> +#endif
> +#ifndef PCI_IDS
> +#define PCI_IDS PKG_DATA_DIR "/pci.ids"
> +#endif
> +
> G_DEFINE_TYPE(OsinfoLoader, osinfo_loader, G_TYPE_OBJECT);
>
> #define OSINFO_LOADER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), OSINFO_TYPE_LOADER, OsinfoLoaderPrivate))
> @@ -1753,22 +1760,6 @@ osinfo_loader_process_file_reg_xml(OsinfoLoader *loader,
> }
>
>
> -static void
> -osinfo_loader_process_file(OsinfoLoader *loader,
> - GFile *file,
> - GError **err)
> -{
> - const gchar *name = g_file_get_basename(file);
> -
> - if (g_str_has_suffix(name, ".xml"))
> - osinfo_loader_process_file_reg_xml(loader, file, err);
> - else if (strcmp(name, "usb.ids") == 0)
> - osinfo_loader_process_file_reg_usb(loader, file, err);
> - else if (strcmp(name, "pci.ids") == 0)
> - osinfo_loader_process_file_reg_pci(loader, file, err);
> -}
> -
> -
> static GList *osinfo_loader_find_files(OsinfoLoader *loader,
> GFile *file,
> GError **err)
> @@ -1796,9 +1787,7 @@ static GList *osinfo_loader_find_files(OsinfoLoader *loader,
> GFileType type = g_file_info_get_attribute_uint32(child,
> G_FILE_ATTRIBUTE_STANDARD_TYPE);
> if (type == G_FILE_TYPE_REGULAR) {
> - if (g_str_has_suffix(name, ".xml") ||
> - g_str_equal(name, "usb.ids") ||
> - g_str_equal(name, "pci.ids"))
> + if (g_str_has_suffix(name, ".xml"))
> files = g_list_append(files, g_object_ref(ent));
> } else if (type == G_FILE_TYPE_DIRECTORY) {
> GList *subfiles = osinfo_loader_find_files(loader, ent, &error);
> @@ -1821,6 +1810,12 @@ static GList *osinfo_loader_find_files(OsinfoLoader *loader,
> }
>
>
> +typedef enum {
> + OSINFO_DATA_FORMAT_NATIVE,
> + OSINFO_DATA_FORMAT_PCI_IDS,
> + OSINFO_DATA_FORMAT_USB_IDS,
> +} OsinfoLoaderDataFormat;
> +
> static void osinfo_loader_process_list(OsinfoLoader *loader,
> GFile **dirs,
> GError **err)
> @@ -1830,24 +1825,39 @@ static void osinfo_loader_process_list(OsinfoLoader *loader,
> gpointer key, value;
>
> while (dirs && *dirs) {
> - GList *files = osinfo_loader_find_files(loader, *dirs, &lerr);
> - GList *tmp;
> - if (lerr) {
> - g_propagate_error(err, lerr);
> - return;
> - }
> + OsinfoLoaderDataFormat fmt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(*dirs), "data-format"));
>
> - tmp = files;
> - while (tmp) {
> - osinfo_loader_process_file(loader, tmp->data, &lerr);
> + switch (fmt) {
> + case OSINFO_DATA_FORMAT_NATIVE: {
> + GList *files = osinfo_loader_find_files(loader, *dirs, &lerr);
> + GList *tmp;
> if (lerr) {
> g_propagate_error(err, lerr);
> - break;
> + return;
> + }
> +
> + tmp = files;
> + while (tmp) {
> + osinfo_loader_process_file_reg_xml(loader, tmp->data, &lerr);
> + if (lerr) {
> + g_propagate_error(err, lerr);
> + break;
> + }
> + tmp = tmp->next;
> }
> - tmp = tmp->next;
> + g_list_foreach(files, (GFunc)g_object_unref, NULL);
> + g_list_free(files);
> +
> + } break;
> +
> + case OSINFO_DATA_FORMAT_PCI_IDS:
> + osinfo_loader_process_file_reg_pci(loader, *dirs, &lerr);
> + break;
> +
> + case OSINFO_DATA_FORMAT_USB_IDS:
> + osinfo_loader_process_file_reg_usb(loader, *dirs, &lerr);
> + break;
> }
> - g_list_foreach(files, (GFunc)g_object_unref, NULL);
> - g_list_free(files);
>
> if (lerr) {
> break;
> @@ -1898,6 +1908,8 @@ void osinfo_loader_process_path(OsinfoLoader *loader,
> g_file_new_for_path(path),
> NULL,
> };
> + g_object_set_data(G_OBJECT(dirs[0]), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_NATIVE));
> osinfo_loader_process_list(loader, dirs, err);
> g_object_unref(dirs[0]);
> }
> @@ -1921,11 +1933,31 @@ void osinfo_loader_process_uri(OsinfoLoader *loader,
> g_file_new_for_uri(uri),
> NULL,
> };
> + g_object_set_data(G_OBJECT(dirs[0]), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_NATIVE));
> osinfo_loader_process_list(loader, dirs, err);
> g_object_unref(dirs[0]);
> }
>
>
> +static GFile *osinfo_loader_get_pci_path(void)
> +{
> + GFile *ids = g_file_new_for_path(PCI_IDS);
> + g_object_set_data(G_OBJECT(ids), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_PCI_IDS));
> + return ids;
> +}
> +
> +
> +static GFile *osinfo_loader_get_usb_path(void)
> +{
> + GFile *ids = g_file_new_for_path(USB_IDS);
> + g_object_set_data(G_OBJECT(ids), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_USB_IDS));
> + return ids;
> +}
> +
> +
> static GFile *osinfo_loader_get_system_path(void)
> {
> GFile *file;
> @@ -1936,13 +1968,19 @@ static GFile *osinfo_loader_get_system_path(void)
>
> dbdir = g_strdup_printf("%s/db", path);
> file = g_file_new_for_path(dbdir);
> + g_object_set_data(G_OBJECT(file), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_NATIVE));
> g_free(dbdir);
> return file;
> }
>
> static GFile *osinfo_loader_get_local_path(void)
> {
> - return g_file_new_for_path(SYS_CONF_DIR "/libosinfo/db");
> + GFile *file;
> + file = g_file_new_for_path(SYS_CONF_DIR "/libosinfo/db");
> + g_object_set_data(G_OBJECT(file), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_NATIVE));
> + return file;
> }
>
> static GFile *osinfo_loader_get_user_path(void)
> @@ -1953,6 +1991,8 @@ static GFile *osinfo_loader_get_user_path(void)
>
> dbdir = g_strdup_printf("%s/libosinfo/db", configdir);
> file = g_file_new_for_path(dbdir);
> + g_object_set_data(G_OBJECT(file), "data-format",
> + GINT_TO_POINTER(OSINFO_DATA_FORMAT_NATIVE));
> g_free(dbdir);
> return file;
> }
> @@ -1960,6 +2000,8 @@ static GFile *osinfo_loader_get_user_path(void)
> void osinfo_loader_process_default_path(OsinfoLoader *loader, GError **err)
> {
> GFile *dirs[] = {
> + osinfo_loader_get_pci_path(),
> + osinfo_loader_get_usb_path(),
> osinfo_loader_get_system_path(),
> osinfo_loader_get_local_path(),
> osinfo_loader_get_user_path(),
> @@ -1970,6 +2012,8 @@ void osinfo_loader_process_default_path(OsinfoLoader *loader, GError **err)
> g_object_unref(dirs[0]);
> g_object_unref(dirs[1]);
> g_object_unref(dirs[2]);
> + g_object_unref(dirs[3]);
> + g_object_unref(dirs[4]);
> }
>
> /**
> @@ -1983,12 +2027,16 @@ void osinfo_loader_process_system_path(OsinfoLoader *loader,
> GError **err)
> {
> GFile *dirs[] = {
> + osinfo_loader_get_pci_path(),
> + osinfo_loader_get_usb_path(),
> osinfo_loader_get_system_path(),
> NULL,
> };
>
> osinfo_loader_process_list(loader, dirs, err);
> g_object_unref(dirs[0]);
> + g_object_unref(dirs[1]);
> + g_object_unref(dirs[2]);
> }
>
> void osinfo_loader_process_local_path(OsinfoLoader *loader, GError **err)
> --
> 2.4.3
>
> _______________________________________________
> Libosinfo mailing list
> Libosinfo at redhat.com
> https://www.redhat.com/mailman/listinfo/libosinfo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libosinfo/attachments/20151016/9f344225/attachment.sig>
More information about the Libosinfo
mailing list