re-implemented auto-detect feature

This commit is contained in:
Frank Morgner
2012-08-03 14:21:24 +02:00
parent 26591f431e
commit 450cf13e66

View File

@@ -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) static int pcsc_connect(driver_data_t **driver_data)
@@ -60,6 +61,7 @@ static int pcsc_connect(driver_data_t **driver_data)
LONG r; LONG r;
DWORD readerslen = SCARD_AUTOALLOCATE; DWORD readerslen = SCARD_AUTOALLOCATE;
SCARD_READERSTATE state;
LPSTR readers = NULL; LPSTR readers = NULL;
char *reader; char *reader;
size_t l, i; size_t l, i;
@@ -94,8 +96,24 @@ static int pcsc_connect(driver_data_t **driver_data)
for (reader = readers, i = 0; readerslen > 0; for (reader = readers, i = 0; readerslen > 0;
l = strlen(reader)+1, readerslen -= l, reader += l, i++) { l = strlen(reader)+1, readerslen -= l, reader += l, i++) {
if (i == readernum) if (i == readernum || readernum == READERNUM_AUTODETECT) {
break; 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) { if (readerslen <= 0) {
RELAY_ERROR("Could not find reader number %u\n", readernum); RELAY_ERROR("Could not find reader number %u\n", readernum);