[Libosinfo] [PATCH v3 57/60] loader: rework handling of pci.ids and usb.ids

Daniel P. Berrange berrange at redhat.com
Mon Oct 12 17:11:18 UTC 2015


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.

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




More information about the Libosinfo mailing list