[Pcsclite-cvs-commit] r4585 - /trunk/PCSC/src/winscard_clnt.c
rousseau at users.alioth.debian.org
rousseau at users.alioth.debian.org
Thu Dec 3 09:15:34 UTC 2009
Author: rousseau
Date: Thu Dec 3 09:15:31 2009
New Revision: 4585
URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4585
Log:
use the more efficient SCardCheckSameProcess() instead of
SCardCheckDaemonAvailability() to detect use of the API after a fork()
Modified:
trunk/PCSC/src/winscard_clnt.c
Modified: trunk/PCSC/src/winscard_clnt.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard_clnt.c?rev=4585&op=diff
==============================================================================
--- trunk/PCSC/src/winscard_clnt.c (original)
+++ trunk/PCSC/src/winscard_clnt.c Thu Dec 3 09:15:31 2009
@@ -304,6 +304,7 @@
static LONG SCardGetSetAttrib(SCARDHANDLE hCard, int command, DWORD dwAttrId,
LPBYTE pbAttr, LPDWORD pcbAttrLen);
+static LONG SCardCheckSameProcess(void);
static LONG getReaderStates(SCONTEXTMAP * currentContextMap);
/*
@@ -627,7 +628,7 @@
return SCARD_E_INVALID_HANDLE;
}
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
{
/*
@@ -797,7 +798,7 @@
if (strlen(szReader) > MAX_READERNAME)
return SCARD_E_INVALID_VALUE;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -952,7 +953,7 @@
if (pdwActiveProtocol == NULL)
return SCARD_E_INVALID_PARAMETER;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1057,7 +1058,7 @@
PROFILE_START
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1165,7 +1166,7 @@
PROFILE_START
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1289,7 +1290,7 @@
*/
randnum = 0;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1370,7 +1371,7 @@
PROFILE_START
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1553,7 +1554,7 @@
*pcchReaderLen = 0;
*pcbAtrLen = 0;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1846,7 +1847,7 @@
/* reader list is empty */
return SCARD_S_SUCCESS;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -1892,7 +1893,7 @@
j = 0;
do
{
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
{
if (currentContextMap->mMutex)
@@ -2347,7 +2348,7 @@
if (NULL != lpBytesReturned)
*lpBytesReturned = 0;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -2644,7 +2645,7 @@
SCONTEXTMAP * currentContextMap;
CHANNEL_MAP * pChannelMap;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -2804,7 +2805,7 @@
pcbRecvLength == NULL || pioSendPci == NULL)
return SCARD_E_INVALID_PARAMETER;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -2986,7 +2987,7 @@
if (pcchReaders == NULL)
return SCARD_E_INVALID_PARAMETER;
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -3102,7 +3103,7 @@
PROFILE_START
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -3182,7 +3183,7 @@
const char ReaderGroup[] = "SCard$DefaultReaders\0";
const int dwGroups = sizeof(ReaderGroup);
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -3361,7 +3362,7 @@
rv = SCARD_S_SUCCESS;
/* Check if the _same_ server is running */
- rv = SCardCheckDaemonAvailability();
+ rv = SCardCheckSameProcess();
if (rv != SCARD_S_SUCCESS)
return rv;
@@ -3743,6 +3744,20 @@
return SCARD_S_SUCCESS;
}
+static LONG SCardCheckSameProcess(void)
+{
+ /* after fork() need to restart */
+ if ((client_pid && client_pid != getpid()))
+ {
+ Log1(PCSC_LOG_INFO, "Client forked");
+ return SCardInvalidateHandles();
+ }
+
+ client_pid = getpid();
+
+ return SCARD_S_SUCCESS;
+}
+
static LONG getReaderStates(SCONTEXTMAP * currentContextMap)
{
int32_t dwClientID = currentContextMap->dwClientID;
More information about the Pcsclite-cvs-commit
mailing list