Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F140027612
D3392.id7969.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D3392.id7969.diff
View Options
Index: lib/libusb/libusb20_ugen20.c
===================================================================
--- lib/libusb/libusb20_ugen20.c
+++ lib/libusb/libusb20_ugen20.c
@@ -27,6 +27,7 @@
#ifdef LIBUSB_GLOBAL_INCLUDE_FILE
#include LIBUSB_GLOBAL_INCLUDE_FILE
#else
+#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
@@ -50,6 +51,21 @@
#define IOUSB(a) a
#endif
+struct usb_product_info {
+ TAILQ_ENTRY(usb_product_info) link;
+ int id;
+ char *desc;
+};
+
+struct usb_vendor_info {
+ TAILQ_ENTRY(usb_vendor_info) link;
+ TAILQ_HEAD(,usb_product_info) devs;
+ int id;
+ char *desc;
+};
+
+TAILQ_HEAD(usb_vendors, usb_vendor_info);
+
static libusb20_init_backend_t ugen20_init_backend;
static libusb20_open_device_t ugen20_open_device;
static libusb20_close_device_t ugen20_close_device;
@@ -129,12 +145,16 @@
}
static int
-ugen20_enumerate(struct libusb20_device *pdev, const char *id)
+ugen20_enumerate(struct libusb20_device *pdev, const char *id,
+ struct usb_vendors *uvendors)
{
const char *tmp = id;
struct usb_device_descriptor ddesc;
struct usb_device_info devinfo;
+ struct usb_vendor_info *vi;
+ struct usb_product_info *pi;
uint32_t plugtime;
+ const char *vendor, *product;
char buf[64];
int f;
int error;
@@ -210,12 +230,30 @@
pdev->parent_address = devinfo.udi_hubindex;
pdev->parent_port = devinfo.udi_hubport;
+ vendor = devinfo.udi_vendor;
+ product = devinfo.udi_product;
+ if (uvendors != NULL) {
+ TAILQ_FOREACH(vi, uvendors, link) {
+ if (vi->id == pdev->ddesc.idVendor) {
+ vendor = vi->desc;
+ break;
+ }
+ }
+ if (vi != NULL) {
+ TAILQ_FOREACH(pi, &vi->devs, link) {
+ if (pi->id == pdev->ddesc.idProduct) {
+ product = pi->desc;
+ break;
+ }
+ }
+ }
+ }
+
/* generate a nice description for printout */
snprintf(pdev->usb_desc, sizeof(pdev->usb_desc),
USB_GENERIC_NAME "%u.%u: <%s %s> at usbus%u", pdev->bus_number,
- pdev->device_address, devinfo.udi_product,
- devinfo.udi_vendor, pdev->bus_number);
+ pdev->device_address, product, vendor, pdev->bus_number);
error = 0;
done:
@@ -271,11 +309,117 @@
return (0);
}
+static struct usb_vendors *
+load_vendors(void)
+{
+ const char *dbf;
+ FILE *db;
+ struct usb_vendor_info *cv;
+ struct usb_product_info *cd;
+ struct usb_vendors *usb_vendors;
+ char buf[1024], str[1024];
+ char *ch;
+ int id, error;
+
+ if ((dbf = getenv("USB_VENDOR_DATABASE")) == NULL)
+ dbf = "/usr/local/share/usbids/usb.ids";
+ if ((db = fopen(dbf, "r")) == NULL) {
+ dbf = "/usr/share/misc/usb_vendors";
+ if ((db = fopen(dbf, "r")) == NULL)
+ return (NULL);
+ }
+ usb_vendors = malloc(sizeof(*usb_vendors));
+ TAILQ_INIT(usb_vendors);
+ cv = NULL;
+ cd = NULL;
+ error = 0;
+
+ for (;;) {
+ if (fgets(buf, sizeof(buf), db) == NULL)
+ break;
+
+ if ((ch = strchr(buf, '#')) != NULL)
+ *ch = '\0';
+ ch = strchr(buf, '\0') - 1;
+ while (ch > buf && isspace(*ch))
+ *ch-- = '\0';
+ if (ch <= buf)
+ continue;
+
+ /* Can't handle subvendor / subdevice entries yet */
+ if (buf[0] == '\t' && buf[1] == '\t')
+ continue;
+
+ /* Check for vendor entry */
+ if (buf[0] != '\t' && sscanf(buf, "%04x %[^\n]", &id, str) == 2) {
+ if ((id == 0) || (strlen(str) < 1))
+ continue;
+ if ((cv = malloc(sizeof(struct usb_vendor_info))) == NULL) {
+ error = 1;
+ break;
+ }
+ if ((cv->desc = strdup(str)) == NULL) {
+ free(cv);
+ error = 1;
+ break;
+ }
+ cv->id = id;
+ TAILQ_INIT(&cv->devs);
+ TAILQ_INSERT_TAIL(usb_vendors, cv, link);
+ continue;
+ }
+
+ /* Check for device entry */
+ if (buf[0] == '\t' && sscanf(buf + 1, "%04x %[^\n]", &id, str) == 2) {
+ if ((id == 0) || (strlen(str) < 1))
+ continue;
+ if (cv == NULL)
+ continue;
+ if ((cd = malloc(sizeof(struct usb_product_info))) == NULL) {
+ error = 1;
+ break;
+ }
+ if ((cd->desc = strdup(str)) == NULL) {
+ free(cd);
+ error = 1;
+ break;
+ }
+ cd->id = id;
+ TAILQ_INSERT_TAIL(&cv->devs, cd, link);
+ continue;
+ }
+ }
+ if (ferror(db))
+ error = 1;
+
+ fclose(db);
+ /* cleanup */
+ return (usb_vendors);
+}
+
+static void
+unload_vendors(struct usb_vendors *uvendors)
+{
+ struct usb_vendor_info *vi, *vitmp;
+ struct usb_product_info *pi, *pitmp;
+
+ TAILQ_FOREACH_SAFE(vi, uvendors, link, vitmp) {
+ TAILQ_FOREACH_SAFE(pi, &vi->devs, link, pitmp) {
+ free(pi->desc);
+ TAILQ_REMOVE(&vi->devs, pi, link);
+ }
+ free(vi->desc);
+ TAILQ_REMOVE(uvendors, vi, link);
+ }
+ free(uvendors);
+}
+
static int
ugen20_init_backend(struct libusb20_backend *pbe)
{
struct ugen20_urd_state state;
struct libusb20_device *pdev;
+ struct usb_vendors *uvendors = NULL;
memset(&state, 0, sizeof(state));
@@ -283,6 +427,7 @@
if (state.f < 0)
return (LIBUSB20_ERROR_OTHER);
+ uvendors = load_vendors();
while (ugen20_readdir(&state) == 0) {
if ((state.src[0] != 'u') ||
@@ -295,13 +440,15 @@
if (pdev == NULL) {
continue;
}
- if (ugen20_enumerate(pdev, state.src + 4)) {
+ if (ugen20_enumerate(pdev, state.src + 4, uvendors)) {
libusb20_dev_free(pdev);
continue;
}
/* put the device on the backend list */
libusb20_be_enqueue_device(pbe, pdev);
}
+ if (uvendors)
+ unload_vendors(uvendors);
close(state.f);
return (0); /* success */
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Dec 20, 6:07 AM (2 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27092802
Default Alt Text
D3392.id7969.diff (5 KB)
Attached To
Mode
D3392: usbconfig: allow to get usb vendors and products from the usb.ids database
Attached
Detach File
Event Timeline
Log In to Comment