pcsc-relay: added compatibility with Apple's PC/SC

This commit is contained in:
Frank Morgner
2017-03-21 22:19:40 +01:00
parent c2b90a0f10
commit 837a54744a
2 changed files with 25 additions and 1 deletions

View File

@@ -78,6 +78,7 @@ saved_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $PCSC_CFLAGS $LIBNFC_CFLAGS" 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(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(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(pcsclite.h, [AC_DEFINE(HAVE_PCSCLITE_H, 1, [use pcsclite.h from PC/SC Lite])], [])
AC_CHECK_HEADERS(nfc/nfc.h,, [ have_libnfc="no"]) AC_CHECK_HEADERS(nfc/nfc.h,, [ have_libnfc="no"])
CPPFLAGS="$saved_CPPFLAGS" CPPFLAGS="$saved_CPPFLAGS"

View File

@@ -34,6 +34,10 @@
#define SCARD_PROTOCOL_ANY (SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1) #define SCARD_PROTOCOL_ANY (SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1)
#endif #endif
#ifdef HAVE_WINTYPES_H
#include <wintypes.h>
#endif
#ifdef HAVE_READER_H #ifdef HAVE_READER_H
#include <reader.h> #include <reader.h>
#endif #endif
@@ -60,7 +64,7 @@ static int pcsc_connect(driver_data_t **driver_data)
struct pcsc_data *data; struct pcsc_data *data;
LONG r; LONG r;
DWORD readerslen = SCARD_AUTOALLOCATE; DWORD readerslen;
SCARD_READERSTATE state; SCARD_READERSTATE state;
LPSTR readers = NULL; LPSTR readers = NULL;
char *reader; 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); 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) { if (r != SCARD_S_SUCCESS) {
RELAY_ERROR("Could not get readers\n"); RELAY_ERROR("Could not get readers\n");
goto err; goto err;
@@ -151,7 +170,11 @@ static int pcsc_disconnect(driver_data_t *driver_data)
if (data) { if (data) {
SCardDisconnect(data->hCard, SCARD_LEAVE_CARD); SCardDisconnect(data->hCard, SCARD_LEAVE_CARD);
#ifdef SCARD_AUTOALLOCATE
SCardFreeMemory(data->hContext, data->readers); SCardFreeMemory(data->hContext, data->readers);
#else
free(data->readers);
#endif
SCardReleaseContext(data->hContext); SCardReleaseContext(data->hContext);
free(data); free(data);
} }