continue looping over the readers if one fails during setup

also continues if a reader fails when selecting (no applet)
This commit is contained in:
Klas Lindfors
2015-08-20 09:25:18 +02:00
parent 89a212c831
commit 81f3b608fd
+26 -25
View File
@@ -165,39 +165,26 @@ ykpiv_rc ykpiv_connect(ykpiv_state *state, const char *wanted) {
return YKPIV_PCSC_ERROR; return YKPIV_PCSC_ERROR;
} }
reader_ptr = reader_buf; for(reader_ptr = reader_buf; *reader_ptr != '\0'; reader_ptr += strlen(reader_ptr) + 1) {
if(wanted) { if(wanted) {
while(*reader_ptr != '\0') { if(!strstr(reader_ptr, wanted)) {
if(strstr(reader_ptr, wanted)) {
if(state->verbose) { if(state->verbose) {
fprintf(stderr, "using reader '%s' matching '%s'.\n", reader_ptr, wanted); fprintf(stderr, "skipping reader '%s' since it doesn't match '%s'.\n", reader_ptr, wanted);
}
continue;
}
} }
break;
} else {
if(state->verbose) { if(state->verbose) {
fprintf(stderr, "skipping reader '%s' since it doesn't match.\n", reader_ptr); fprintf(stderr, "trying to connect to reader '%s'.\n", reader_ptr);
} }
reader_ptr += strlen(reader_ptr) + 1;
}
}
}
if(*reader_ptr == '\0') {
if(state->verbose) {
fprintf(stderr, "error: no useable reader found.\n");
}
SCardReleaseContext(state->context);
return YKPIV_PCSC_ERROR;
}
rc = SCardConnect(state->context, reader_ptr, SCARD_SHARE_SHARED, rc = SCardConnect(state->context, reader_ptr, SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T1, &state->card, &active_protocol); SCARD_PROTOCOL_T1, &state->card, &active_protocol);
if(rc != SCARD_S_SUCCESS) if(rc != SCARD_S_SUCCESS)
{ {
if(state->verbose) { if(state->verbose) {
fprintf(stderr, "error: SCardConnect failed, rc=%08lx\n", rc); fprintf(stderr, "SCardConnect failed, rc=%08lx\n", rc);
} }
SCardReleaseContext(state->context); continue;
return YKPIV_PCSC_ERROR;
} }
{ {
@@ -214,15 +201,29 @@ ykpiv_rc ykpiv_connect(ykpiv_state *state, const char *wanted) {
memcpy(apdu.st.data, aid, sizeof(aid)); memcpy(apdu.st.data, aid, sizeof(aid));
if((res = send_data(state, &apdu, data, &recv_len, &sw)) != YKPIV_OK) { if((res = send_data(state, &apdu, data, &recv_len, &sw)) != YKPIV_OK) {
return res; if(state->verbose) {
fprintf(stderr, "Failed communicating with card: '%s'\n", ykpiv_strerror(res));
}
continue;
} else if(sw == 0x9000) { } else if(sw == 0x9000) {
return YKPIV_OK; return YKPIV_OK;
} else {
if(state->verbose) {
fprintf(stderr, "Failed selecting applet: %04x\n", sw);
}
}
}
} }
return YKPIV_APPLET_ERROR; if(*reader_ptr == '\0') {
if(state->verbose) {
fprintf(stderr, "error: no useable reader found.\n");
}
SCardReleaseContext(state->context);
return YKPIV_PCSC_ERROR;
} }
return YKPIV_OK; return YKPIV_GENERIC_ERROR;
} }
ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ, ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ,