From d7941bf85032e40b4159b94b643ec538785d7def Mon Sep 17 00:00:00 2001 From: alonbl Date: Mon, 27 Oct 2008 19:16:28 +0000 Subject: [PATCH] Re-add pcsc-lite compile-time dependency Win64 changed the SCARDCONTEXT from LONG to ULONG_PTR, pcsc-lite did not follow this on 64bit platforms. This breaks the pcsc module. To solve this we use installed winscard.h in order to get proper declerations. As mingw32 does not have winscard.h we keep current types. mingw64 and pcsc-lite system have winscard.h. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3590 c6295689-39f2-0310-b995-f0e70906c6a9 --- configure.ac | 20 ++++++++++++++++-- src/libopensc/Makefile.am | 2 +- src/libopensc/internal-winscard.h | 34 +++++++++++++------------------ 3 files changed, 33 insertions(+), 23 deletions(-) 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 */