diff --git a/src/libopensc/card.c b/src/libopensc/card.c index e7696b70..d19430fe 100644 --- a/src/libopensc/card.c +++ b/src/libopensc/card.c @@ -326,7 +326,8 @@ int sc_connect_card(struct sc_context *ctx, rgReaderStates[0].szReader = ctx->readers[reader]; rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE; - rv = SCardGetStatusChange(ctx->pcsc_ctx, 0, rgReaderStates, 1); + rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE; + rv = SCardGetStatusChange(ctx->pcsc_ctx, SC_STATUS_TIMEOUT, rgReaderStates, 1); if (rv != 0) { error(ctx, "SCardGetStatusChange failed: %s\n", pcsc_stringify_error(rv)); SC_FUNC_RETURN(ctx, 1, SC_ERROR_RESOURCE_MANAGER); /* FIXME */ diff --git a/src/libopensc/internal.h b/src/libopensc/internal.h index 8501233a..85928747 100644 --- a/src/libopensc/internal.h +++ b/src/libopensc/internal.h @@ -33,4 +33,10 @@ /* Internal use only */ int sc_sw_to_errorcode(struct sc_card *card, int sw1, int sw2); +/* Default timeout value for SCardGetStatusChange */ +#ifndef SC_CUSTOM_STATUS_TIMEOUT +#define SC_STATUS_TIMEOUT 0 +#else SC_STATUS_TIMEOUT SC_CUSTOM_STATUS_TIMEOUT +#endif + #endif diff --git a/src/libopensc/sc-internal.h b/src/libopensc/sc-internal.h index 8501233a..85928747 100644 --- a/src/libopensc/sc-internal.h +++ b/src/libopensc/sc-internal.h @@ -33,4 +33,10 @@ /* Internal use only */ int sc_sw_to_errorcode(struct sc_card *card, int sw1, int sw2); +/* Default timeout value for SCardGetStatusChange */ +#ifndef SC_CUSTOM_STATUS_TIMEOUT +#define SC_STATUS_TIMEOUT 0 +#else SC_STATUS_TIMEOUT SC_CUSTOM_STATUS_TIMEOUT +#endif + #endif diff --git a/src/libopensc/sc.c b/src/libopensc/sc.c index 71631d52..429ee18b 100644 --- a/src/libopensc/sc.c +++ b/src/libopensc/sc.c @@ -79,7 +79,8 @@ int sc_detect_card(struct sc_context *ctx, int reader) rgReaderStates[0].szReader = ctx->readers[reader]; rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE; - ret = SCardGetStatusChange(ctx->pcsc_ctx, 0, rgReaderStates, 1); + rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE; + ret = SCardGetStatusChange(ctx->pcsc_ctx, SC_STATUS_TIMEOUT, rgReaderStates, 1); if (ret != 0) { error(ctx, "SCardGetStatusChange failed: %s\n", pcsc_stringify_error(ret)); SC_FUNC_RETURN(ctx, 1, -1); /* FIXME */ @@ -110,17 +111,17 @@ int sc_wait_for_card(struct sc_context *ctx, int reader, int timeout) SC_FUNC_RETURN(ctx, 1, SC_ERROR_NO_READERS_FOUND); for (i = 0; i < ctx->reader_count; i++) { rgReaderStates[i].szReader = ctx->readers[i]; - rgReaderStates[i].dwCurrentState = - SCARD_STATE_EMPTY; + rgReaderStates[i].dwCurrentState = SCARD_STATE_UNAWARE; + rgReaderStates[i].dwEventState = SCARD_STATE_UNAWARE; } count = ctx->reader_count; } else { rgReaderStates[0].szReader = ctx->readers[reader]; - rgReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY; + rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE; + rgReaderStates[0].dwEventState = SCARD_STATE_UNAWARE; count = 1; } - ret = SCardGetStatusChange(ctx->pcsc_ctx, timeout, rgReaderStates, - count); + ret = SCardGetStatusChange(ctx->pcsc_ctx, timeout, rgReaderStates, count); if (ret != 0) { error(ctx, "SCardGetStatusChange failed: %s\n", pcsc_stringify_error(ret)); SC_FUNC_RETURN(ctx, 1, -1);