[Pcsclite-cvs-commit] r5217 - in /trunk/PCSC/src: eventhandler.c eventhandler.h pcscdaemon.c readerfactory.c readerfactory.h

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Thu Sep 2 10:53:33 UTC 2010


Author: rousseau
Date: Thu Sep  2 10:53:31 2010
New Revision: 5217

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=5217
Log:
Wait until all connected readers have a chance to power up a possibly
inserted card.

This is needed when auto start is used and a card is already present in
a USB reader.  The reader presence is correctly reported to libpcsclite
but the power up has not yet happen. So the ATR is not yet available.

Modified:
    trunk/PCSC/src/eventhandler.c
    trunk/PCSC/src/eventhandler.h
    trunk/PCSC/src/pcscdaemon.c
    trunk/PCSC/src/readerfactory.c
    trunk/PCSC/src/readerfactory.h

Modified: trunk/PCSC/src/eventhandler.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/eventhandler.c?rev=5217&op=diff
==============================================================================
--- trunk/PCSC/src/eventhandler.c (original)
+++ trunk/PCSC/src/eventhandler.c Thu Sep  2 10:53:31 2010
@@ -193,7 +193,7 @@
 		sizeof(rContext->readerState->cardAtr));
 	rContext->readerState->readerState = 0;
 	rContext->readerState->readerSharing = 0;
-	rContext->readerState->cardAtrLength = 0;
+	rContext->readerState->cardAtrLength = READER_NOT_INITIALIZED;
 	rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED;
 
 	/* Zero the thread */

Modified: trunk/PCSC/src/eventhandler.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/eventhandler.h?rev=5217&op=diff
==============================================================================
--- trunk/PCSC/src/eventhandler.h (original)
+++ trunk/PCSC/src/eventhandler.h Thu Sep  2 10:53:31 2010
@@ -57,6 +57,11 @@
 /** Some defines for context stack. */
 #define SCARD_EXCLUSIVE_CONTEXT -1
 
+/** Special value to indicate that power up has not yet happen
+ * This is used to auto start mode to wait until the reader is
+ * ready and the (possible) card has been powered up */
+#define READER_NOT_INITIALIZED (MAX_ATR_SIZE+1)
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/PCSC/src/pcscdaemon.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/pcscdaemon.c?rev=5217&op=diff
==============================================================================
--- trunk/PCSC/src/pcscdaemon.c (original)
+++ trunk/PCSC/src/pcscdaemon.c Thu Sep  2 10:53:31 2010
@@ -601,6 +601,8 @@
 		Log1(PCSC_LOG_ERROR, "HPRegisterForHotplugEvents failed");
 		at_exit();
 	}
+
+	RFWaitForReaderInit();
 #endif
 
 	/*

Modified: trunk/PCSC/src/readerfactory.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/readerfactory.c?rev=5217&op=diff
==============================================================================
--- trunk/PCSC/src/readerfactory.c (original)
+++ trunk/PCSC/src/readerfactory.c Thu Sep  2 10:53:31 2010
@@ -94,7 +94,7 @@
 		memset(readerStates[i].cardAtr, 0, MAX_ATR_SIZE);
 		readerStates[i].readerState = 0;
 		readerStates[i].readerSharing = 0;
-		readerStates[i].cardAtrLength = 0;
+		readerStates[i].cardAtrLength = READER_NOT_INITIALIZED;
 		readerStates[i].cardProtocol = SCARD_PROTOCOL_UNDEFINED;
 
 		sReadersContexts[i]->readerState = &readerStates[i];
@@ -1296,6 +1296,40 @@
 	}
 }
 
+/**
+ * Wait until all connected readers have a chance to power up a possibly
+ * inserted card.
+ */
+#ifdef USE_USB
+void RFWaitForReaderInit(void)
+{
+	int i, need_to_wait;
+
+	do
+	{
+		need_to_wait = FALSE;
+		for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++)
+		{
+			/* reader is present */
+			if (sReadersContexts[i]->vHandle != NULL)
+			{
+				/* but card state is not yet available */
+				if (READER_NOT_INITIALIZED
+					== sReadersContexts[i]->readerState->cardAtrLength)
+				{
+					Log2(PCSC_LOG_DEBUG, "Waiting init for reader: %s",
+						sReadersContexts[i]->readerState->readerName);
+					need_to_wait = TRUE;
+				}
+			}
+		}
+
+		if (need_to_wait)
+			SYS_USleep(10*1000); /* 10 ms */
+	} while (need_to_wait);
+}
+#endif
+
 #ifdef USE_SERIAL
 int RFStartSerialReaders(const char *readerconf)
 {

Modified: trunk/PCSC/src/readerfactory.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/readerfactory.h?rev=5217&op=diff
==============================================================================
--- trunk/PCSC/src/readerfactory.h (original)
+++ trunk/PCSC/src/readerfactory.h Thu Sep  2 10:53:31 2010
@@ -165,6 +165,7 @@
 	LONG RFClearReaderEventState(READER_CONTEXT *, SCARDHANDLE);
 	LONG RFCheckReaderStatus(READER_CONTEXT *);
 	void RFCleanupReaders(void);
+	void RFWaitForReaderInit(void);
 	int RFStartSerialReaders(const char *readerconf);
 	void RFReCheckReaderConf(void);
 




More information about the Pcsclite-cvs-commit mailing list