[PATCH] open_pcsc_reader_wrapped should have same behavior as open_pcsc_reader_direct
NIIBE Yutaka
gniibe at fsij.org
Tue Oct 30 06:35:35 CET 2012
I think that open_pcsc_reader_wrapped should be as same as
open_pcsc_reader_direct.
Currently, pcsc_no_service is only set by open_pcsc_reader_direct.
The patch below (against STABLE-BRANCH-2-0) fixes this. Compiled
and tested lightly.
Mostly same patch can be applied to master, too.
diff --git a/scd/apdu.c b/scd/apdu.c
index 0ce1c51..b369a26 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -221,6 +221,7 @@ static char (* DLSTDCALL CT_close) (unsigned short ctn);
#define PCSC_E_SYSTEM_CANCELLED 0x80100012
#define PCSC_E_NOT_TRANSACTED 0x80100016
#define PCSC_E_READER_UNAVAILABLE 0x80100017
+#define PCSC_E_NO_SERVICE 0x8010001D
#define PCSC_W_REMOVED_CARD 0x80100069
#define CM_IOCTL_GET_FEATURE_REQUEST (0x42000000 + 3400)
@@ -1711,7 +1712,7 @@ open_pcsc_reader_direct (const char *portstr)
pcsc_error_string (err), err);
reader_table[slot].used = 0;
unlock_slot (slot);
- if (err == 0x8010001d)
+ if (err == PCSC_E_NO_SERVICE)
pcsc_no_service = 1;
return -1;
}
@@ -1819,6 +1820,7 @@ open_pcsc_reader_wrapped (const char *portstr)
{
log_error ("can't run PC/SC access module `%s': %s\n",
wrapperpgm, strerror (errno));
+ pcsc_no_service = 1;
return -1;
}
@@ -1918,6 +1920,8 @@ open_pcsc_reader_wrapped (const char *portstr)
;
#undef WAIT
+ pcsc_no_service = 1;
+
/* Now send the open request. */
msgbuf[0] = 0x01; /* OPEN command. */
len = portstr? strlen (portstr):0;
@@ -1950,10 +1954,15 @@ open_pcsc_reader_wrapped (const char *portstr)
{
log_error ("PC/SC returned a too large ATR (len=%lx)\n",
(unsigned long)len);
+ pcsc_no_service = 0;
goto command_failed;
}
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16)
| (msgbuf[7] << 8 ) | msgbuf[8]);
+
+ if (err != PCSC_E_NO_SERVICE)
+ pcsc_no_service = 0;
+
if (err)
{
log_error ("PC/SC OPEN failed: %s (0x%08x)\n",
More information about the Gnupg-devel
mailing list