[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