[Spice-devel] [PATCH spice-gtk 1/2] usbutil: look up usb.ids under g_get_system_data_dirs() by default

Marc-André Lureau marcandre.lureau at gmail.com
Wed Jul 11 05:45:26 PDT 2012


Simplify a little bit the portability by looking up usb.ids file
under g_get_system_data_dirs(). This is how most resources are
found under other OS, looking up files under various places, since
installation location may vary.
---
 gtk/spice-util-priv.h |    1 +
 gtk/usbutil.c         |   72 +++++++++++++++++++++++++++++++++----------------
 2 files changed, 50 insertions(+), 23 deletions(-)

diff --git a/gtk/spice-util-priv.h b/gtk/spice-util-priv.h
index 7449667..c2022a3 100644
--- a/gtk/spice-util-priv.h
+++ b/gtk/spice-util-priv.h
@@ -19,6 +19,7 @@
 #define SPICE_UTIL_PRIV_H
 
 #include <glib.h>
+#include "spice-util.h"
 
 G_BEGIN_DECLS
 
diff --git a/gtk/usbutil.c b/gtk/usbutil.c
index 704f973..3bd7660 100644
--- a/gtk/usbutil.c
+++ b/gtk/usbutil.c
@@ -36,8 +36,8 @@
 #include <sys/stat.h>
 #endif
 #include "usbutil.h"
+#include "spice-util-priv.h"
 
-#ifdef WITH_USBIDS
 #define VENDOR_NAME_LEN (122 - sizeof(void *))
 #define PRODUCT_NAME_LEN 126
 
@@ -53,10 +53,9 @@ typedef struct _usb_vendor_info {
     char name[VENDOR_NAME_LEN];
 } usb_vendor_info;
 
-GStaticMutex usbids_parse_mutex = G_STATIC_MUTEX_INIT;
-int usbids_vendor_count;
-usb_vendor_info *usbids_vendor_info;
-#endif
+static GStaticMutex usbids_load_mutex = G_STATIC_MUTEX_INIT;
+static int usbids_vendor_count;
+static usb_vendor_info *usbids_vendor_info;
 
 G_GNUC_INTERNAL
 const char *spice_usbutil_libusb_strerror(enum libusb_error error_code)
@@ -121,21 +120,17 @@ static gchar *spice_usbutil_get_sysfs_attribute(int bus, int address,
 }
 #endif
 
-#ifdef WITH_USBIDS
-static void spice_usbutil_parse_usbids(void)
+static gboolean spice_usbutil_parse_usbids(gchar *path)
 {
     gchar *contents, *line, **lines;
     usb_product_info *product_info;
     int i, j, id, product_count = 0;
 
-    g_static_mutex_lock(&usbids_parse_mutex);
-    if (usbids_vendor_count)
-        goto leave;
-
-    if (!g_file_get_contents(USB_IDS, &contents, NULL, NULL)) {
+    if (!g_file_get_contents(path, &contents, NULL, NULL)) {
         usbids_vendor_count = -1;
-        goto leave;
+        return FALSE;
     }
+
     lines = g_strsplit(contents, "\n", -1);
 
     for (i = 0; lines[i]; i++) {
@@ -165,7 +160,7 @@ static void spice_usbutil_parse_usbids(void)
             continue;
 
         id = strtoul(line, &line, 16);
-        while(isspace(line[0]))
+        while (isspace(line[0]))
             line++;
         usbids_vendor_info[usbids_vendor_count].vendor_id = id;
         snprintf(usbids_vendor_info[usbids_vendor_count].name,
@@ -182,7 +177,7 @@ static void spice_usbutil_parse_usbids(void)
                 continue;
 
             id = strtoul(line + 1, &line, 16);
-            while(isspace(line[0]))
+            while (isspace(line[0]))
                 line++;
             product_info[product_count].product_id = id;
             snprintf(product_info[product_count].name,
@@ -212,20 +207,52 @@ static void spice_usbutil_parse_usbids(void)
         }
     }
 #endif
-leave:
-    g_static_mutex_unlock(&usbids_parse_mutex);
+
+    return TRUE;
 }
+
+static gboolean spice_usbutil_load_usbids(void)
+{
+    gboolean success = FALSE;
+
+    g_static_mutex_lock(&usbids_load_mutex);
+    if (usbids_vendor_count) {
+        success = TRUE;
+        goto leave;
+    }
+
+#ifdef WITH_USBIDS
+    success = spice_usbutil_parse_usbids(USB_IDS);
+#else
+    {
+        const gchar * const *dirs = g_get_system_data_dirs();
+        gchar *path = NULL;
+        int i;
+
+        for (i = 0; dirs[i]; ++i) {
+            path = g_build_filename(dirs[i], "hwdata", "usb.ids", NULL);
+            success = spice_usbutil_parse_usbids(path);
+            SPICE_DEBUG("loading %s success: %s", path, spice_yes_no(success));
+            g_free(path);
+
+            if (success)
+                goto leave;
+        }
+    }
 #endif
 
+leave:
+    g_static_mutex_unlock(&usbids_load_mutex);
+    return success;
+}
+
 G_GNUC_INTERNAL
 void spice_usb_util_get_device_strings(int bus, int address,
                                        int vendor_id, int product_id,
                                        gchar **manufacturer, gchar **product)
 {
-#ifdef WITH_USBIDS
     usb_product_info *product_info;
     int i, j;
-#endif
 
     g_return_if_fail(manufacturer != NULL);
     g_return_if_fail(product != NULL);
@@ -238,9 +265,8 @@ void spice_usb_util_get_device_strings(int bus, int address,
     *product = spice_usbutil_get_sysfs_attribute(bus, address, "product");
 #endif
 
-#ifdef WITH_USBIDS
-    if (!*manufacturer || !*product) {
-        spice_usbutil_parse_usbids();
+    if ((!*manufacturer || !*product) &&
+        spice_usbutil_load_usbids()) {
 
         for (i = 0; i < usbids_vendor_count; i++) {
             if ((int)usbids_vendor_info[i].vendor_id != vendor_id)
@@ -262,7 +288,7 @@ void spice_usb_util_get_device_strings(int bus, int address,
             break;
         }
     }
-#endif
+
     if (!*manufacturer)
         *manufacturer = g_strdup(_("USB"));
     if (!*product)
-- 
1.7.10.4



More information about the Spice-devel mailing list