pcsc-lite  2.5.0
winscard_svc.c File Reference

This demarshalls functions over the message queue and keeps track of clients and their handles. More...

#include "config.h"
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdbool.h>
#include "pcscd.h"
#include "winscard.h"
#include "debuglog.h"
#include "winscard_msg.h"
#include "winscard_svc.h"
#include "sys_generic.h"
#include "utils.h"
#include "readerfactory.h"
#include "eventhandler.h"
#include "simclist.h"
#include "auth.h"

Go to the source code of this file.

Data Structures

struct  _psContext
 

Macros

#define READ_BODY(v)
 
#define WRITE_BODY(v)   WRITE_BODY_WITH_COMMAND(CommandsText[header.command], v)
 
#define WRITE_BODY_WITH_COMMAND(command, v)
 

Typedefs

typedef struct _psContext SCONTEXT
 

Functions

static LONG MSGCheckHandleAssociation (SCARDHANDLE, SCONTEXT *)
 
static LONG MSGAddContext (SCARDCONTEXT, SCONTEXT *)
 
static LONG MSGRemoveContext (SCARDCONTEXT, SCONTEXT *)
 
static LONG MSGAddHandle (SCARDCONTEXT, SCARDHANDLE, SCONTEXT *)
 
static LONG MSGRemoveHandle (SCARDHANDLE, SCONTEXT *)
 
static void MSGCleanupClient (SCONTEXT *)
 
static void * ContextThread (LPVOID pdwIndex)
 
static int contextsListhContext_seeker (const void *el, const void *key)
 
LONG ContextsInitialize (int customMaxThreadCounter, int customMaxThreadCardHandles)
 
void ContextsDeinitialize (void)
 
LONG CreateContextThread (uint32_t *pdwClientID)
 Creates threads to handle messages received from Clients. More...
 
LONG MSGSignalClient (uint32_t filedes, LONG rv)
 
LONG MSGSendReaderStates (uint32_t filedes, bool old_api)
 

Variables

bool AutoExit
 Represents an Application Context on the Server side. More...
 
static int contextMaxThreadCounter = PCSC_MAX_CONTEXT_THREADS
 
static int contextMaxCardHandles = PCSC_MAX_CONTEXT_CARD_HANDLES
 
static list_t contextsList
 Context tracking list.
 
pthread_mutex_t contextsList_lock
 lock for the above list
 
int pcsclite_max_reader_context
 Area used to read status information about the readers.
 
READER_CONTEXT ** sReadersContexts
 
int16_t ReaderEvents
 
static const char * CommandsText []
 Handles messages received from Clients. More...
 

Detailed Description

This demarshalls functions over the message queue and keeps track of clients and their handles.

Each Client message is deald by creating a thread (CreateContextThread). The thread establishes reands and demarshalls the message and calls the appropriate function to threat it.

Definition in file winscard_svc.c.

Macro Definition Documentation

#define READ_BODY (   v)
Value:
do { \
if (header.size != sizeof(v)) \
goto wrong_length; \
ret = MessageReceive(&v, sizeof(v), filedes); \
if (ret != SCARD_S_SUCCESS) { \
Log2(PCSC_LOG_DEBUG, "Client die: %d", filedes); \
goto exit; \
} \
} while (0)
#define SCARD_S_SUCCESS
No error was encountered.
Definition: pcsclite.h:107
INTERNAL LONG MessageReceive(void *buffer_void, uint64_t buffer_size, int32_t filedes)
Called by the Client to get the response from the server or vice-versa.
Definition: winscard_msg.c:461

Definition at line 334 of file winscard_svc.c.

#define WRITE_BODY_WITH_COMMAND (   command,
 
)
Value:
do { \
LogRv4(PCSC_LOG_DEBUG, v.rv, "%s for client %d", command, filedes); \
ret = MessageSend(&v, sizeof(v), filedes); \
} while (0)
INTERNAL LONG MessageSend(void *buffer_void, uint64_t buffer_size, int32_t filedes)
Sends a menssage from client to server or vice-versa.
Definition: winscard_msg.c:357

Definition at line 347 of file winscard_svc.c.

Function Documentation

LONG CreateContextThread ( uint32_t *  pdwClientID)

Creates threads to handle messages received from Clients.

Parameters
[in]pdwClientIDConnection ID used to reference the Client.
Returns
Error code.
Return values
SCARD_S_SUCCESSSuccess.
SCARD_F_INTERNAL_ERRORExceeded the maximum number of simultaneous Application Contexts.
SCARD_E_NO_MEMORYError creating the Context Thread.

Definition at line 193 of file winscard_svc.c.

Variable Documentation

bool AutoExit

Represents an Application Context on the Server side.

An Application Context contains Channels (hCard).

Definition at line 74 of file pcscdaemon.c.

const char* CommandsText[]
static
Initial value:
= {
"NULL",
"ESTABLISH_CONTEXT",
"RELEASE_CONTEXT",
"LIST_READERS",
"CONNECT",
"RECONNECT",
"DISCONNECT",
"BEGIN_TRANSACTION",
"END_TRANSACTION",
"TRANSMIT",
"CONTROL",
"STATUS",
"GET_STATUS_CHANGE",
"CANCEL",
"CANCEL_TRANSACTION",
"GET_ATTRIB",
"SET_ATTRIB",
"CMD_VERSION",
"CMD_GET_READERS_STATE",
"CMD_WAIT_READER_STATE_CHANGE",
"CMD_STOP_WAITING_READER_STATE_CHANGE",
"CMD_GET_READER_EVENTS",
"CMD_GET_READERS_STATE_SIZE",
"CMD_GET_READERS_STATE_ARRAY",
"NULL"
}

Handles messages received from Clients.

For each Client message a new instance of this thread is created.

Parameters
[in]dwIndexIndex of an available Application Context slot in SCONTEXT *.

Definition at line 305 of file winscard_svc.c.