re-implemented auto-detect feature
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user