pcsc-relay: added compatibility with Apple's PC/SC
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user