pcsc-lite
1.8.8
|
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/un.h>
#include <errno.h>
#include <stddef.h>
#include <sys/time.h>
#include <pthread.h>
#include <sys/wait.h>
#include "misc.h"
#include "pcscd.h"
#include "winscard.h"
#include "debuglog.h"
#include "strlcpycat.h"
#include "readerfactory.h"
#include "eventhandler.h"
#include "sys_generic.h"
#include "winscard_msg.h"
#include "utils.h"
Go to the source code of this file.
Data Structures | |
struct | _psChannelMap |
Represents an Application Context Channel. More... | |
struct | _psContextMap |
Represents the an Application Context on the Client side. More... | |
Macros | |
#define | SCARD_PROTOCOL_ANY_OLD 0x1000 |
used for backward compatibility | |
#define | TRUE 1 |
#define | FALSE 0 |
#define | COLOR_RED "\33[01;31m" |
#define | COLOR_GREEN "\33[32m" |
#define | COLOR_BLUE "\33[34m" |
#define | COLOR_MAGENTA "\33[35m" |
#define | COLOR_NORMAL "\33[0m" |
#define | TIMEOUT_TIME 3 /* time to wait for an answer to the server on first connection (in seconds) */ |
#define | API_TRACE_IN(...) |
#define | API_TRACE_OUT(...) |
#define | PROFILE_START |
#define | PROFILE_END(rv) |
Typedefs | |
typedef struct _psChannelMap | CHANNEL_MAP |
typedef struct _psContextMap | SCONTEXTMAP |
Functions | |
static int | CHANNEL_MAP_seeker (const void *el, const void *key) |
static int | SCONTEXTMAP_seeker (const void *el, const void *key) |
static LONG | SCardAddContext (SCARDCONTEXT hContext, DWORD dwClientID) |
Functions for managing instances of SCardEstablishContext() These functions keep track of Context handles and associate the blocking variable contextBlockStatus to an hContext. More... | |
static SCONTEXTMAP * | SCardGetContext (SCARDCONTEXT hContext) |
Get the index from the Application Context vector _psContextMap for the passed context. More... | |
static SCONTEXTMAP * | SCardGetContextTH (SCARDCONTEXT hContext) |
Get the address from the Application Context list _psContextMap for the passed context. More... | |
static LONG | SCardRemoveContext (SCARDCONTEXT hContext) |
Removes an Application Context from a control vector. More... | |
static LONG | SCardCleanContext (SCONTEXTMAP *) |
static LONG | SCardAddHandle (SCARDHANDLE, SCONTEXTMAP *, LPCSTR) |
static LONG | SCardGetContextAndChannelFromHandle (SCARDHANDLE, SCONTEXTMAP **, CHANNEL_MAP **) |
static LONG | SCardGetContextAndChannelFromHandleTH (SCARDHANDLE, SCONTEXTMAP **, CHANNEL_MAP **) |
static LONG | SCardRemoveHandle (SCARDHANDLE) |
static void | SCardInvalidateHandles (void) |
static LONG | SCardGetSetAttrib (SCARDHANDLE hCard, int command, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen) |
static LONG | getReaderStates (SCONTEXTMAP *currentContextMap) |
static LONG | SCardLockThread (void) |
Locks a mutex so another thread must wait to use this function. More... | |
static LONG | SCardUnlockThread (void) |
Unlocks a mutex so another thread may use the client. More... | |
static LONG | SCardEstablishContextTH (DWORD dwScope,LPCVOID pvReserved1,LPCVOID pvReserved2, LPSCARDCONTEXT phContext) |
Creates a communication context to the PC/SC Resource Manager. More... | |
LONG | SCardEstablishContext (DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext) |
Creates an Application Context to the PC/SC Resource Manager. More... | |
LONG | SCardReleaseContext (SCARDCONTEXT hContext) |
Destroys a communication context to the PC/SC Resource Manager. More... | |
LONG | SCardConnect (SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol) |
Establishes a connection to the reader specified in * szReader. More... | |
LONG | SCardReconnect (SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol) |
Reestablishes a connection to a reader that was previously connected to using SCardConnect(). More... | |
LONG | SCardDisconnect (SCARDHANDLE hCard, DWORD dwDisposition) |
Terminates a connection made through SCardConnect(). More... | |
LONG | SCardBeginTransaction (SCARDHANDLE hCard) |
Establishes a temporary exclusive access mode for doing a serie of commands in a transaction. More... | |
LONG | SCardEndTransaction (SCARDHANDLE hCard, DWORD dwDisposition) |
Ends a previously begun transaction. More... | |
LONG | SCardStatus (SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen) |
Returns the current status of the reader connected to by hCard . More... | |
LONG | SCardGetStatusChange (SCARDCONTEXT hContext, DWORD dwTimeout, SCARD_READERSTATE *rgReaderStates, DWORD cReaders) |
Blocks execution until the current availability of the cards in a specific set of readers changes. More... | |
LONG | SCardControl (SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer, DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned) |
Sends a command directly to the IFD Handler (reader driver) to be processed by the reader. More... | |
LONG | SCardGetAttrib (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen) |
Get an attribute from the IFD Handler (reader driver). More... | |
LONG | SCardSetAttrib (SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen) |
Set an attribute of the IFD Handler. More... | |
LONG | SCardTransmit (SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength) |
Sends an APDU to the smart card contained in the reader connected to by SCardConnect(). More... | |
LONG | SCardListReaders (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders) |
Returns a list of currently available readers on the system. More... | |
LONG | SCardFreeMemory (SCARDCONTEXT hContext, LPCVOID pvMem) |
Releases memory that has been returned from the resource manager using the SCARD_AUTOALLOCATE length designator. More... | |
LONG | SCardListReaderGroups (SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups) |
Returns a list of currently available reader groups on the system. More... | |
LONG | SCardCancel (SCARDCONTEXT hContext) |
Cancels all pending blocking requests on the SCardGetStatusChange() function. More... | |
LONG | SCardIsValidContext (SCARDCONTEXT hContext) |
Check if a SCARDCONTEXT is valid. More... | |
LONG | SCardCheckDaemonAvailability (void) |
Checks if the server is running. More... | |
Variables | |
static char | sharing_shall_block = TRUE |
static list_t | contextMapList |
static short | isExecuted = 0 |
Make sure the initialization code is executed only once. | |
static pthread_mutex_t | clientMutex = PTHREAD_MUTEX_INITIALIZER |
Ensure that some functions be accessed in thread-safe mode. More... | |
static READER_STATE | readerStates [PCSCLITE_MAX_READERS_CONTEXTS] |
Area used to read status information about the readers. | |
PCSC_API const SCARD_IO_REQUEST | g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, sizeof(SCARD_IO_REQUEST) } |
Protocol Control Information for T=0. | |
PCSC_API const SCARD_IO_REQUEST | g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, sizeof(SCARD_IO_REQUEST) } |
Protocol Control Information for T=1. | |
PCSC_API const SCARD_IO_REQUEST | g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, sizeof(SCARD_IO_REQUEST) } |
Protocol Control Information for raw access. | |
|
static |
Functions for managing instances of SCardEstablishContext() These functions keep track of Context handles and associate the blocking variable contextBlockStatus to an hContext.
Adds an Application Context to the vector _psContextMap
.
[in] | hContext | Application Context ID. |
[in] | dwClientID | Client connection ID. |
SCARD_S_SUCCESS | Success (SCARD_S_SUCCESS) |
SCARD_E_NO_MEMORY | There is no free slot to store hContext (SCARD_E_NO_MEMORY) |
Definition at line 3290 of file winscard_clnt.c.
References _psContextMap::cancellable, _psContextMap::dwClientID, _psContextMap::hContext, _psContextMap::mMutex, SCARD_E_NO_MEMORY, and SCARD_S_SUCCESS.
Referenced by SCardEstablishContextTH().
LONG SCardCheckDaemonAvailability | ( | void | ) |
Checks if the server is running.
If the server has been restarted we invalidate all the PC/SC handles. The client has to call SCardEstablishContext() again.
SCARD_S_SUCCESS | Server is running (SCARD_S_SUCCESS) |
SCARD_E_NO_SERVICE | Server is not running (SCARD_E_NO_SERVICE) |
SCARD_E_INVALID_HANDLE | Server was restarted or after fork() (SCARD_E_INVALID_HANDLE) |
Definition at line 3574 of file winscard_clnt.c.
References SCARD_E_NO_SERVICE, and SCARD_S_SUCCESS.
Referenced by MessageReceiveTimeout(), and SCardEstablishContext().
|
static |
Creates a communication context to the PC/SC Resource Manager.
This function should not be called directly. Instead, the thread-safe function SCardEstablishContext() should be called.
[in] | dwScope | Scope of the establishment. This can either be a local or remote connection.
|
[in] | pvReserved1 | Reserved for future use. Can be used for remote connection. |
[in] | pvReserved2 | Reserved for future use. |
[out] | phContext | Returned reference to this connection. |
SCARD_S_SUCCESS | Successful (SCARD_S_SUCCESS) |
SCARD_E_INVALID_PARAMETER | phContext is null. (SCARD_E_INVALID_PARAMETER) |
SCARD_E_INVALID_VALUE | Invalid scope type passed (SCARD_E_INVALID_VALUE) |
SCARD_E_NO_MEMORY | There is no free slot to store hContext (SCARD_E_NO_MEMORY) |
SCARD_E_NO_SERVICE | The server is not running (SCARD_E_NO_SERVICE) |
SCARD_F_COMM_ERROR | An internal communications error has been detected (SCARD_F_COMM_ERROR) |
SCARD_F_INTERNAL_ERROR | An internal consistency check failed (SCARD_F_INTERNAL_ERROR) |
Definition at line 489 of file winscard_clnt.c.
References ClientSetupSession(), CMD_VERSION, version_struct::major, MessageReceive(), MessageReceiveTimeout(), MessageSendWithHeader(), version_struct::minor, PROTOCOL_VERSION_MAJOR, PROTOCOL_VERSION_MINOR, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_MEMORY, SCARD_E_NO_SERVICE, SCARD_ESTABLISH_CONTEXT, SCARD_F_COMM_ERROR, SCARD_S_SUCCESS, SCardAddContext(), and SCardGetContextTH().
Referenced by SCardEstablishContext().
|
static |
Get the index from the Application Context vector _psContextMap
for the passed context.
This function is a thread-safe wrapper to the function SCardGetContextTH().
[in] | hContext | Application Context whose index will be find. |
Definition at line 3362 of file winscard_clnt.c.
References SCardGetContextTH(), SCardLockThread(), and SCardUnlockThread().
Referenced by SCardCancel(), SCardConnect(), SCardFreeMemory(), SCardGetStatusChange(), SCardIsValidContext(), SCardListReaderGroups(), SCardListReaders(), and SCardReleaseContext().
|
static |
Get the address from the Application Context list _psContextMap
for the passed context.
This functions is not thread-safe and should not be called. Instead, call the function SCardGetContext().
[in] | hContext | Application Context whose index will be find. |
Definition at line 3385 of file winscard_clnt.c.
Referenced by SCardEstablishContextTH(), SCardGetContext(), and SCardRemoveContext().
|
inlinestatic |
Locks a mutex so another thread must wait to use this function.
Wrapper to the function pthread_mutex_lock().
Definition at line 373 of file winscard_clnt.c.
Referenced by SCardEstablishContext(), SCardGetContext(), and SCardReleaseContext().
|
static |
Removes an Application Context from a control vector.
[in] | hContext | Application Context to be removed. |
SCARD_S_SUCCESS | Success (SCARD_S_SUCCESS) |
SCARD_E_INVALID_HANDLE | The context hContext was not found (SCARD_E_INVALID_HANDLE) |
Definition at line 3399 of file winscard_clnt.c.
References SCARD_E_INVALID_HANDLE, and SCardGetContextTH().
Referenced by SCardReleaseContext().
|
inlinestatic |
Unlocks a mutex so another thread may use the client.
Wrapper to the function pthread_mutex_unlock().
Definition at line 383 of file winscard_clnt.c.
Referenced by SCardEstablishContext(), SCardGetContext(), and SCardReleaseContext().
|
static |
Ensure that some functions be accessed in thread-safe mode.
These function's names finishes with "TH".
Definition at line 330 of file winscard_clnt.c.