mirror of
git://git.gnupg.org/gnupg.git
synced 2025-05-24 16:43:28 +02:00
scd: Use SCardStatus for pcsc_get_status.
* scd/apdu.c (pcsc_get_status): Use SCardStatus. -- Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
9995ba51b2
commit
ccfb5e0a7d
62
scd/apdu.c
62
scd/apdu.c
@ -689,69 +689,25 @@ static int
|
|||||||
pcsc_get_status (int slot, unsigned int *status, int on_wire)
|
pcsc_get_status (int slot, unsigned int *status, int on_wire)
|
||||||
{
|
{
|
||||||
long err;
|
long err;
|
||||||
struct pcsc_readerstate_s rdrstates[1];
|
pcsc_dword_t card_state, card_protocol;
|
||||||
|
|
||||||
(void)on_wire;
|
(void)on_wire;
|
||||||
memset (rdrstates, 0, sizeof *rdrstates);
|
err = pcsc_status (reader_table[slot].pcsc.card, NULL, NULL,
|
||||||
rdrstates[0].reader = reader_table[slot].rdrname;
|
&card_state, &card_protocol, NULL, NULL);
|
||||||
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. */
|
|
||||||
if (err)
|
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);
|
pcsc_error_string (err), err);
|
||||||
return pcsc_error_to_sw (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;
|
*status = 0;
|
||||||
if ( (reader_table[slot].pcsc.current_state & PCSC_STATE_PRESENT) )
|
if ((card_state & PCSC_PRESENT))
|
||||||
{
|
*status |= APDU_CARD_PRESENT;
|
||||||
*status |= APDU_CARD_PRESENT;
|
if (card_state & PCSC_POWERED)
|
||||||
if ( !(reader_table[slot].pcsc.current_state & PCSC_STATE_MUTE) )
|
*status |= (APDU_CARD_ACTIVE | APDU_CARD_USABLE);
|
||||||
*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 (!on_wire && (rdrstates[0].event_state & PCSC_STATE_CHANGED))
|
return 0;
|
||||||
/* Event like sleep/resume occurs, which requires RESET. */
|
|
||||||
return SW_HOST_NO_READER;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user