[Pcsclite-cvs-commit] Drivers/ccid/src ccid_usb.c,1.13,1.14
rousseau@quantz.debian.org
rousseau@quantz.debian.org
Thu, 29 Jan 2004 11:33:54 +0100
Update of /cvsroot/pcsclite/Drivers/ccid/src
In directory quantz:/tmp/cvs-serv27822
Modified Files:
ccid_usb.c
Log Message:
- remove device_name[] from struct _usbDevice
- use naming scheme usb:vendor/product
- simplify (a bit) the code
Index: ccid_usb.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_usb.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- ccid_usb.c 27 Jan 2004 14:46:01 -0000 1.13
+++ ccid_usb.c 29 Jan 2004 10:33:52 -0000 1.14
@@ -55,14 +55,6 @@
struct usb_device *dev;
/*
- * Used to store device name string %s/%s (dirname/filename) like:
- * (/proc/bus/usb/) 001/002 (Linux)
- * /dev/usb0//dev/ (FreeBSD)
- * /dev/usb0//dev/ugen0 (OpenBSD)
- */
- char device_name[BUS_DEVICE_STRSIZE];
-
- /*
* Endpoints
*/
int bulk_in;
@@ -79,7 +71,7 @@
#include "ccid_usb.h"
static _usbDevice usbDevice[PCSCLITE_MAX_READERS] = {
- [ 0 ... (PCSCLITE_MAX_READERS-1) ] = { NULL, NULL, "", 0, 0 }
+ [ 0 ... (PCSCLITE_MAX_READERS-1) ] = { NULL, NULL, 0, 0 }
};
#define PCSCLITE_MANUKEY_NAME "ifdVendorID"
@@ -113,8 +105,28 @@
char keyValue[TOKEN_MAX_VALUE_SIZE];
int vendorID, productID;
char infofile[FILENAME_MAX];
+ int device_vendor, device_product;
- DEBUG_COMM3("Lun: %X, Device: %X", lun, device);
+ DEBUG_COMM3("Lun: %X, Device: %s", lun, device);
+
+ /* device name specified */
+ if (device)
+ {
+ if (strncmp("usb:", device, 4) != 0)
+ {
+ DEBUG_CRITICAL2("device name does not start with \"usb:\": %s",
+ device);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ if (sscanf(device, "usb:%x/%x", &device_vendor, &device_product) != 2)
+ {
+ DEBUG_CRITICAL2("device name can't be parsed: %s", device);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ printf("%x %x\n", device_vendor, device_product);
+ }
if (busses == NULL)
usb_init();
@@ -175,6 +187,14 @@
if (LTPBundleFindValueWithKey(infofile, PCSCLITE_NAMEKEY_NAME, keyValue, alias))
goto end;
+ /* go to next supported reader for next round */
+ alias++;
+
+ /* the device was specified but is not the one we are trying to find */
+ if (device
+ && (vendorID != device_vendor || productID != device_product))
+ continue;
+
/* on any USB buses */
for (bus = busses; bus; bus = bus->next)
{
@@ -187,129 +207,100 @@
&& dev->descriptor.idProduct == productID)
{
int r, already_used;
- char device_name[BUS_DEVICE_STRSIZE];
-
- if (snprintf(device_name, BUS_DEVICE_STRSIZE,
-/* This need to be in sync with PCSC/src/hotplug_libusb.c */ #ifdef __linux__
-#define LINUX_USB_PATH "/proc/bus/usb/"
- LINUX_USB_PATH "%s/%s", bus->dirname, dev->filename
-#else
-#ifdef __FreeBSD__
- "%s", dev->filename
-#else
- "%s.00", dev->filename
-#endif
-#endif
- ) < 0)
- {
- DEBUG_CRITICAL2("Device name too long: %s", device_name);
- return STATUS_UNSUCCESSFUL;
- }
+ struct usb_interface *usb_interface = NULL;
+ int interface;
/* is it already opened? */
already_used = FALSE;
- /* select by name? */
- if (device)
- {
- if (strcmp(device, device_name) != 0)
- /* not the good reader, try next one */
- already_used = TRUE;
- }
- else
+ for (r=0; r<PCSCLITE_MAX_READERS; r++)
{
- for (r=0; r<PCSCLITE_MAX_READERS; r++)
+ if (usbDevice[r].dev)
{
- if (usbDevice[r].dev)
- {
- DEBUG_COMM3("Checking new device '%s' against old '%s'",
- device_name, usbDevice[r].device_name);
- if (strcmp(usbDevice[r].device_name, device_name) == 0)
- already_used = TRUE;
- }
+ DEBUG_COMM3("Checking device: %s/%s",
+ bus->dirname, dev->filename);
+ /* same busname, same filename */
+ if (strcmp(usbDevice[r].dev->bus->dirname, bus->dirname) == 0 && strcmp(usbDevice[r].dev->filename, dev->filename) == 0)
+ already_used = TRUE;
}
}
- if (!already_used)
+ /* this reader is already managed by us */
+ if (already_used)
{
- DEBUG_COMM2("Trying to open USB bus/device: %s",
- device_name);
-
- dev_handle = usb_open(dev);
- if (dev_handle)
- {
- struct usb_interface *usb_interface = NULL;
- int interface;
-
- if (dev->config == NULL)
- {
- DEBUG_CRITICAL2("No dev->config found for %s",
- device_name);
- return STATUS_UNSUCCESSFUL;
- }
-
- usb_interface = get_ccid_usb_interface(dev);
- if (usb_interface == NULL)
- {
- DEBUG_CRITICAL2("Can't find a CCID interface on %s", device_name);
- return STATUS_UNSUCCESSFUL;
- }
+ DEBUG_INFO3("USB device %s/%s already in use. Checking next one.",
+ bus->dirname, dev->filename);
- if (usb_interface->altsetting->extralen != 54)
- {
- DEBUG_CRITICAL3("Extra field for %s has a wrong length: %d", device_name, usb_interface->altsetting->extralen);
- return STATUS_UNSUCCESSFUL;
- }
+ continue;
+ }
- interface = usb_interface->altsetting->bInterfaceNumber;
- if (usb_claim_interface(dev_handle, interface) < 0)
- {
- DEBUG_CRITICAL3("Can't claim interface %s: %s",
- device_name, strerror(errno));
- return STATUS_UNSUCCESSFUL;
- }
+ DEBUG_COMM3("Trying to open USB bus/device: %s/%s",
+ bus->dirname, dev->filename);
- DEBUG_INFO4("Found Vendor/Product: %04X/%04X (%s)",
- dev->descriptor.idVendor,
- dev->descriptor.idProduct, keyValue);
- DEBUG_INFO2("Using USB bus/device: %s",
- device_name);
+ dev_handle = usb_open(dev);
+ if (dev_handle == NULL)
+ {
+ DEBUG_CRITICAL4("Can't usb_open(%s/%s): %s",
+ bus->dirname, dev->filename, strerror(errno));
- /* Get Endpoints values*/
- get_end_points(dev, &usbDevice[reader]);
+ continue;
+ }
- /* store device information */
- usbDevice[reader].handle = dev_handle;
- usbDevice[reader].dev = dev;
- strncpy(usbDevice[reader].device_name,
- device_name, BUS_DEVICE_STRSIZE);
+ /* now we found a free reader and we try to use it */
+ if (dev->config == NULL)
+ {
+ DEBUG_CRITICAL3("No dev->config found for %s/%s",
+ bus->dirname, dev->filename);
+ return STATUS_UNSUCCESSFUL;
+ }
- /* CCID common informations */
- usbDevice[reader].ccid.bSeq = 1;
- usbDevice[reader].ccid.readerID =
- (dev->descriptor.idVendor << 16) +
- dev->descriptor.idProduct;
- usbDevice[reader].ccid.dwFeatures = dw2i(usb_interface->altsetting->extra, 40);
- usbDevice[reader].ccid.dwMaxCCIDMessageLength = dw2i(usb_interface->altsetting->extra, 44);
+ usb_interface = get_ccid_usb_interface(dev);
+ if (usb_interface == NULL)
+ {
+ DEBUG_CRITICAL3("Can't find a CCID interface on %s/%s",
+ bus->dirname, dev->filename);
+ return STATUS_UNSUCCESSFUL;
+ }
- goto end;
- }
- else
- DEBUG_CRITICAL3("Can't usb_open(%s): %s",
- device_name,
- strerror(errno));
+ if (usb_interface->altsetting->extralen != 54)
+ {
+ DEBUG_CRITICAL4("Extra field for %s/%s has a wrong length: %d", bus->dirname, dev->filename, usb_interface->altsetting->extralen);
+ return STATUS_UNSUCCESSFUL;
}
- else
+
+ interface = usb_interface->altsetting->bInterfaceNumber;
+ if (usb_claim_interface(dev_handle, interface) < 0)
{
- DEBUG_INFO2("USB device %s already in use. Checking next one.",
- device_name);
+ DEBUG_CRITICAL4("Can't claim interface %s/%s: %s",
+ bus->dirname, dev->filename, strerror(errno));
+ return STATUS_UNSUCCESSFUL;
}
+
+ DEBUG_INFO4("Found Vendor/Product: %04X/%04X (%s)",
+ dev->descriptor.idVendor,
+ dev->descriptor.idProduct, keyValue);
+ DEBUG_INFO3("Using USB bus/device: %s/%s",
+ bus->dirname, dev->filename);
+
+ /* Get Endpoints values*/
+ get_end_points(dev, &usbDevice[reader]);
+
+ /* store device information */
+ usbDevice[reader].handle = dev_handle;
+ usbDevice[reader].dev = dev;
+
+ /* CCID common informations */
+ usbDevice[reader].ccid.bSeq = 1;
+ usbDevice[reader].ccid.readerID =
+ (dev->descriptor.idVendor << 16) +
+ dev->descriptor.idProduct;
+ usbDevice[reader].ccid.dwFeatures = dw2i(usb_interface->altsetting->extra, 40);
+ usbDevice[reader].ccid.dwMaxCCIDMessageLength = dw2i(usb_interface->altsetting->extra, 44);
+
+ goto end;
}
}
}
-
- /* go to next supported reader */
- alias++;
}
end:
if (usbDevice[reader].handle == NULL)
@@ -342,8 +333,9 @@
if (rv < 0)
{
- DEBUG_CRITICAL3("usb_bulk_write(%s): %s",
- usbDevice[reader].device_name, strerror(errno));
+ DEBUG_CRITICAL4("usb_bulk_write(%s/%s): %s",
+ usbDevice[reader].dev->bus->dirname,
+ usbDevice[reader].dev->filename, strerror(errno));
return STATUS_UNSUCCESSFUL;
}
@@ -372,8 +364,9 @@
if (rv < 0)
{
- DEBUG_CRITICAL3("usb_bulk_read(%s): %s",
- usbDevice[reader].device_name, strerror(errno));
+ DEBUG_CRITICAL4("usb_bulk_read(%s/%s): %s",
+ usbDevice[reader].dev->bus->dirname,
+ usbDevice[reader].dev->filename, strerror(errno));
return STATUS_UNSUCCESSFUL;
}
@@ -400,7 +393,8 @@
if (usbDevice[reader].dev == NULL)
return STATUS_UNSUCCESSFUL;
- DEBUG_COMM2("Closing USB device: %s", usbDevice[reader].device_name);
+ DEBUG_COMM3("Closing USB device: %s/%s",
+ usbDevice[reader].dev->bus->dirname, usbDevice[reader].dev->filename);
usb_interface = get_ccid_usb_interface(usbDevice[reader].dev);
interface = usb_interface ?
@@ -414,7 +408,6 @@
/* mark the resource unused */
usbDevice[reader].handle = NULL;
usbDevice[reader].dev = NULL;
- usbDevice[reader].device_name[0] = '\0';
return STATUS_SUCCESS;
} /* CloseUSB */
@@ -436,13 +429,12 @@
* get_desc
*
****************************************************************************/
-int get_desc(int channel, char *device_name[], usb_dev_handle **handle, struct
+int get_desc(int channel, usb_dev_handle **handle, struct
usb_device **dev)
{
if (channel < 0 || channel > PCSCLITE_MAX_READERS)
return 1;
- *device_name = usbDevice[channel].device_name;
*handle = usbDevice[channel].handle;
*dev = usbDevice[channel].dev;