aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTan Li Boon <liboon.tan@mujin.co.jp>2022-06-17 13:53:59 +0900
committerTan Li Boon <liboon.tan@mujin.co.jp>2022-06-17 14:41:14 +0900
commit2e08ffdf19a3dc8cbb811a30d7f990d6517ea137 (patch)
tree99a641dc5e0148c40abd7f46a407ba11b42772f2
parent4bf4819a0dfddc53810a640e3be83dbbeeab0802 (diff)
downloadusbutils-2e08ffdf19a3dc8cbb811a30d7f990d6517ea137.tar.gz
lsusb: Add function that sorts the output by device ID.
On the master branch, device IDs are unsorted. An example from my laptop: Bus 004 Device 003: ID 17ef:a393 Lenovo USB3.1 Hub Bus 004 Device 004: ID 17ef:a387 Lenovo USB-C Dock Ethernet Bus 004 Device 002: ID 17ef:a391 Lenovo USB3.1 Hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 0bda:0328 Realtek Semiconductor Corp. USB3.0-CRW Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 008: ID 06cb:009a Synaptics, Inc. Metallica MIS Touch Fingerprint Reader Bus 001 Device 006: ID 5986:2115 Acer, Inc Integrated Camera Bus 001 Device 029: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port / Mobile Action MA-8910P Bus 001 Device 032: ID 045e:0823 Microsoft Corp. Classic IntelliMouse Bus 001 Device 031: ID 17ef:a396 Lenovo ThinkPad USB-C Dock Gen2 USB Audio Bus 001 Device 030: ID 04b4:521a Cypress Semiconductor Corp. USB-I2C Bridge Bus 001 Device 028: ID 17ef:a395 Lenovo USB2.0 Hub Bus 001 Device 027: ID 2be8:0002 ARCHISS PTR87 ARCHISS PTR87 Bus 001 Device 026: ID 17ef:a394 Lenovo USB2.0 Hub Bus 001 Device 025: ID 17ef:a392 Lenovo USB2.0 Hub Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub This patch introduces a function that sorts the device IDs by bus: Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 004 Device 002: ID 17ef:a391 Lenovo USB3.1 Hub Bus 004 Device 003: ID 17ef:a393 Lenovo USB3.1 Hub Bus 004 Device 004: ID 17ef:a387 Lenovo USB-C Dock Ethernet Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 002 Device 002: ID 0bda:0328 Realtek Semiconductor Corp. USB3.0-CRW Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 001 Device 006: ID 5986:2115 Acer, Inc Integrated Camera Bus 001 Device 008: ID 06cb:009a Synaptics, Inc. Metallica MIS Touch Fingerprint Reader Bus 001 Device 025: ID 17ef:a392 Lenovo USB2.0 Hub Bus 001 Device 026: ID 17ef:a394 Lenovo USB2.0 Hub Bus 001 Device 027: ID 2be8:0002 ARCHISS PTR87 ARCHISS PTR87 Bus 001 Device 028: ID 17ef:a395 Lenovo USB2.0 Hub Bus 001 Device 029: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port / Mobile Action MA-8910P Bus 001 Device 030: ID 04b4:521a Cypress Semiconductor Corp. USB-I2C Bridge Bus 001 Device 031: ID 17ef:a396 Lenovo ThinkPad USB-C Dock Gen2 USB Audio Signed-off-by: Tan Li Boon <liboon.tan@mujin.co.jp>
-rw-r--r--lsusb.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/lsusb.c b/lsusb.c
index 58102c2..8e3f0d3 100644
--- a/lsusb.c
+++ b/lsusb.c
@@ -3634,6 +3634,35 @@ static int dump_one_device(libusb_context *ctx, const char *path)
return 0;
}
+void sort_device_list(libusb_device **list, ssize_t num_devs)
+{
+ struct libusb_device *dev, *dev_next;
+ uint8_t bnum, bnum_next, dnum, dnum_next;
+ ssize_t i;
+ int sorted;
+ sorted = 0;
+ do {
+ sorted = 1;
+ for (i = 0; i < num_devs; ++i) {
+ dev = list[i];
+ bnum = libusb_get_bus_number(dev);
+ dnum = libusb_get_device_address(dev);
+ bnum_next = -1;
+ dnum_next = -1;
+ if (i + 1 < num_devs) {
+ dev_next = list[i + 1];
+ bnum_next = libusb_get_bus_number(dev_next);
+ dnum_next = libusb_get_device_address(dev_next);
+ }
+ if (bnum == bnum_next && dnum > dnum_next) {
+ list[i] = dev_next;
+ list[i + 1] = dev;
+ sorted = 0;
+ }
+ }
+ } while(!sorted);
+}
+
static int list_devices(libusb_context *ctx, int busnum, int devnum, int vendorid, int productid)
{
libusb_device **list;
@@ -3648,6 +3677,7 @@ static int list_devices(libusb_context *ctx, int busnum, int devnum, int vendori
if (num_devs < 0)
goto error;
+ sort_device_list(list, num_devs);
for (i = 0; i < num_devs; ++i) {
libusb_device *dev = list[i];
uint8_t bnum = libusb_get_bus_number(dev);