[pkg-opensc-commit] [opensc] 44/295: reader-pcsc: improved logging and handling of reset

Eric Dorland eric at moszumanska.debian.org
Sat Jun 24 21:11:14 UTC 2017


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository opensc.

commit 0d6fc02e231d91b668a1ae8eef0e3f9c808aabff
Author: Doug Engert <deengert at gmail.com>
Date:   Sat Jun 11 16:08:57 2016 -0500

    reader-pcsc: improved logging and handling of reset
    
    A sleep(1) is added after SCARD_W_CARD_RESET as done in other parts of reader-pcsc.c
    
    Extra debugging messages are output.
    
    SCard routines return "LONG" which may be different then "long" on some systems
    were "LONG" is 32 bits and "long" is 64 bits.
    Make sure printf format of 0x%08lx has a matching "long" input variable.
    
    This closes #816
---
 src/libopensc/reader-pcsc.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c
index 94af43e..304a14e 100644
--- a/src/libopensc/reader-pcsc.c
+++ b/src/libopensc/reader-pcsc.c
@@ -57,8 +57,8 @@
 #define SCARD_ATTR_VENDOR_IFD_VERSION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102) /**< Vendor-supplied interface device version (DWORD in the form 0xMMmmbbbb where MM = major version, mm = minor version, and bbbb = build number). */
 
 /* Logging */
-#define PCSC_TRACE(reader, desc, rv) do { sc_log(reader->ctx, "%s:" desc ": 0x%08lx\n", reader->name, rv); } while (0)
-#define PCSC_LOG(ctx, desc, rv) do { sc_log(ctx, desc ": 0x%08lx\n", rv); } while (0)
+#define PCSC_TRACE(reader, desc, rv) do { sc_log(reader->ctx, "%s:" desc ": 0x%08lx\n", reader->name, (unsigned long)((ULONG)rv)); } while (0)
+#define PCSC_LOG(ctx, desc, rv) do { sc_log(ctx, desc ": 0x%08lx\n", (unsigned long)((ULONG)rv)); } while (0)
 
 /* Utility for handling big endian IOCTL codes. */
 #define dw2i_be(a, x) ((((((a[x] << 8) + a[x+1]) << 8) + a[x+2]) << 8) + a[x+3])
@@ -459,6 +459,8 @@ static int pcsc_reconnect(sc_reader_t * reader, DWORD action)
 			    priv->gpriv->connect_exclusive ? SCARD_SHARE_EXCLUSIVE : SCARD_SHARE_SHARED,
 			    protocol, action, &active_proto);
 
+	
+	PCSC_TRACE(reader, "SCardReconnect returned", rv);
 	if (rv != SCARD_S_SUCCESS) {
 		PCSC_TRACE(reader, "SCardReconnect failed", rv);
 		return pcsc_to_opensc_error(rv);
@@ -529,11 +531,14 @@ static int pcsc_connect(sc_reader_t *reader)
 static int pcsc_disconnect(sc_reader_t * reader)
 {
 	struct pcsc_private_data *priv = GET_PRIV_DATA(reader);
+	LONG rv;
 
 	LOG_FUNC_CALLED(reader->ctx);
 
-	if (!(reader->ctx->flags & SC_CTX_FLAG_TERMINATE))
-		priv->gpriv->SCardDisconnect(priv->pcsc_card, priv->gpriv->disconnect_action);
+	if (!(reader->ctx->flags & SC_CTX_FLAG_TERMINATE)) {
+		rv = priv->gpriv->SCardDisconnect(priv->pcsc_card, priv->gpriv->disconnect_action);
+		PCSC_TRACE(reader, "SCardDisconnect returned", rv);
+	}
 	reader->flags = 0;
 	return SC_SUCCESS;
 }
@@ -551,6 +556,10 @@ static int pcsc_lock(sc_reader_t *reader)
 
 	rv = priv->gpriv->SCardBeginTransaction(priv->pcsc_card);
 
+
+	if (rv != SCARD_S_SUCCESS)
+	    PCSC_TRACE(reader, "SCardBeginTransaction returned", rv);
+
 	switch (rv) {
 		case SCARD_E_INVALID_HANDLE:
 		case SCARD_E_READER_UNAVAILABLE:
@@ -563,6 +572,7 @@ static int pcsc_lock(sc_reader_t *reader)
 			return SC_ERROR_READER_REATTACHED;
 		case SCARD_W_RESET_CARD:
 			/* try to reconnect if the card was reset by some other application */
+			PCSC_TRACE(reader, "SCardBeginTransaction calling pcsc_reconnect", rv);
 			r = pcsc_reconnect(reader, SCARD_LEAVE_CARD);
 			if (r != SC_SUCCESS) {
 				sc_log(reader->ctx, "pcsc_reconnect failed", r);
@@ -1225,6 +1235,7 @@ static int pcsc_detect_readers(sc_context_t *ctx)
 			goto err1;
 		}
 
+		/* TODO need to check return codes */
 		refresh_attributes(reader);
 
 		/* check for pinpad support early, to allow opensc-tool -l display accurate information */
@@ -2492,6 +2503,7 @@ int cardmod_use_reader(sc_context_t *ctx, void * pcsc_context_handle, void * pcs
 		}
 
 
+		/* TODO should check return codes */
 		refresh_attributes(reader);
 
 		ret = SC_SUCCESS;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-opensc/opensc.git



More information about the pkg-opensc-commit mailing list