[Pcsclite-cvs-commit] Drivers/ccid/src ccid_usb.c,1.21,1.22

rousseau@haydn.debian.org rousseau@haydn.debian.org


Update of /cvsroot/pcsclite/Drivers/ccid/src
In directory haydn:/tmp/cvs-serv17446

Modified Files:
	ccid_usb.c 
Log Message:
add support for the libusb naming scheme: usb:%04x/%04x:libusb:%s


Index: ccid_usb.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_usb.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- ccid_usb.c	6 Apr 2004 13:15:34 -0000	1.21
+++ ccid_usb.c	8 Apr 2004 14:35:57 -0000	1.22
@@ -113,12 +113,14 @@
 	int vendorID, productID;
 	char infofile[FILENAME_MAX];
 	int device_vendor, device_product;
+	char *dirname = NULL, *filename = NULL;
 
 	DEBUG_COMM3("Lun: %X, Device: %s", lun, device);
 
 	/* device name specified */
 	if (device)
 	{
+		/* format: usb:%04x/%04x, vendor, product */
 		if (strncmp("usb:", device, 4) != 0)
 		{
 			DEBUG_CRITICAL2("device name does not start with \"usb:\": %s",
@@ -131,6 +133,33 @@
 			DEBUG_CRITICAL2("device name can't be parsed: %s", device);
 			return STATUS_UNSUCCESSFUL;
 		}
+
+		/* format usb:%04x/%04x:libusb:%s
+		 * with %s set to %s:%s, dirname, filename */
+		if ((dirname = strstr(device, "libusb:")) != NULL)
+		{
+			/* dirname points to the first char after libusb: */
+			dirname += strlen("libusb:");
+
+			/* search the : (separation) char */
+			filename = strchr(dirname, ':');
+
+			if (filename)
+			{
+				/* end the dirname string */
+				*filename = '\0';
+
+				/* filename points to the first char after : */
+				filename++;
+			}
+			else
+			{
+				/* parse failed */
+				dirname = NULL;
+
+				DEBUG_CRITICAL2("can't parse using libusb scheme: %s", device);
+			}
+		}
 	}
 
 	if (busses == NULL)
@@ -214,6 +243,11 @@
 			/* any device on this bus */
 			for (dev = bus->devices; dev; dev = dev->next)
 			{
+				/* device defined by name? */
+				if (dirname && (strcmp(dirname, bus->dirname)
+					|| strcmp(filename, dev->filename)))
+					continue;
+
 				if (dev->descriptor.idVendor == vendorID
 					&& dev->descriptor.idProduct == productID)
 				{