[Pcsclite-cvs-commit] Drivers/ccid/src ifdhandler.c,1.11,1.12 defs.h,1.3,1.4 ccid_usb.h,1.2,1.3 ccid_usb.c,1.10,1.11 ccid_serial.h,1.2,1.3 ccid_serial.c,1.5,1.6
rousseau@quantz.debian.org
rousseau@quantz.debian.org
Tue, 27 Jan 2004 14:32:57 +0100
Update of /cvsroot/pcsclite/Drivers/ccid/src
In directory quantz:/tmp/cvs-serv19237
Modified Files:
ifdhandler.c defs.h ccid_usb.h ccid_usb.c ccid_serial.h
ccid_serial.c
Log Message:
add support of IFDHCreateChannelByName
Index: ifdhandler.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ifdhandler.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- ifdhandler.c 15 Jan 2004 14:10:13 -0000 1.11
+++ ifdhandler.c 27 Jan 2004 13:32:55 -0000 1.12
@@ -42,6 +42,38 @@
#endif
+RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPSTR lpcDevice)
+{
+ DEBUG_INFO3("lun: %X, device: %s", Lun, lpcDevice);
+
+ if (CheckLun(Lun))
+ return IFD_COMMUNICATION_ERROR;
+
+ // Reset ATR buffer
+ CcidSlots[LunToReaderIndex(Lun)].nATRLength = 0;
+ *CcidSlots[LunToReaderIndex(Lun)].pcATRBuffer = '\0';
+
+ // Reset PowerFlags
+ CcidSlots[LunToReaderIndex(Lun)].bPowerFlags = POWERFLAGS_RAZ;
+
+#ifdef HAVE_PTHREAD
+ pthread_mutex_lock(&ifdh_context_mutex);
+#endif
+
+ if (OpenPortByName(Lun, lpcDevice) != STATUS_SUCCESS)
+ {
+ DEBUG_CRITICAL("OpenPortByName failed");
+ return IFD_COMMUNICATION_ERROR;
+ }
+
+#ifdef HAVE_PTHREAD
+ pthread_mutex_unlock(&ifdh_context_mutex);
+#endif
+
+ return IFD_SUCCESS;
+} /* IFDHCreateChannelByName */
+
+
RESPONSECODE IFDHCreateChannel(DWORD Lun, DWORD Channel)
{
/*
Index: defs.h
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/defs.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- defs.h 15 Jan 2004 14:09:38 -0000 1.3
+++ defs.h 27 Jan 2004 13:32:55 -0000 1.4
@@ -75,6 +75,7 @@
*/
#ifdef TWIN_SERIAL
+#define OpenPortByName OpenSerialByName
#define OpenPort OpenSerial
#define ClosePort CloseSerial
#define ReadPort ReadSerial
@@ -83,6 +84,7 @@
#else
+#define OpenPortByName OpenUSBByName
#define OpenPort OpenUSB
#define ClosePort CloseUSB
#define ReadPort ReadUSB
Index: ccid_usb.h
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_usb.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ccid_usb.h 10 Sep 2003 09:01:30 -0000 1.2
+++ ccid_usb.h 27 Jan 2004 13:32:55 -0000 1.3
@@ -22,6 +22,7 @@
*/
status_t OpenUSB(int lun, int channel);
+status_t OpenUSBByName(int lun, char *device);
status_t WriteUSB(int lun, int length, unsigned char *Buffer);
status_t ReadUSB(int lun, int *length, unsigned char *Buffer);
status_t CloseUSB(int lun);
Index: ccid_usb.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_usb.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- ccid_usb.c 15 Jan 2004 13:45:37 -0000 1.10
+++ ccid_usb.c 27 Jan 2004 13:32:55 -0000 1.11
@@ -1,6 +1,6 @@
/*
ccid_usb.c: USB access routines using the libusb library
- Copyright (C) 2003 Ludovic Rousseau
+ Copyright (C) 2003-2004 Ludovic Rousseau
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -55,8 +55,8 @@
struct usb_device *dev;
/*
- * Used to store device name string %s/%s like:
- * 001/002 (Linux)
+ * 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)
*/
@@ -86,6 +86,7 @@
#define PCSCLITE_PRODKEY_NAME "ifdProductID"
#define PCSCLITE_NAMEKEY_NAME "ifdFriendlyName"
+
/*****************************************************************************
*
* OpenUSB
@@ -93,6 +94,17 @@
****************************************************************************/
status_t OpenUSB(int lun, int Channel)
{
+ return OpenUSBByName(lun, NULL);
+} /* OpenUSB */
+
+
+/*****************************************************************************
+ *
+ * OpenUSBByName
+ *
+ ****************************************************************************/
+status_t OpenUSBByName(int lun, char *device)
+{
static struct usb_bus *busses = NULL;
int reader = LunToReaderIndex(lun);
int alias = 0;
@@ -102,7 +114,7 @@
int vendorID, productID;
char infofile[FILENAME_MAX];
- DEBUG_COMM3("Lun: %X, Channel: %X", lun, Channel);
+ DEBUG_COMM3("Lun: %X, Device: %X", lun, device);
if (busses == NULL)
usb_init();
@@ -177,8 +189,18 @@
int r, already_used;
char device_name[BUS_DEVICE_STRSIZE];
- if (snprintf(device_name, BUS_DEVICE_STRSIZE, "%s/%s",
- bus->dirname, dev->filename) < 0)
+ 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;
@@ -186,14 +208,25 @@
/* is it already opened? */
already_used = FALSE;
- for (r=0; r<PCSCLITE_MAX_READERS; r++)
+
+ /* select by name? */
+ if (device)
{
- if (usbDevice[r].dev)
+ 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++)
{
- 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;
+ 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;
+ }
}
}
@@ -275,7 +308,7 @@
return STATUS_UNSUCCESSFUL;
return STATUS_SUCCESS;
-} /* OpenUSB */
+} /* OpenUSBByName */
/*****************************************************************************
@@ -400,6 +433,7 @@
return 0;
} /* get_desc */
+
/*****************************************************************************
*
Index: ccid_serial.h
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_serial.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ccid_serial.h 19 Sep 2003 12:08:09 -0000 1.2
+++ ccid_serial.h 27 Jan 2004 13:32:55 -0000 1.3
@@ -22,6 +22,7 @@
*/
status_t OpenSerial(int lun, int channel);
+status_t OpenSerialByName(int lun, char *dev_name);
status_t WriteSerial(int lun, int length, unsigned char *Buffer);
status_t ReadSerial(int lun, int *length, unsigned char *Buffer);
int get_bytes(int lun, unsigned char *buffer, int length);
Index: ccid_serial.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_serial.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- ccid_serial.c 15 Jan 2004 13:45:37 -0000 1.5
+++ ccid_serial.c 27 Jan 2004 13:32:55 -0000 1.6
@@ -102,9 +102,9 @@
int fd;
/*
- * channel used (1..4)
+ * device used ("/dev/ttyS?" under Linux)
*/
- int channel;
+ char *device;
/*
* serial communication buffer
@@ -132,7 +132,7 @@
#include "ccid_serial.h"
static _serialDevice serialDevice[PCSCLITE_MAX_READERS] = {
- [ 0 ... (PCSCLITE_MAX_READERS-1) ] = { -1, -1 }
+ [ 0 ... (PCSCLITE_MAX_READERS-1) ] = { -1, NULL }
};
/*****************************************************************************
@@ -427,9 +427,6 @@
status_t OpenSerial(int lun, int channel)
{
char dev_name[FILENAME_MAX];
- struct termios current_termios;
- int i;
- int reader = LunToReaderIndex(lun);
DEBUG_COMM3("Lun: %X, Channel: %d", lun, channel);
@@ -456,12 +453,29 @@
sprintf(dev_name, "/dev/pcsc/%d", (int) channel);
+ return OpenSerialByName(lun, dev_name);
+} /* OpenSerial */
+
+/*****************************************************************************
+ *
+ * OpenSerialByName: open the port
+ *
+ *****************************************************************************/
+status_t OpenSerialByName(int lun, char *dev_name)
+{
+ struct termios current_termios;
+ int i;
+ int reader = LunToReaderIndex(lun);
+
+ DEBUG_COMM3("Lun: %X, Device: %d", lun, dev_name);
+
/* check if the same channel is not already used */
for (i=0; i<PCSCLITE_MAX_READERS; i++)
{
- if (serialDevice[i].channel == channel)
+ if (serialDevice[i].device &&
+ strcmp(serialDevice[i].device, dev_name) == 0)
{
- DEBUG_CRITICAL2("Channel %s already in use", dev_name);
+ DEBUG_CRITICAL2("Device %s already in use", dev_name);
return STATUS_UNSUCCESSFUL;
}
}
@@ -475,7 +489,7 @@
}
/* set channel used */
- serialDevice[reader].channel = channel;
+ serialDevice[reader].device = strdup(dev_name);
/* empty in and out serial buffers */
if (tcflush(serialDevice[reader].fd, TCIOFLUSH))
@@ -527,7 +541,7 @@
serialDevice[reader].buffer_offset_last = 0;
return STATUS_SUCCESS;
-} /* OpenSerial */
+} /* OpenSerialByName */
/*****************************************************************************
@@ -540,9 +554,10 @@
int reader = LunToReaderIndex(lun);
close(serialDevice[reader].fd);
-
serialDevice[reader].fd = -1;
- serialDevice[reader].channel = -1;
+
+ free(serialDevice[reader].device);
+ serialDevice[reader].device = NULL;
return STATUS_SUCCESS;
} /* CloseSerial */