From: Tormod Volden <debian.tor...@gmail.com>

Allow filtering on vendor ID or product ID alone. Examples:
 -d 1234:        (filter on vendor ID alone)
 -d :5678        (filter on product ID, less useful)
 -d 1234:5678    (full ID, like before)

Since there were already separate DFU_IFF_VENDOR and DFU_IF_PRODUCT
match specifier flags, this could seem like the original intention.

This also gets rid of a struct that was only used for this function call.
---

(patches for dfu-util, if somebody wonders :) )

This patch series is mostly preparing for things to come. Only this
first patch changes (adds) any functionality.

Tormod

 src/main.c |   52 ++++++++++++++++++----------------------------------
 1 files changed, 18 insertions(+), 34 deletions(-)

diff --git a/src/main.c b/src/main.c
index 401614d..4bea757 100644
--- a/src/main.c
+++ b/src/main.c
@@ -61,11 +61,6 @@ static int verbose = 0;
 #define DFU_IFF_DEVNUM         0x2000
 #define DFU_IFF_PATH           0x4000
 
-struct usb_vendprod {
-       u_int16_t vendor;
-       u_int16_t product;
-};
-
 struct dfu_if {
        u_int16_t vendor;
        u_int16_t product;
@@ -263,10 +258,11 @@ static int iterate_dfu_devices(struct dfu_if *dif,
                dev = list[i];
                libusb_get_device_descriptor(list[i], &desc);
 
-               if (dif && (dif->flags &
-                   (DFU_IFF_VENDOR|DFU_IFF_PRODUCT)) &&
-                   (desc.idVendor != dif->vendor ||
-                   desc.idProduct != dif->product))
+               if (dif && (dif->flags & DFU_IFF_VENDOR) &&
+                   desc.idVendor != dif->vendor)
+                       continue;
+               if (dif && (dif->flags & DFU_IFF_PRODUCT) &&
+                   desc.idProduct != dif->product)
                        continue;
                if (dif && (dif->flags & DFU_IFF_DEVNUM) &&
                    (bnum != dif->bus || dnum != dif->devnum))
@@ -339,25 +335,16 @@ static int list_dfu_interfaces(void)
        return 0;
 }
 
-static int parse_vendprod(struct usb_vendprod *vp, const char *str)
+static void parse_vendprod(u_int16_t *vendor, u_int16_t *product, const char 
*str)
 {
-       unsigned long vend, prod;
        const char *colon;
 
+       *vendor = strtoul(str, NULL, 16);
        colon = strchr(str, ':');
-       if (!colon || strlen(colon) < 2)
-               return -EINVAL;
-
-       vend = strtoul(str, NULL, 16);
-       prod = strtoul(colon+1, NULL, 16);
-
-       if (vend > 0xffff || prod > 0xffff)
-               return -EINVAL;
-
-       vp->vendor = vend;
-       vp->product = prod;
-
-       return 0;
+       if (colon)
+               *product = strtoul(colon + 1, NULL, 16);
+       else
+               *product = 0;
 }
 
 
@@ -485,7 +472,6 @@ enum mode {
 
 int main(int argc, char **argv)
 {
-       struct usb_vendprod vendprod;
        struct dfu_if _rt_dif, _dif, *dif = &_dif;
        int num_devs;
        int num_ifs;
@@ -543,15 +529,13 @@ int main(int argc, char **argv)
                        exit(0);
                        break;
                case 'd':
-                       /* Parse device */
-                       if (parse_vendprod(&vendprod, optarg) < 0) {
-                               fprintf(stderr, "unable to parse `%s' as a 
vendor:product\n", optarg);
-
-                               exit(2);
-                       }
-                       dif->vendor = vendprod.vendor;
-                       dif->product = vendprod.product;
-                       dif->flags |= (DFU_IFF_VENDOR | DFU_IFF_PRODUCT);
+                       /* Parse device ID */
+                       parse_vendprod(&dif->vendor, &dif->product, optarg);
+                       printf("Filter on vendor = 0x%04x product = 0x%04x\n", 
dif->vendor, dif->product);
+                       if (dif->vendor)
+                               dif->flags |= DFU_IFF_VENDOR;
+                       if (dif->product)
+                               dif->flags |= DFU_IFF_PRODUCT;
                        break;
                case 'p':
                        /* Parse device path */
-- 
1.7.0.4


_______________________________________________
devel mailing list
devel@lists.openmoko.org
https://lists.openmoko.org/mailman/listinfo/devel

Reply via email to