pcsc-lite  1.8.8
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"

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 LONG 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

#define READ_BODY (   v)
Value:
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; }
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:422
#define SCARD_S_SUCCESS
error codes from http://msdn.microsoft.com/en-us/library/aa924526.aspx
Definition: pcsclite.h:80

Definition at line 282 of file winscard_svc.c.

#define WRITE_BODY_WITH_COMMAND (   command,
 
)
Value:
Log4(PCSC_LOG_DEBUG, "%s rv=0x%X for client %d", command, v.rv, filedes); \
ret = MessageSend(&v, sizeof(v), filedes);
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:324

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

Definition at line 144 of file winscard_svc.c.

References AutoExit, _psContext::cardsList_lock, contextsList_lock, _psContext::dwClientID, _psContext::pthThread, SCARD_E_NO_MEMORY, and SCARD_S_SUCCESS.

Referenced by SVCServiceRunLoop().

Variable Documentation

char AutoExit

Represents an Application Context on the Server side.

An Application Context contains Channels (hCard).

Definition at line 57 of file pcscdaemon.c.

Referenced by CreateContextThread().

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 256 of file winscard_svc.c.