libwinpr-smartcard: add option to build statically against specialized pcsclite build

This commit is contained in:
Marc-André Moreau 2014-04-08 01:26:28 -04:00
parent 8cc37ff759
commit 3a428b87df
6 changed files with 205 additions and 8 deletions

View File

@ -341,6 +341,8 @@ else()
set(X11_FEATURE_TYPE "DISABLED")
endif()
find_package(PCSCWinPR)
set(X11_FEATURE_PURPOSE "X11")
set(X11_FEATURE_DESCRIPTION "X11 client and server")

View File

@ -5,16 +5,17 @@
# PCSC_LIBRARIES - libraries needed for linking
include(FindPkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PC_PCSC QUIET libpcsclite)
if(PKG_CONFIG_FOUND)
pkg_check_modules(PC_PCSC QUIET libpcsclite)
endif()
find_path(PCSC_INCLUDE_DIR pcsclite.h WinSCard.h
HINTS ${PC_PCSC_INCLUDEDIR} ${PC_PCSC_INCLUDE_DIRS}
PATH_SUFFIXES PCSC)
HINTS ${PC_PCSC_INCLUDEDIR} ${PC_PCSC_INCLUDE_DIRS}
PATH_SUFFIXES PCSC)
find_library(PCSC_LIBRARY NAMES PCSC WinSCard pcsclite
HINTS ${PC_PCSC_LIBDIR} ${PC_PCSC_LIBRARY_DIRS})
HINTS ${PC_PCSC_LIBDIR} ${PC_PCSC_LIBRARY_DIRS})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PCSC DEFAULT_MSG PCSC_LIBRARY PCSC_INCLUDE_DIR)
@ -24,3 +25,4 @@ set(PCSC_INCLUDE_DIRS ${PCSC_INCLUDE_DIR})
mark_as_advanced(PCSC_INCLUDE_DIR PCSC_LIBRARY)

15
cmake/FindPCSCWinPR.cmake Normal file
View File

@ -0,0 +1,15 @@
find_library(PCSC_WINPR_LIBRARY
NAMES libpcsc-winpr.a
PATHS
/opt/lib
/usr/lib
/usr/local/lib
)
if(NOT ${PCSC_WINPR_LIBRARY} MATCHES ".*-NOTFOUND")
set(PCSC_WINPR_FOUND 1)
message(STATUS "Found PCSC-WinPR: ${PCSC_WINPR_LIBRARY}")
endif()
mark_as_advanced(PCSC_WINPR_LIBRARY)

View File

