aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2021-05-13 03:12:33 +0000
committerNIIBE Yutaka <[email protected]>2021-05-13 03:12:33 +0000
commitccfb5e0a7dc6c046165f018311ec6d45b01c75b9 (patch)
treeb0c14be7fff8dc3585848ef6e769b5542c855488
parentscd: Handle the error code of PCSC_E_READER_UNAVAILABLE. (diff)
downloadgnupg-ccfb5e0a7dc6c046165f018311ec6d45b01c75b9.tar.gz
gnupg-ccfb5e0a7dc6c046165f018311ec6d45b01c75b9.zip
scd: Use SCardStatus for pcsc_get_status.
* scd/apdu.c (pcsc_get_status): Use SCardStatus. -- Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--scd/apdu.c62
1 files changed, 9 insertions, 53 deletions
diff --git a/scd/apdu.c b/scd/apdu.c
index b189c523c..5e37e2289 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -689,69 +689,25 @@ static int
pcsc_get_status (int slot, unsigned int *status, int on_wire)
{
long err;
- struct pcsc_readerstate_s rdrstates[1];
+ pcsc_dword_t card_state, card_protocol;
(void)on_wire;
- memset (rdrstates, 0, sizeof *rdrstates);
- rdrstates[0].reader = reader_table[slot].rdrname;
- rdrstates[0].current_state = reader_table[slot].pcsc.current_state;
- err = pcsc_get_status_change (pcsc.context, 0, rdrstates, 1);
- if (err == PCSC_E_TIMEOUT)
- err = 0; /* Timeout is no error here. */
+ err = pcsc_status (reader_table[slot].pcsc.card, NULL, NULL,
+ &card_state, &card_protocol, NULL, NULL);
if (err)
{
- log_error ("pcsc_get_status_change failed: %s (0x%lx)\n",
+ log_error ("pcsc_status failed: %s (0x%lx)\n",
pcsc_error_string (err), err);
return pcsc_error_to_sw (err);
}
- if ((rdrstates[0].event_state & PCSC_STATE_CHANGED))
- reader_table[slot].pcsc.current_state =
- (rdrstates[0].event_state & ~PCSC_STATE_CHANGED);
-
- if (DBG_READER)
- log_debug
- ("pcsc_get_status_change: %s%s%s%s%s%s%s%s%s%s\n",
- (rdrstates[0].event_state & PCSC_STATE_IGNORE)? " ignore":"",
- (rdrstates[0].event_state & PCSC_STATE_CHANGED)? " changed":"",
- (rdrstates[0].event_state & PCSC_STATE_UNKNOWN)? " unknown":"",
- (rdrstates[0].event_state & PCSC_STATE_UNAVAILABLE)?" unavail":"",
- (rdrstates[0].event_state & PCSC_STATE_EMPTY)? " empty":"",
- (rdrstates[0].event_state & PCSC_STATE_PRESENT)? " present":"",
- (rdrstates[0].event_state & PCSC_STATE_ATRMATCH)? " atr":"",
- (rdrstates[0].event_state & PCSC_STATE_EXCLUSIVE)? " excl":"",
- (rdrstates[0].event_state & PCSC_STATE_INUSE)? " inuse":"",
- (rdrstates[0].event_state & PCSC_STATE_MUTE)? " mute":"" );
-
*status = 0;
- if ( (reader_table[slot].pcsc.current_state & PCSC_STATE_PRESENT) )
- {
- *status |= APDU_CARD_PRESENT;
- if ( !(reader_table[slot].pcsc.current_state & PCSC_STATE_MUTE) )
- *status |= APDU_CARD_ACTIVE;
- }
-#ifndef HAVE_W32_SYSTEM
- /* We indicate a useful card if it is not in use by another
- application. This is because we only use exclusive access
- mode. */
- if ( (*status & (APDU_CARD_PRESENT|APDU_CARD_ACTIVE))
- == (APDU_CARD_PRESENT|APDU_CARD_ACTIVE)
- && (opt.pcsc_shared
- || !(reader_table[slot].pcsc.current_state & PCSC_STATE_INUSE)))
- *status |= APDU_CARD_USABLE;
-#else
- /* Some winscard drivers may set EXCLUSIVE and INUSE at the same
- time when we are the only user (SCM SCR335) under Windows. */
- if ((*status & (APDU_CARD_PRESENT|APDU_CARD_ACTIVE))
- == (APDU_CARD_PRESENT|APDU_CARD_ACTIVE))
- *status |= APDU_CARD_USABLE;
-#endif
+ if ((card_state & PCSC_PRESENT))
+ *status |= APDU_CARD_PRESENT;
+ if (card_state & PCSC_POWERED)
+ *status |= (APDU_CARD_ACTIVE | APDU_CARD_USABLE);
- if (!on_wire && (rdrstates[0].event_state & PCSC_STATE_CHANGED))
- /* Event like sleep/resume occurs, which requires RESET. */
- return SW_HOST_NO_READER;
- else
- return 0;
+ return 0;
}