pcsc-lite
1.7.4
|
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 |
Defines | |
#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. | |
LONG | MSGSignalClient (uint32_t filedes, LONG rv) |
Variables | |
char | AutoExit |
Represents an Application Context on the Server side. | |
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. |
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.
#define READ_BODY | ( | v | ) |
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; }
Definition at line 280 of file winscard_svc.c.
#define WRITE_BODY_WITH_COMMAND | ( | command, | |
v | |||
) |
Log4(PCSC_LOG_DEBUG, "%s rv=0x%X for client %d", command, v.rv, filedes); \ ret = MessageSend(&v, sizeof(v), filedes);
Definition at line 287 of file winscard_svc.c.
LONG CreateContextThread | ( | uint32_t * | pdwClientID | ) |
Creates threads to handle messages received from Clients.
[in] | pdwClientID | Connection ID used to reference the Client. |
SCARD_S_SUCCESS | Success. |
SCARD_F_INTERNAL_ERROR | Exceded the maximum number of simultaneous Application Contexts. |
SCARD_E_NO_MEMORY | Error 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().
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] |
{ "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.
[in] | dwIndex | Index of an avaiable Application Context slot in SCONTEXT *. |
Definition at line 254 of file winscard_svc.c.