pcsc-lite  1.8.20
Data Structures | Macros | Typedefs | Functions | Variables
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 "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)
 

Variables

char 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
 
READER_STATE readerStates [PCSCLITE_MAX_READERS_CONTEXTS]
 
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

◆ READ_BODY

#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 reponse from the server or vice-versa.
Definition: winscard_msg.c:452

Definition at line 309 of file winscard_svc.c.

◆ WRITE_BODY_WITH_COMMAND

#define WRITE_BODY_WITH_COMMAND (   command,
 
)
Value:
do { \
Log4(PCSC_LOG_DEBUG, "%s rv=0x%X for client %d", command, v.rv, 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:354

Definition at line 322 of file winscard_svc.c.

Function Documentation

◆ CreateContextThread()

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_ERRORExceded the maximum number of simultaneous Application Contexts.
SCARD_E_NO_MEMORYError creating the Context Thread.

Definition at line 171 of file winscard_svc.c.

Variable Documentation

◆ AutoExit

char AutoExit

Represents an Application Context on the Server side.

An Application Context contains Channels (hCard).

Definition at line 78 of file pcscdaemon.c.

◆ CommandsText

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",
"NULL"
}

Handles messages received from Clients.

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

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

Definition at line 283 of file winscard_svc.c.