From 450cf13e66fb21f0ed8d9dc9cf1a21cca32d438d Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Fri, 3 Aug 2012 14:21:24 +0200 Subject: [PATCH] re-implemented auto-detect feature --- pcsc-relay/src/pcsc.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/pcsc-relay/src/pcsc.c b/pcsc-relay/src/pcsc.c index 8196193..d31a4b0 100644 --- a/pcsc-relay/src/pcsc.c +++ b/pcsc-relay/src/pcsc.c @@ -51,7 +51,8 @@ struct pcsc_data { -unsigned int readernum = -1; +#define READERNUM_AUTODETECT -1 +unsigned int readernum = READERNUM_AUTODETECT; static int pcsc_connect(driver_data_t **driver_data) @@ -60,6 +61,7 @@ static int pcsc_connect(driver_data_t **driver_data) LONG r; DWORD readerslen = SCARD_AUTOALLOCATE; + SCARD_READERSTATE state; LPSTR readers = NULL; char *reader; size_t l, i; @@ -94,8 +96,24 @@ static int pcsc_connect(driver_data_t **driver_data) for (reader = readers, i = 0; readerslen > 0; l = strlen(reader)+1, readerslen -= l, reader += l, i++) { - if (i == readernum) - break; + if (i == readernum || readernum == READERNUM_AUTODETECT) { + state.szReader = reader; + state.dwCurrentState = SCARD_STATE_UNAWARE; + + r = SCardGetStatusChange(data->hContext, 0, &state, 1); + if (r != SCARD_S_SUCCESS) { + RELAY_ERROR("Could not get status of %s\n", reader); + goto err; + } + + if (state.dwEventState & SCARD_STATE_PRESENT) + break; + + if (i == readernum) { + RELAY_ERROR("No card present in %s\n", reader); + goto err; + } + } } if (readerslen <= 0) { RELAY_ERROR("Could not find reader number %u\n", readernum);