[Pcsclite-cvs-commit] PCSC/src winscard_svc.c,1.20,1.21 winscard_msg.h,1.9,1.10 winscard_clnt.c,1.31,1.32 winscard.h,1.9,1.10 winscard.c,1.22,1.23

rousseau@haydn.debian.org rousseau@haydn.debian.org


Update of /cvsroot/pcsclite/PCSC/src
In directory haydn:/tmp/cvs-serv7718

Modified Files:
	winscard_svc.c winscard_msg.h winscard_clnt.c winscard.h 
	winscard.c 
Log Message:
add support for SCardGetAttrib() and SCardSetAttrib()


Index: winscard_svc.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard_svc.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- winscard_svc.c	16 Apr 2004 15:27:21 -0000	1.20
+++ winscard_svc.c	19 Apr 2004 16:25:23 -0000	1.21
@@ -191,6 +191,7 @@
 	status_struct *stStr;
 	transmit_struct *trStr;
 	control_struct *ctStr;
+	getset_struct *gsStr;
 
 	/*
 	 * Zero out everything 
@@ -302,6 +303,22 @@
 			ctStr->pbSendBuffer, ctStr->cbSendLength,
 			ctStr->pbRecvBuffer, ctStr->cbRecvLength,
 			&ctStr->dwBytesReturned);
+		break;
+
+	case SCARD_GET_ATTRIB:
+		gsStr = ((getset_struct *) msgStruct->data);
+		rv = MSGCheckHandleAssociation(gsStr->hCard, dwContextIndex);
+		if (rv != 0) return rv;
+		gsStr->rv = SCardGetAttrib(gsStr->hCard, gsStr->dwAttrId,
+			gsStr->pbAttr, &gsStr->cbAttrLen);
+		break;
+
+	case SCARD_SET_ATTRIB:
+		gsStr = ((getset_struct *) msgStruct->data);
+		rv = MSGCheckHandleAssociation(gsStr->hCard, dwContextIndex);
+		if (rv != 0) return rv;
+		gsStr->rv = SCardSetAttrib(gsStr->hCard, gsStr->dwAttrId,
+			gsStr->pbAttr, &gsStr->cbAttrLen);
 		break;
 
 	default:

Index: winscard_msg.h
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard_msg.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- winscard_msg.h	16 Apr 2004 15:27:21 -0000	1.9
+++ winscard_msg.h	19 Apr 2004 16:25:23 -0000	1.10
@@ -50,7 +50,6 @@
 
 	enum pcsc_msg_commands
 	{
-
 		SCARD_ESTABLISH_CONTEXT = 0x01,
 		SCARD_RELEASE_CONTEXT = 0x02,
 		SCARD_LIST_READERS = 0x03,
@@ -64,7 +63,9 @@
 		SCARD_STATUS = 0x0B,
 		SCARD_GET_STATUS_CHANGE = 0x0C,
 		SCARD_CANCEL = 0x0D,
-		SCARD_CANCEL_TRANSACTION = 0x0E
+		SCARD_CANCEL_TRANSACTION = 0x0E,
+		SCARD_GET_ATTRIB = 0x0F,
+		SCARD_SET_ATTRIB = 0x10
 	};
 
 	struct version_struct
@@ -187,6 +188,16 @@
 		LONG rv;
 	};
 	typedef struct control_struct control_struct;
+
+	struct getset_struct
+	{
+		SCARDHANDLE hCard;
+		DWORD dwAttrId;
+		UCHAR pbAttr[MAX_BUFFER_SIZE];
+		DWORD cbAttrLen;
+		LONG rv;
+	};
+	typedef struct getset_struct getset_struct;
 
 	/*
 	 * Now some function definitions 

Index: winscard_clnt.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard_clnt.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- winscard_clnt.c	16 Apr 2004 15:27:21 -0000	1.31
+++ winscard_clnt.c	19 Apr 2004 16:25:23 -0000	1.32
@@ -83,6 +83,9 @@
 static LONG SCardGetIndicesFromHandleTH(SCARDHANDLE, PDWORD, PDWORD);
 static LONG SCardRemoveHandle(SCARDHANDLE);
 
+static LONG SCardGetSetAttrib(SCARDHANDLE hCard, int command, DWORD dwAttrId,
+	LPBYTE pbAttr, LPDWORD pcbAttrLen);
+
 static LONG SCardCheckDaemonAvailability();
 
 /*
@@ -1626,6 +1629,123 @@
 	SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);	
 		
 	return scControlStruct.rv;
+}
+
+LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
+	LPDWORD pcbAttrLen)
+{
+	return SCardGetSetAttrib(hCard, SCARD_GET_ATTRIB, dwAttrId, pbAttr,
+		pcbAttrLen);
+}
+
+LONG SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
+	DWORD cbAttrLen)
+{
+	return SCardGetSetAttrib(hCard, SCARD_SET_ATTRIB, dwAttrId, (LPBYTE)pbAttr,
+		&cbAttrLen);
+}
+
+LONG SCardGetSetAttrib(SCARDHANDLE hCard, int command, DWORD dwAttrId,
+	LPBYTE pbAttr, LPDWORD pcbAttrLen)
+{
+	LONG rv;
+	getset_struct scGetSetStruct;
+	sharedSegmentMsg msgStruct;
+	int i;
+	DWORD dwContextIndex, dwChannelIndex;
+
+	/*
+	 * Zero out everything
+	 */
+	rv = 0;
+	i = 0;
+
+	if (NULL == pbAttr || 0 == *pcbAttrLen)
+		return SCARD_E_INVALID_PARAMETER;
+
+	if (SCardCheckDaemonAvailability() != SCARD_S_SUCCESS)
+		return SCARD_E_NO_SERVICE;
+
+	/*
+	 * Make sure this handle has been opened
+	 */
+	rv = SCardGetIndicesFromHandle(hCard, &dwContextIndex, &dwChannelIndex);
+
+	if (rv == -1)
+		return SCARD_E_INVALID_HANDLE;
+
+	SYS_MutexLock(psContextMap[dwContextIndex].mMutex);	
+
+	for (i = 0; i < PCSCLITE_MAX_READERS_CONTEXTS; i++)
+	{
+		char *r = psContextMap[dwContextIndex].psChannelMap[dwChannelIndex].readerName;
+
+		/* by default r == NULL */
+		if (r && strcmp(r, (readerStates[i])->readerName) == 0)
+			break;
+	}
+
+	if (i == PCSCLITE_MAX_READERS_CONTEXTS)
+	{
+		SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);	
+		return SCARD_E_READER_UNAVAILABLE;
+	}
+
+	if (*pcbAttrLen > MAX_BUFFER_SIZE)
+	{
+		SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);	
+		return SCARD_E_INSUFFICIENT_BUFFER;
+	}
+
+	scGetSetStruct.hCard = hCard;
+	scGetSetStruct.dwAttrId = dwAttrId;
+	scGetSetStruct.cbAttrLen = *pcbAttrLen;
+	scGetSetStruct.rv = SCARD_E_NO_SERVICE;
+	memcpy(scGetSetStruct.pbAttr, pbAttr, *pcbAttrLen);
+
+	rv = WrapSHMWrite(command,
+		psContextMap[dwContextIndex].dwClientID, sizeof(scGetSetStruct),
+		PCSCLITE_CLIENT_ATTEMPTS, &scGetSetStruct);
+
+	if (rv == -1)
+	{
+		SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);	
+		return SCARD_E_NO_SERVICE;
+	}
+
+	/*
+	 * Read a message from the server
+	 */
+	rv = SHMClientRead(&msgStruct, psContextMap[dwContextIndex].dwClientID, PCSCLITE_CLIENT_ATTEMPTS);
+
+	if (rv == -1)
+	{
+		SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);	
+		return SCARD_F_COMM_ERROR;
+	}
+
+	memcpy(&scGetSetStruct, &msgStruct.data, sizeof(scGetSetStruct));
+
+	if ((SCARD_S_SUCCESS == scGetSetStruct.rv) && (SCARD_GET_ATTRIB == command))
+	{
+		/*
+		 * Copy and zero it so any secret information is not leaked
+		 */
+		if (*pcbAttrLen < scGetSetStruct.cbAttrLen)
+		{
+			scGetSetStruct.cbAttrLen = *pcbAttrLen;
+			scGetSetStruct.rv = SCARD_E_INSUFFICIENT_BUFFER;
+		}
+		else
+			*pcbAttrLen = scGetSetStruct.cbAttrLen;
+
+		memcpy(pbAttr, scGetSetStruct.pbAttr, scGetSetStruct.cbAttrLen);
+		memset(scGetSetStruct.pbAttr, 0x00, sizeof(scGetSetStruct.pbAttr));
+	}
+
+	SYS_MutexUnLock(psContextMap[dwContextIndex].mMutex);	
+
+	return scGetSetStruct.rv;
 }
 
 LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci,

