diff --git a/scd/apdu.c b/scd/apdu.c index 0ce1c513e..b369a268c 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",