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