Index: winscard.h
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- winscard.h	16 Apr 2004 15:27:21 -0000	1.9
+++ winscard.h	19 Apr 2004 16:25:23 -0000	1.10
@@ -62,7 +62,7 @@
 
 	LONG SCardControl(SCARDHANDLE hCard, DWORD dwControlCode,
 		LPCVOID pbSendBuffer, DWORD cbSendLength,
-		LPVOID pbRecvBuffer, DWORD cbRecvLength, DWORD *lpBytesReturned);
+		LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned);
 
 	LONG SCardTransmit(SCARDHANDLE hCard,
 		LPCSCARD_IO_REQUEST pioSendPci,
@@ -78,6 +78,12 @@
 		LPSTR mszReaders, LPDWORD pcchReaders);
 
 	LONG SCardCancel(SCARDCONTEXT hContext);
+
+	LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
+			LPDWORD pcbAttrLen);
+
+	LONG SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
+			DWORD cbAttrLen);
 
 	void SCardUnload(void);
 

Index: winscard.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/winscard.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- winscard.c	16 Apr 2004 15:27:21 -0000	1.22
+++ winscard.c	19 Apr 2004 16:25:23 -0000	1.23
@@ -1212,6 +1212,104 @@
 			pbRecvBuffer, cbRecvLength, lpBytesReturned);
 }
 
+LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId,
+	LPBYTE pbAttr, LPDWORD pcbAttrLen)
+{
+	LONG rv;
+	PREADER_CONTEXT rContext;
+
+	/*
+	 * Zero out everything 
+	 */
+	rv = 0;
+	rContext = 0;
+
+	if (0 == hCard)
+		return SCARD_E_INVALID_HANDLE;
+
+	/*
+	 * Make sure no one has a lock on this reader 
+	 */
+	if ((rv = RFCheckSharing(hCard)) != SCARD_S_SUCCESS)
+		return rv;
+
+	rv = RFReaderInfoById(hCard, &rContext);
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	/*
+	 * Make sure the reader is working properly 
+	 */
+	rv = RFCheckReaderStatus(rContext);
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	rv = RFFindReaderHandle(hCard);
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	/*
+	 * Make sure some event has not occurred 
+	 */
+	if ((rv = RFCheckReaderEventState(rContext, hCard)) != SCARD_S_SUCCESS)
+		return rv;
+
+	rv = IFDGetCapabilities(rContext, dwAttrId, pcbAttrLen, pbAttr);
+	if (rv == IFD_SUCCESS)
+		return SCARD_S_SUCCESS;
+	else
+		return SCARD_E_NOT_TRANSACTED;
+}
+
+LONG SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId,
+	LPCBYTE pbAttr, DWORD cbAttrLen)
+{
+	LONG rv;
+	PREADER_CONTEXT rContext;
+
+	/*
+	 * Zero out everything 
+	 */
+	rv = 0;
+	rContext = 0;
+
+	if (0 == hCard)
+		return SCARD_E_INVALID_HANDLE;
+
+	/*
+	 * Make sure no one has a lock on this reader 
+	 */
+	if ((rv = RFCheckSharing(hCard)) != SCARD_S_SUCCESS)
+		return rv;
+
+	rv = RFReaderInfoById(hCard, &rContext);
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	/*
+	 * Make sure the reader is working properly 
+	 */
+	rv = RFCheckReaderStatus(rContext);
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	rv = RFFindReaderHandle(hCard);
+	if (rv != SCARD_S_SUCCESS)
+		return rv;
+
+	/*
+	 * Make sure some event has not occurred 
+	 */
+	if ((rv = RFCheckReaderEventState(rContext, hCard)) != SCARD_S_SUCCESS)
+		return rv;
+
+	rv = IFDSetCapabilities(rContext, dwAttrId, cbAttrLen, (PUCHAR)pbAttr);
+	if (rv == IFD_SUCCESS)
+		return SCARD_S_SUCCESS;
+	else
+		return SCARD_E_NOT_TRANSACTED;
+}
+
 LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci,
 	LPCBYTE pbSendBuffer, DWORD cbSendLength,
 	LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer,