1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-23 10:29:58 +01:00

SCD: Upon error, open_pcsc_reader_wrapped does same as _direct.

* scd/apdu.c (PCSC_E_NO_SERVICE): New.
(open_pcsc_reader_direct): Use PCSC_E_NO_SERVICE.
(open_pcsc_reader_wrapped): Set pcsc_no_service.
This commit is contained in:
NIIBE Yutaka 2012-10-31 11:02:58 +09:00
parent 51a4df9d4a
commit 80a34c0b50

View File

@ -221,6 +221,7 @@ static char (* DLSTDCALL CT_close) (unsigned short ctn);
#define PCSC_E_SYSTEM_CANCELLED 0x80100012 #define PCSC_E_SYSTEM_CANCELLED 0x80100012
#define PCSC_E_NOT_TRANSACTED 0x80100016 #define PCSC_E_NOT_TRANSACTED 0x80100016
#define PCSC_E_READER_UNAVAILABLE 0x80100017 #define PCSC_E_READER_UNAVAILABLE 0x80100017
#define PCSC_E_NO_SERVICE 0x8010001D
#define PCSC_W_REMOVED_CARD 0x80100069 #define PCSC_W_REMOVED_CARD 0x80100069
#define CM_IOCTL_GET_FEATURE_REQUEST (0x42000000 + 3400) #define CM_IOCTL_GET_FEATURE_REQUEST (0x42000000 + 3400)
@ -1711,7 +1712,7 @@ open_pcsc_reader_direct (const char *portstr)
pcsc_error_string (err), err); pcsc_error_string (err), err);
reader_table[slot].used = 0; reader_table[slot].used = 0;
unlock_slot (slot); unlock_slot (slot);
if (err == 0x8010001d) if (err == PCSC_E_NO_SERVICE)
pcsc_no_service = 1; pcsc_no_service = 1;
return -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", log_error ("can't run PC/SC access module `%s': %s\n",
wrapperpgm, strerror (errno)); wrapperpgm, strerror (errno));
pcsc_no_service = 1;
return -1; return -1;
} }
@ -1918,6 +1920,8 @@ open_pcsc_reader_wrapped (const char *portstr)
; ;
#undef WAIT #undef WAIT
pcsc_no_service = 1;
/* Now send the open request. */ /* Now send the open request. */
msgbuf[0] = 0x01; /* OPEN command. */ msgbuf[0] = 0x01; /* OPEN command. */
len = portstr? strlen (portstr):0; 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", log_error ("PC/SC returned a too large ATR (len=%lx)\n",
(unsigned long)len); (unsigned long)len);
pcsc_no_service = 0;
goto command_failed; goto command_failed;
} }
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16)
| (msgbuf[7] << 8 ) | msgbuf[8]); | (msgbuf[7] << 8 ) | msgbuf[8]);
if (err != PCSC_E_NO_SERVICE)
pcsc_no_service = 0;
if (err) if (err)
{ {
log_error ("PC/SC OPEN failed: %s (0x%08x)\n", log_error ("PC/SC OPEN failed: %s (0x%08x)\n",