[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,