[Pcsclite-cvs-commit] r3013 - in /trunk/PCSC/src: PCSC/pcsclite.h.in PCSC/winscard.h winscard_clnt.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Thu Jun 19 14:56:54 UTC 2008


Author: rousseau
Date: Thu Jun 19 14:56:54 2008
New Revision: 3013

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=3013
Log:
add support of SCARD_AUTOALLOCATE for SCardListReaders()
add SCardFreeMemory()

Modified:
    trunk/PCSC/src/PCSC/pcsclite.h.in
    trunk/PCSC/src/PCSC/winscard.h
    trunk/PCSC/src/winscard_clnt.c

Modified: trunk/PCSC/src/PCSC/pcsclite.h.in
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/PCSC/pcsclite.h.in?rev=3013&op=diff
==============================================================================
--- trunk/PCSC/src/PCSC/pcsclite.h.in (original)
+++ trunk/PCSC/src/PCSC/pcsclite.h.in Thu Jun 19 14:56:54 2008
@@ -104,6 +104,7 @@
 #define SCARD_E_SERVICE_STOPPED		0x8010001E /**< The Smart card resource manager has shut down. */
 #define SCARD_E_NO_READERS_AVAILABLE    0x8010002E /**< Cannot find a smart card reader. */
 
+#define SCARD_AUTOALLOCATE (DWORD)(-1)	/**< see SCardFreeMemory() */
 #define SCARD_SCOPE_USER		0x0000	/**< Scope in user space */
 #define SCARD_SCOPE_TERMINAL		0x0001	/**< Scope in terminal */
 #define SCARD_SCOPE_SYSTEM		0x0002	/**< Scope in system */

Modified: trunk/PCSC/src/PCSC/winscard.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/PCSC/winscard.h?rev=3013&op=diff
==============================================================================
--- trunk/PCSC/src/PCSC/winscard.h (original)
+++ trunk/PCSC/src/PCSC/winscard.h Thu Jun 19 14:56:54 2008
@@ -82,6 +82,8 @@
 		LPCSTR mszGroups,
 		LPSTR mszReaders, LPDWORD pcchReaders);
 
+	PCSC_API LONG SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID pvMem);
+
 	PCSC_API LONG SCardCancel(SCARDCONTEXT hContext);
 
 	PCSC_API LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId,

Modified: trunk/PCSC/src/winscard_clnt.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/winscard_clnt.c?rev=3013&op=diff
==============================================================================
--- trunk/PCSC/src/winscard_clnt.c (original)
+++ trunk/PCSC/src/winscard_clnt.c Thu Jun 19 14:56:54 2008
@@ -3080,9 +3080,10 @@
 	LPSTR mszReaders, LPDWORD pcchReaders)
 {
 	DWORD dwReadersLen;
-	int i, lastChrPtr;
+	int i;
 	LONG dwContextIndex;
 	LONG rv = SCARD_S_SUCCESS;
+	char *buf = NULL;
 
 	PROFILE_START
 
@@ -3121,29 +3122,40 @@
 	/* for the last NULL byte */
 	dwReadersLen += 1;
 
-	/* not enough place to store the reader names */
-	if ((NULL != mszReaders) && (*pcchReaders < dwReadersLen))
-	{
-		rv = SCARD_E_INSUFFICIENT_BUFFER;
+	if (1 == dwReadersLen)
+	{
+		rv = SCARD_E_NO_READERS_AVAILABLE;
 		goto end;
+	}
+
+	if (SCARD_AUTOALLOCATE == *pcchReaders)
+	{
+		buf = malloc(dwReadersLen);
+		if (NULL == buf)
+		{
+			rv = SCARD_E_NO_MEMORY;
+			goto end;
+		}
+		*(char **)mszReaders = buf;
+	}
+	else
+	{
+		buf = mszReaders;
+
+		/* not enough place to store the reader names */
+		if ((NULL != mszReaders) && (*pcchReaders < dwReadersLen))
+		{
+			rv = SCARD_E_INSUFFICIENT_BUFFER;
+			goto end;
+		}
 	}
 
 	/* set the reader names length */
 	*pcchReaders = dwReadersLen;
 
-	if (1 == dwReadersLen)
-	{
-		rv = SCARD_E_NO_READERS_AVAILABLE;
+	if (mszReaders == NULL)	/* text array not allocated */
 		goto end;
-	}
-
-	if ((mszReaders == NULL)	/* text array not allocated */
-		|| (*pcchReaders == 0))	/* size == 0 */
-	{
-		goto end;
-	}
-
-	lastChrPtr = 0;
+
 	for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++)
 	{
 		if ((readerStates[i])->readerID != 0)
@@ -3151,14 +3163,51 @@
 			/*
 			 * Build the multi-string
 			 */
-			strcpy(&mszReaders[lastChrPtr], (readerStates[i])->readerName);
-			lastChrPtr += strlen((readerStates[i])->readerName)+1;
-		}
-	}
-	mszReaders[lastChrPtr] = '\0';	/* Add the last null */
+			strcpy(buf, (readerStates[i])->readerName);
+			buf += strlen((readerStates[i])->readerName)+1;
+		}
+	}
+	*buf = '\0';	/* Add the last null */
 
 end:
 	SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);
+
+	PROFILE_END(rv)
+
+	return rv;
+}
+
+/**
+ * @brief releases memory that has been returned from the resource manager
+ * using the SCARD_AUTOALLOCATE length designator.
+ *
+ * @ingroup API
+ * @param[in] hContext Connection context to the PC/SC Resource Manager.
+ * @param[in] pvMem pointer to allocated memory
+ *
+ * @return Error code.
+ * @retval SCARD_S_SUCCESS Successful (\ref SCARD_S_SUCCESS)
+ */
+
+LONG SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID pvMem)
+{
+	LONG rv = SCARD_S_SUCCESS;
+	LONG dwContextIndex;
+
+	PROFILE_START
+
+	rv = SCardCheckDaemonAvailability();
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	/*
+	 * Make sure this context has been opened
+	 */
+	dwContextIndex = SCardGetContextIndice(hContext);
+	if (dwContextIndex == -1)
+		return SCARD_E_INVALID_HANDLE;
+
+	free((void *)pvMem);
 
 	PROFILE_END(rv)
 




More information about the Pcsclite-cvs-commit mailing list