diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-06-26 21:00:51 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-06-26 21:00:51 +0000 |
commit | 1f6e24e73ccdca64864da009a21f5b7051d200a1 (patch) | |
tree | 864894ca89ebfaaa5ae6bc2332a588ae331ea554 /usb-linux.c | |
parent | 3e382bc84ce93df505b48fc4e305fcc5f4ac4567 (diff) |
display device identifier string for user with info usb (Lonnie Mendez)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2029 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'usb-linux.c')
-rw-r--r-- | usb-linux.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/usb-linux.c b/usb-linux.c index 8009a1b608..aa1ded23d0 100644 --- a/usb-linux.c +++ b/usb-linux.c @@ -44,11 +44,13 @@ typedef int USBScanFunc(void *opaque, int bus_num, int addr, int class_id, int vendor_id, int product_id, const char *product_name, int speed); static int usb_host_find_device(int *pbus_num, int *paddr, + char *product_name, int product_name_size, const char *devname); //#define DEBUG #define USBDEVFS_PATH "/proc/bus/usb" +#define PRODUCT_NAME_SZ 32 typedef struct USBHostDevice { USBDevice dev; @@ -145,8 +147,11 @@ USBDevice *usb_host_device_open(const char *devname) char buf[1024]; int descr_len, dev_descr_len, config_descr_len, nb_interfaces; int bus_num, addr; + char product_name[PRODUCT_NAME_SZ]; - if (usb_host_find_device(&bus_num, &addr, devname) < 0) + if (usb_host_find_device(&bus_num, &addr, + product_name, sizeof(product_name), + devname) < 0) return NULL; snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d", @@ -230,6 +235,14 @@ USBDevice *usb_host_device_open(const char *devname) dev->dev.handle_reset = usb_host_handle_reset; dev->dev.handle_control = usb_host_handle_control; dev->dev.handle_data = usb_host_handle_data; + + if (product_name[0] == '\0') + snprintf(dev->dev.devname, sizeof(dev->dev.devname), + "host:%s", devname); + else + pstrcpy(dev->dev.devname, sizeof(dev->dev.devname), + product_name); + return (USBDevice *)dev; } @@ -337,6 +350,7 @@ typedef struct FindDeviceState { int product_id; int bus_num; int addr; + char product_name[PRODUCT_NAME_SZ]; } FindDeviceState; static int usb_host_find_device_scan(void *opaque, int bus_num, int addr, @@ -345,8 +359,11 @@ static int usb_host_find_device_scan(void *opaque, int bus_num, int addr, const char *product_name, int speed) { FindDeviceState *s = opaque; - if (vendor_id == s->vendor_id && - product_id == s->product_id) { + if ((vendor_id == s->vendor_id && + product_id == s->product_id) || + (bus_num == s->bus_num && + addr == s->addr)) { + pstrcpy(s->product_name, PRODUCT_NAME_SZ, product_name); s->bus_num = bus_num; s->addr = addr; return 1; @@ -359,6 +376,7 @@ static int usb_host_find_device_scan(void *opaque, int bus_num, int addr, 'bus.addr' (decimal numbers) or 'vendor_id:product_id' (hexa numbers) */ static int usb_host_find_device(int *pbus_num, int *paddr, + char *product_name, int product_name_size, const char *devname) { const char *p; @@ -369,6 +387,11 @@ static int usb_host_find_device(int *pbus_num, int *paddr, if (p) { *pbus_num = strtoul(devname, NULL, 0); *paddr = strtoul(p + 1, NULL, 0); + fs.bus_num = *pbus_num; + fs.addr = *paddr; + ret = usb_host_scan(&fs, usb_host_find_device_scan); + if (ret) + pstrcpy(product_name, product_name_size, fs.product_name); return 0; } p = strchr(devname, ':'); @@ -379,6 +402,7 @@ static int usb_host_find_device(int *pbus_num, int *paddr, if (ret) { *pbus_num = fs.bus_num; *paddr = fs.addr; + pstrcpy(product_name, product_name_size, fs.product_name); return 0; } } |