[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 */