diff options
author | Leandro Pereira <leandro@hardinfo.org> | 2012-01-22 15:44:47 -0200 |
---|---|---|
committer | Leandro Pereira <leandro@hardinfo.org> | 2012-01-22 15:44:47 -0200 |
commit | d9e242117b7a73dd3057af25956027a361f7999f (patch) | |
tree | 76dabfa34f14165e996e66c09389a99a48dd4f89 | |
parent | 90ee69f0b186f6778f5758afb5ef341e95031af0 (diff) |
Fix USB device listing when parsing lsusb output
-rw-r--r-- | modules/devices/usb.c | 85 |
1 files changed, 57 insertions, 28 deletions
diff --git a/modules/devices/usb.c b/modules/devices/usb.c index f58476eb..a8868b1e 100644 --- a/modules/devices/usb.c +++ b/modules/devices/usb.c @@ -45,7 +45,7 @@ void __scan_usb_sysfs_add_device(gchar * endpoint, int n) bus = h_sysfs_read_int(endpoint, "busnum"); speed = h_sysfs_read_float(endpoint, "speed"); version = h_sysfs_read_float(endpoint, "version"); - + if (!(mxpwr = h_sysfs_read_string(endpoint, "bMaxPower"))) { mxpwr = g_strdup("0 mA"); } @@ -67,7 +67,7 @@ void __scan_usb_sysfs_add_device(gchar * endpoint, int n) tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url); g_free(manufacturer); - manufacturer = tmp; + manufacturer = tmp; } tmp = g_strdup_printf("USB%d", n); @@ -91,7 +91,7 @@ void __scan_usb_sysfs_add_device(gchar * endpoint, int n) version, classid, vendor, prodid, bus); g_hash_table_insert(moreinfo, tmp, strhash); - + g_free(manufacturer); g_free(product); g_free(mxpwr); @@ -129,7 +129,7 @@ gboolean __scan_usb_sysfs(void) } g_dir_close(sysfs); - + return usb_device_number > 0; } @@ -252,24 +252,51 @@ gboolean __scan_usb_procfs(void) void __scan_usb_lsusb_add_device(char *buffer, FILE *lsusb, int usb_device_number) { gint bus, device, vendor_id, product_id; - gchar *product = NULL, *vendor = NULL, *max_power, *tmp, *strhash; - + gchar *version = NULL, *product = NULL, *vendor = NULL, *dev_class = NULL, *int_class = NULL; + gchar *max_power = NULL; + gchar *tmp, *strhash; + long position; + sscanf(buffer, "Bus %d Device %d: ID %x:%x", &bus, &device, &vendor_id, &product_id); - while (fgets(buffer, 512, lsusb)) { - if (g_str_has_prefix(buffer, " idVendor")) { - vendor = g_strstrip(g_strdup(buffer + 28)); - } else if (g_str_has_prefix(buffer, " idProduct")) { - product = g_strstrip(g_strdup(buffer + 28)); - } else if (g_str_has_prefix(buffer, " MaxPower")) { - max_power = g_strstrip(g_strdup(buffer + 26)); - } else if (g_str_has_prefix(buffer, "\n")) { + for (position = ftell(lsusb); fgets(buffer, 512, lsusb); position = ftell(lsusb)) { + g_strstrip(buffer); + + if (g_str_has_prefix(buffer, "idVendor")) { + g_free(vendor); + vendor = g_strdup(buffer + 26); + } else if (g_str_has_prefix(buffer, "idProduct")) { + g_free(product); + product = g_strdup(buffer + 26); + } else if (g_str_has_prefix(buffer, "MaxPower")) { + g_free(max_power); + max_power = g_strdup(buffer + 9); + } else if (g_str_has_prefix(buffer, "bcdUSB")) { + g_free(version); + version = g_strdup(buffer + 7); + } else if (g_str_has_prefix(buffer, "bDeviceClass")) { + g_free(dev_class); + dev_class = g_strdup(buffer + 14); + } else if (g_str_has_prefix(buffer, "bInterfaceClass")) { + g_free(int_class); + int_class = g_strdup(buffer + 16); + } else if (g_str_has_prefix(buffer, "Bus ")) { /* device separator */ + fseek(lsusb, position, SEEK_SET); break; } } + if (strstr(dev_class, "0 (Defined at Interface level)")) { + g_free(dev_class); + if (int_class) { + dev_class = int_class; + } else { + dev_class = g_strdup("Unknown"); + } + } + tmp = g_strdup_printf("USB%d", usb_device_number); usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product ? product : "Unknown"); @@ -278,23 +305,25 @@ void __scan_usb_lsusb_add_device(char *buffer, FILE *lsusb, int usb_device_numbe "Manufacturer=%s\n" "Max Current=%s\n" "[Misc]\n" - "USB Version=%.2f\n" - "Class=0x%x\n" + "USB Version=%s\n" + "Class=%s\n" "Vendor=0x%x\n" "Product ID=0x%x\n" "Bus=%d\n", - product, - vendor ? vendor : "Unknown", - max_power, - 0.0f /* FIXME */, - 0 /* FIXME */, + product ? g_strstrip(product) : "Unknown", + vendor ? g_strstrip(vendor) : "Unknown", + max_power ? g_strstrip(max_power) : "Unknown", + version ? g_strstrip(version) : "Unknown", + dev_class ? g_strstrip(dev_class) : "Unknown", vendor_id, product_id, bus); g_hash_table_insert(moreinfo, tmp, strhash); - + g_free(vendor); g_free(product); g_free(max_power); + g_free(dev_class); + g_free(version); } gboolean __scan_usb_lsusb(void) @@ -303,25 +332,25 @@ gboolean __scan_usb_lsusb(void) int usb_device_number = 0; FILE *lsusb; char buffer[512], *temp; - + if (!lsusb_path) { if (!(lsusb_path = find_program("lsusb"))) { DEBUG("lsusb not found"); - + return FALSE; } } - + temp = g_strdup_printf("%s -v", lsusb_path); if (!(lsusb = popen(temp, "r"))) { DEBUG("cannot run %s", lsusb_path); - + g_free(temp); return FALSE; } - + g_free(temp); - + if (usb_list) { g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL); g_free(usb_list); |