diff --git a/configure.ac b/configure.ac index 7e5656bd..86aa7ffa 100644 --- a/configure.ac +++ b/configure.ac @@ -490,7 +490,17 @@ if test "${enable_openct}" = "yes"; then fi if test "${enable_pcsc}" = "yes"; then - AC_DEFINE([ENABLE_PCSC], [1], [Define if PC/SC is to be enabled]) + AC_ARG_VAR([PCSC_CFLAGS], [C compiler flags for pcsc]) + if test "${WIN32}" != "yes"; then + test -z "${PCSC_CFLAGS}" && PCSC_CFLAGS="-I/usr/include/PCSC" + fi + + saved_CFLAGS="${CFLAGS}" + CFLAGS="${CFLAGS} ${PCSC_CFLAGS}" + # We must cope with mingw32 that does not have winscard.h mingw64 has it. + AC_CHECK_HEADERS([winscard.h],,[test "${WIN32}" != "yes" && AC_MSG_ERROR([winscard.h is required for pcsc])]) + CFLAGS="${saved_CFLAGS}" + if test "${with_pcsc_provider}" = "detect"; then case "${host}" in *-*-darwin*) @@ -507,6 +517,7 @@ if test "${enable_pcsc}" = "yes"; then DEFAULT_PCSC_PROVIDER="${with_pcsc_provider}" fi AC_DEFINE_UNQUOTED([DEFAULT_PCSC_PROVIDER], ["${DEFAULT_PCSC_PROVIDER}"], [Default PC/SC provider]) + AC_DEFINE([ENABLE_PCSC], [1], [Define if PC/SC is to be enabled]) fi dnl AM_PATH_LIBASSUAN([MINIMUM-VERSION, @@ -545,7 +556,10 @@ if test "${enable_openct}" = "yes"; then OPTIONAL_OPENCT_CFLAGS="${OPENCT_CFLAGS}" OPTIONAL_OPENCT_LIBS="${OPENCT_LIBS}" fi -test "${enable_pcsc}" = "yes" && OPENSC_FEATURES="${OPENSC_FEATURES} pcsc(${DEFAULT_PCSC_PROVIDER})" +if test "${enable_pcsc}" = "yes"; then + OPENSC_FEATURES="${OPENSC_FEATURES} pcsc(${DEFAULT_PCSC_PROVIDER})" + OPTIONAL_PCSC_CFLAGS="${PCSC_CFLAGS}" +fi test "${enable_nsplugin}" = "yes" && OPENSC_FEATURES="${OPENSC_FEATURES} nsplugin" AC_DEFINE_UNQUOTED([OPENSC_ETC_PATH], ["${full_sysconfdir}"], [etc path for libopensc]) @@ -579,6 +593,7 @@ AC_SUBST([OPTIONAL_OPENSSL_CFLAGS]) AC_SUBST([OPTIONAL_OPENSSL_LIBS]) AC_SUBST([OPTIONAL_OPENCT_CFLAGS]) AC_SUBST([OPTIONAL_OPENCT_LIBS]) +AC_SUBST([OPTIONAL_PCSC_CFLAGS]) AM_CONDITIONAL([SVN_CHECKOUT], [test "${svn_checkout}" = "yes"]) AM_CONDITIONAL([ENABLE_MAN], [test "${enable_man}" = "yes"]) @@ -671,6 +686,7 @@ OPENSSL_CFLAGS: ${OPENSSL_CFLAGS} OPENSSL_LIBS: ${OPENSSL_LIBS} OPENCT_CFLAGS: ${OPENCT_CFLAGS} OPENCT_LIBS: ${OPENCT_LIBS} +PCSC_CFLAGS: ${PCSC_CFLAGS} LIBASSUAN_CFLAGS: ${LIBASSUAN_CFLAGS} LIBASSUAN_LIBS: ${LIBASSUAN_LIBS} diff --git a/src/libopensc/Makefile.am b/src/libopensc/Makefile.am index e3ba715e..efab0ac9 100644 --- a/src/libopensc/Makefile.am +++ b/src/libopensc/Makefile.am @@ -16,7 +16,7 @@ noinst_HEADERS = cards.h ctbcs.h internal.h esteid.h muscle.h muscle-filesystem. pkgconfig_DATA = libopensc.pc libpkcs15init.pc libscconf.pc AM_CFLAGS = $(OPTIONAL_OPENSSL_CFLAGS) $(OPTIONAL_OPENCT_CFLAGS) \ - $(OPTIONAL_ZLIB_CFLAGS) $(LTLIB_CFLAGS) + $(OPTIONAL_PCSC_CFLAGS) $(OPTIONAL_ZLIB_CFLAGS) $(LTLIB_CFLAGS) INCLUDES = -I$(top_builddir)/src/include -I$(top_srcdir)/src/common libopensc_la_SOURCES = \ diff --git a/src/libopensc/internal-winscard.h b/src/libopensc/internal-winscard.h index 1872a873..c370b1c0 100644 --- a/src/libopensc/internal-winscard.h +++ b/src/libopensc/internal-winscard.h @@ -3,19 +3,6 @@ /* Mostly copied from pcsc-lite, this is the minimum required */ -#ifndef _WIN32 -#ifndef BYTE -typedef unsigned char BYTE; -#endif -typedef const void *LPCVOID; -typedef void *LPVOID; -typedef unsigned long DWORD; -typedef long LONG; -typedef const char *LPCSTR; -typedef BYTE *LPBYTE; -typedef DWORD *LPDWORD; -typedef char *LPSTR; -#endif #if defined(HAVE_INTTYPES_H) #include #elif defined(HAVE_STDINT_H) @@ -28,7 +15,11 @@ typedef unsigned __int8 uint8_t; #warning no uint32_t type available, please contact opensc-devel@opensc-project.org #endif -#ifndef _MSC_VER +#ifdef HAVE_WINSCARD_H +#include +#else +/* mingw32 does not have winscard.h */ + #define MAX_ATR_SIZE 33 /**< Maximum ATR size */ #define SCARD_PROTOCOL_T0 0x0001 /**< T=0 active protocol. */ @@ -64,7 +55,6 @@ typedef unsigned __int8 uint8_t; #define SCARD_W_REMOVED_CARD 0x80100069 /**< The smart card has been removed, so further communication is not possible. */ #endif -#define SCARD_CTL_CODE(code) (0x42000000 + (code)) typedef const BYTE *LPCBYTE; typedef long SCARDCONTEXT; /**< \p hContext returned by SCardEstablishContext() */ @@ -92,7 +82,11 @@ typedef struct _SCARD_IO_REQUEST } SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; -#endif /* MSC_VER */ +typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST; +typedef SCARD_READERSTATE_A SCARD_READERSTATE, *PSCARD_READERSTATE_A, + *LPSCARD_READERSTATE_A; + +#endif /* HAVE_SCARD_H */ #if defined(_WIN32) #define PCSC_API WINAPI @@ -102,10 +96,6 @@ SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; #define PCSC_API #endif -typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST; -typedef SCARD_READERSTATE_A SCARD_READERSTATE, *PSCARD_READERSTATE_A, - *LPSCARD_READERSTATE_A; - typedef LONG (PCSC_API *SCardEstablishContext_t)(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext); typedef LONG (PCSC_API *SCardReleaseContext_t)(SCARDCONTEXT hContext); @@ -133,6 +123,10 @@ typedef LONG (PCSC_API *SCardListReaders_t)(SCARDCONTEXT hContext, LPCSTR mszGro /* Copied from pcsc-lite reader.h */ +#ifndef SCARD_CTL_CODE +#define SCARD_CTL_CODE(code) (0x42000000 + (code)) +#endif + /** * TeleTrust Class 2 reader tags */