[PATCH 1/4] main: Make -d vid:pid parsing simpler and more flexible

Tormod Volden lists.tormod at gmail.com
Fri May 20 00:03:14 CEST 2011


From: Tormod Volden <debian.tormod at 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




More information about the devel mailing list