@ -18,9 +18,14 @@
set(MODULE_NAME "winpr-smartcard")
set(MODULE_PREFIX "WINPR_SMARTCARD")
if(PCSC_WINPR_FOUND)
add_definitions(-DWITH_WINPR_PCSC)
endif()
set(${MODULE_PREFIX}_SRCS
smartcard.c
smartcard.h
smartcard_link.c
smartcard_pcsc.c
smartcard_pcsc.h
smartcard_winscard.c
@ -41,6 +46,10 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS
MODULE winpr
MODULES winpr-crt winpr-library)
if(PCSC_WINPR_FOUND)
list(APPEND ${MODULE_PREFIX}_LIBS ${PCSC_WINPR_LIBRARY})
endif()
if(MONOLITHIC_BUILD)
set(WINPR_LIBS ${WINPR_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE)
else()

View File

@ -0,0 +1,142 @@
/**
* WinPR: Windows Portable Runtime
* Smart Card API
*
* Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* libpcsc-winpr.a:
*
* Add the WinPR_PCSC_* definitions
* to pcsc-lite/src/PCSC/winscard.h
*
* Configure project as static in a local prefix:
* ./configure --enable-static --prefix=/usr/local
*
* Install, and then rename
* libpcsclite.a to libpcsc-winpr.a
*
* This static library will contain a non-conflicting ABI
* so we can safely link to it with and import its functions.
*/
#if 0
#define WinPR_PCSC
#define SCardEstablishContext WinPR_PCSC_SCardEstablishContext
#define SCardReleaseContext WinPR_PCSC_SCardReleaseContext
#define SCardIsValidContext WinPR_PCSC_SCardIsValidContext
#define SCardConnect WinPR_PCSC_SCardConnect
#define SCardReconnect WinPR_PCSC_SCardReconnect
#define SCardDisconnect WinPR_PCSC_SCardDisconnect
#define SCardBeginTransaction WinPR_PCSC_SCardBeginTransaction
#define SCardEndTransaction WinPR_PCSC_SCardEndTransaction
#define SCardStatus WinPR_PCSC_SCardStatus
#define SCardGetStatusChange WinPR_PCSC_SCardGetStatusChange
#define SCardControl WinPR_PCSC_SCardControl
#define SCardTransmit WinPR_PCSC_SCardTransmit
#define SCardListReaderGroups WinPR_PCSC_SCardListReaderGroups
#define SCardListReaders WinPR_PCSC_SCardListReaders
#define SCardFreeMemory WinPR_PCSC_SCardFreeMemory
#define SCardCancel WinPR_PCSC_SCardCancel
#define SCardGetAttrib WinPR_PCSC_SCardGetAttrib
#define SCardSetAttrib WinPR_PCSC_SCardSetAttrib
#define list_size WinPR_PCSC_list_size /* src/simclist.h */
#endif
#ifdef WITH_WINPR_PCSC
extern void* WinPR_PCSC_SCardEstablishContext();
extern void* WinPR_PCSC_SCardReleaseContext();
extern void* WinPR_PCSC_SCardIsValidContext();
extern void* WinPR_PCSC_SCardConnect();
extern void* WinPR_PCSC_SCardReconnect();
extern void* WinPR_PCSC_SCardDisconnect();
extern void* WinPR_PCSC_SCardBeginTransaction();
extern void* WinPR_PCSC_SCardEndTransaction();
extern void* WinPR_PCSC_SCardStatus();
extern void* WinPR_PCSC_SCardGetStatusChange();
extern void* WinPR_PCSC_SCardControl();
extern void* WinPR_PCSC_SCardTransmit();
extern void* WinPR_PCSC_SCardListReaderGroups();
extern void* WinPR_PCSC_SCardListReaders();
extern void* WinPR_PCSC_SCardFreeMemory();
extern void* WinPR_PCSC_SCardCancel();
extern void* WinPR_PCSC_SCardGetAttrib();
extern void* WinPR_PCSC_SCardSetAttrib();
#endif
struct _PCSCFunctionTable
{
void* pfnSCardEstablishContext;
void* pfnSCardReleaseContext;
void* pfnSCardIsValidContext;
void* pfnSCardConnect;
void* pfnSCardReconnect;
void* pfnSCardDisconnect;
void* pfnSCardBeginTransaction;
void* pfnSCardEndTransaction;
void* pfnSCardStatus;
void* pfnSCardGetStatusChange;
void* pfnSCardControl;
void* pfnSCardTransmit;
void* pfnSCardListReaderGroups;
void* pfnSCardListReaders;
void* pfnSCardFreeMemory;
void* pfnSCardCancel;
void* pfnSCardGetAttrib;
void* pfnSCardSetAttrib;
};
typedef struct _PCSCFunctionTable PCSCFunctionTable;
PCSCFunctionTable g_PCSC_Link = { 0 };
int PCSC_InitializeSCardApi_Link(void)
{
int status = -1;
#ifdef WITH_WINPR_PCSC
g_PCSC_Link.pfnSCardEstablishContext = (void*) WinPR_PCSC_SCardEstablishContext;
g_PCSC_Link.pfnSCardReleaseContext = (void*) WinPR_PCSC_SCardReleaseContext;
g_PCSC_Link.pfnSCardIsValidContext = (void*) WinPR_PCSC_SCardIsValidContext;
g_PCSC_Link.pfnSCardConnect = (void*) WinPR_PCSC_SCardConnect;
g_PCSC_Link.pfnSCardReconnect = (void*) WinPR_PCSC_SCardReconnect;
g_PCSC_Link.pfnSCardDisconnect = (void*) WinPR_PCSC_SCardDisconnect;
g_PCSC_Link.pfnSCardBeginTransaction = (void*) WinPR_PCSC_SCardBeginTransaction;
g_PCSC_Link.pfnSCardEndTransaction = (void*) WinPR_PCSC_SCardEndTransaction;
g_PCSC_Link.pfnSCardStatus = (void*) WinPR_PCSC_SCardStatus;
g_PCSC_Link.pfnSCardGetStatusChange = (void*) WinPR_PCSC_SCardGetStatusChange;
g_PCSC_Link.pfnSCardControl = (void*) WinPR_PCSC_SCardControl;
g_PCSC_Link.pfnSCardTransmit = (void*) WinPR_PCSC_SCardTransmit;
g_PCSC_Link.pfnSCardListReaderGroups = (void*) WinPR_PCSC_SCardListReaderGroups;
g_PCSC_Link.pfnSCardListReaders = (void*) WinPR_PCSC_SCardListReaders;
//g_PCSC_Link.pfnSCardFreeMemory = (void*) WinPR_PCSC_SCardFreeMemory;
g_PCSC_Link.pfnSCardFreeMemory = (void*) NULL;
g_PCSC_Link.pfnSCardCancel = (void*) WinPR_PCSC_SCardCancel;
g_PCSC_Link.pfnSCardGetAttrib = (void*) WinPR_PCSC_SCardGetAttrib;
g_PCSC_Link.pfnSCardSetAttrib = (void*) WinPR_PCSC_SCardSetAttrib;
status = 1;
#endif
return status;
}

View File

@ -985,10 +985,37 @@ PSCardApiFunctionTable PCSC_GetSCardApiFunctionTable(void)
return &PCSC_SCardApiFunctionTable;
}
int PCSC_InitializeSCardApi(void)
{
g_PCSCModule = LoadLibraryA("libpcsclite.so");
extern PCSCFunctionTable g_PCSC_Link;
extern int PCSC_InitializeSCardApi_Link(void);
int PCSC_InitializeSCardApi(void)
{
if (PCSC_InitializeSCardApi_Link() >= 0)
{
g_PCSC.pfnSCardEstablishContext = g_PCSC_Link.pfnSCardEstablishContext;
g_PCSC.pfnSCardReleaseContext = g_PCSC_Link.pfnSCardReleaseContext;
g_PCSC.pfnSCardIsValidContext = g_PCSC_Link.pfnSCardIsValidContext;
g_PCSC.pfnSCardConnect = g_PCSC_Link.pfnSCardConnect;
g_PCSC.pfnSCardReconnect = g_PCSC_Link.pfnSCardReconnect;
g_PCSC.pfnSCardDisconnect = g_PCSC_Link.pfnSCardDisconnect;
g_PCSC.pfnSCardBeginTransaction = g_PCSC_Link.pfnSCardBeginTransaction;
g_PCSC.pfnSCardEndTransaction = g_PCSC_Link.pfnSCardEndTransaction;
g_PCSC.pfnSCardStatus = g_PCSC_Link.pfnSCardStatus;
g_PCSC.pfnSCardGetStatusChange = g_PCSC_Link.pfnSCardGetStatusChange;
g_PCSC.pfnSCardControl = g_PCSC_Link.pfnSCardControl;
g_PCSC.pfnSCardTransmit = g_PCSC_Link.pfnSCardTransmit;
g_PCSC.pfnSCardListReaderGroups = g_PCSC_Link.pfnSCardListReaderGroups;
g_PCSC.pfnSCardListReaders = g_PCSC_Link.pfnSCardListReaders;
g_PCSC.pfnSCardFreeMemory = g_PCSC_Link.pfnSCardFreeMemory;
g_PCSC.pfnSCardCancel = g_PCSC_Link.pfnSCardCancel;
g_PCSC.pfnSCardGetAttrib = g_PCSC_Link.pfnSCardGetAttrib;
g_PCSC.pfnSCardSetAttrib = g_PCSC_Link.pfnSCardSetAttrib;
return 1;
}
g_PCSCModule = LoadLibraryA("libpcsclite.so");
if (!g_PCSCModule)
return -1;