[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