From 837a54744a84651c8e418c98efc0c1b5078c18ba Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Tue, 21 Mar 2017 22:19:40 +0100 Subject: [PATCH] pcsc-relay: added compatibility with Apple's PC/SC --- pcsc-relay/configure.ac | 1 + pcsc-relay/src/pcsc.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pcsc-relay/configure.ac b/pcsc-relay/configure.ac index f130323..8ff84fe 100644 --- a/pcsc-relay/configure.ac +++ b/pcsc-relay/configure.ac @@ -78,6 +78,7 @@ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $PCSC_CFLAGS $LIBNFC_CFLAGS" AC_CHECK_HEADERS(winscard.h, [], [ AC_MSG_ERROR([winscard.h not found, install PC/SC Lite or similar or use ./configure PCSC_CFLAGS=...]) ]) AC_CHECK_HEADERS(reader.h, [AC_DEFINE(HAVE_READER_H, 1, [use reader.h from PC/SC Lite])], []) +AC_CHECK_HEADERS(wintypes.h, [AC_DEFINE(HAVE_WINTYPES_H, 1, [use wintypes.h from PC/SC Lite])], []) AC_CHECK_HEADERS(pcsclite.h, [AC_DEFINE(HAVE_PCSCLITE_H, 1, [use pcsclite.h from PC/SC Lite])], []) AC_CHECK_HEADERS(nfc/nfc.h,, [ have_libnfc="no"]) CPPFLAGS="$saved_CPPFLAGS" diff --git a/pcsc-relay/src/pcsc.c b/pcsc-relay/src/pcsc.c index 4004ec0..3f2b0e1 100644 --- a/pcsc-relay/src/pcsc.c +++ b/pcsc-relay/src/pcsc.c @@ -34,6 +34,10 @@ #define SCARD_PROTOCOL_ANY (SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1) #endif +#ifdef HAVE_WINTYPES_H +#include +#endif + #ifdef HAVE_READER_H #include #endif @@ -60,7 +64,7 @@ static int pcsc_connect(driver_data_t **driver_data) struct pcsc_data *data; LONG r; - DWORD readerslen = SCARD_AUTOALLOCATE; + DWORD readerslen; SCARD_READERSTATE state; LPSTR readers = NULL; char *reader; @@ -86,7 +90,22 @@ static int pcsc_connect(driver_data_t **driver_data) } +#ifdef SCARD_AUTOALLOCATE + readerslen = SCARD_AUTOALLOCATE; r = SCardListReaders(data->hContext, NULL, (LPSTR) &readers, &readerslen); +#else + r = SCardListReaders(data->hContext, NULL, NULL, &readerslen); + if (r != SCARD_S_SUCCESS) { + RELAY_ERROR("Could not get readers length\n"); + goto err; + } + readers = malloc(readerslen); + if (readers == NULL) { + RELAY_ERROR("Could not get memory\n"); + goto err; + } + r = SCardListReaders(data->hContext, NULL, readers, &readerslen); +#endif if (r != SCARD_S_SUCCESS) { RELAY_ERROR("Could not get readers\n"); goto err; @@ -151,7 +170,11 @@ static int pcsc_disconnect(driver_data_t *driver_data) if (data) { SCardDisconnect(data->hCard, SCARD_LEAVE_CARD); +#ifdef SCARD_AUTOALLOCATE SCardFreeMemory(data->hContext, data->readers); +#else + free(data->readers); +#endif SCardReleaseContext(data->hContext); free(data); }