105 #include <sys/time.h>
130 #define PROFILE_FILE "/tmp/pcscd_profile"
132 #include <sys/time.h>
136 struct timeval profile_time_start;
140 #define PROFILE_START profile_start(__FUNCTION__);
141 #define PROFILE_END profile_end(__FUNCTION__, __LINE__);
143 static void profile_start(
const char *f)
145 static char initialized = FALSE;
150 fd = fopen(PROFILE_FILE,
"a+");
153 fprintf(stderr,
"\33[01;31mCan't open %s: %s\33[0m\n",
154 PROFILE_FILE, strerror(errno));
157 fprintf(fd,
"\nStart a new profile\n");
160 if (isatty(fileno(stderr)))
166 gettimeofday(&profile_time_start, NULL);
170 static void profile_end(
const char *f,
int line)
172 struct timeval profile_time_end;
175 gettimeofday(&profile_time_end, NULL);
176 d =
time_sub(&profile_time_end, &profile_time_start);
179 fprintf(stderr,
"\33[01;31mRESULT %s \33[35m%ld\33[0m (%d)\n", f, d,
181 fprintf(fd,
"%s %ld\n", f, d);
186 #define PROFILE_START
191 #define SCARD_PROTOCOL_ANY_OLD 0x1000
193 static pthread_mutex_t LockMutex = PTHREAD_MUTEX_INITIALIZER;
195 LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
196 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
215 Log2(PCSC_LOG_DEBUG,
"Establishing Context: 0x%lX", *phContext);
229 Log2(PCSC_LOG_DEBUG,
"Releasing Context: 0x%lX", hContext);
235 DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
236 LPDWORD pdwActiveProtocol)
258 Log3(PCSC_LOG_DEBUG,
"Attempting Connect to %s using protocol: %ld",
259 szReader, dwPreferredProtocols);
261 rv = RFReaderInfo((LPSTR) szReader, &rContext);
264 Log2(PCSC_LOG_ERROR,
"Reader %s Not Found", szReader);
271 rv = RFCheckReaderStatus(rContext);
286 Log1(PCSC_LOG_ERROR,
"Error Reader Exclusive");
296 Log1(PCSC_LOG_INFO,
"Waiting for release of lock");
299 Log1(PCSC_LOG_INFO,
"Lock released");
312 Log1(PCSC_LOG_DEBUG,
"Card Not Inserted");
332 Log1(PCSC_LOG_DEBUG,
"power up complete.");
333 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
338 Log3(PCSC_LOG_ERROR,
"Error powering up card: %ld 0x%04lX",
344 Log1(PCSC_LOG_ERROR,
"Card Not Powered");
352 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_IN_USE");
370 (void)pthread_mutex_lock(rContext->
mMutex);
375 int availableProtocols, defaultProtocol;
387 availableProtocols, defaultProtocol);
390 if (SET_PROTOCOL_PPS_FAILED == ret)
392 (void)pthread_mutex_unlock(rContext->
mMutex);
397 if (SET_PROTOCOL_WRONG_ARGUMENT == ret)
399 (void)pthread_mutex_unlock(rContext->
mMutex);
407 (void)pthread_mutex_unlock(rContext->
mMutex);
411 (void)pthread_mutex_unlock(rContext->
mMutex);
426 switch (*pdwActiveProtocol)
430 Log2(PCSC_LOG_DEBUG,
"Active Protocol: T=%d",
435 Log1(PCSC_LOG_DEBUG,
"Active Protocol: RAW");
439 Log2(PCSC_LOG_ERROR,
"Active Protocol: unknown %ld",
444 Log1(PCSC_LOG_DEBUG,
"Direct access: no protocol selected");
452 (void)pthread_mutex_lock(&LockMutex);
454 *phCard = RFCreateReaderHandle(rContext);
456 Log2(PCSC_LOG_DEBUG,
"hCard Identity: %lx", *phCard);
470 (void)RFLockSharing(*phCard, rContext);
476 (void)pthread_mutex_unlock(&LockMutex);
491 rv = RFAddReaderHandle(rContext, *phCard);
493 (void)pthread_mutex_unlock(&LockMutex);
518 UNREF_READER(rContext)
526 DWORD dwPreferredProtocols, DWORD dwInitialization,
527 LPDWORD pdwActiveProtocol)
532 Log1(PCSC_LOG_DEBUG,
"Attempting reconnect to token.");
558 rv = RFReaderInfoById(hCard, &rContext);
565 rv = RFCheckReaderStatus(rContext);
572 rv = RFCheckSharing(hCard, rContext);
609 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
610 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
617 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
667 (void)pthread_mutex_lock(rContext->
mMutex);
672 int availableProtocols, defaultProtocol;
684 availableProtocols, defaultProtocol);
687 if (SET_PROTOCOL_PPS_FAILED == ret)
689 (void)pthread_mutex_unlock(rContext->
mMutex);
694 if (SET_PROTOCOL_WRONG_ARGUMENT == ret)
696 (void)pthread_mutex_unlock(rContext->
mMutex);
704 (void)pthread_mutex_unlock(rContext->
mMutex);
708 (void)pthread_mutex_unlock(rContext->
mMutex);
720 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_IN_USE");
729 switch (*pdwActiveProtocol)
733 Log2(PCSC_LOG_DEBUG,
"Active Protocol: T=%d",
738 Log1(PCSC_LOG_DEBUG,
"Active Protocol: RAW");
742 Log2(PCSC_LOG_ERROR,
"Active Protocol: unknown %ld",
747 Log1(PCSC_LOG_DEBUG,
"Direct access: no protocol selected");
762 (void)RFLockSharing(hCard, rContext);
784 (void)RFUnlockSharing(hCard, rContext);
801 (void)RFUnlockSharing(hCard, rContext);
814 (void)RFClearReaderEventState(rContext, hCard);
824 UNREF_READER(rContext)
844 rv = RFReaderInfoById(hCard, &rContext);
852 && (rContext->
hLockId != hCard))
854 Log1(PCSC_LOG_INFO,
"Waiting for release of lock");
857 Log1(PCSC_LOG_INFO,
"Lock released");
867 rv = RFUnlockAllSharing(hCard, rContext);
881 Log2(PCSC_LOG_DEBUG,
"Active Contexts: %d", rContext->
contexts);
882 Log2(PCSC_LOG_DEBUG,
"dwDisposition: %ld", dwDisposition);
904 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
920 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
921 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
929 Log3(PCSC_LOG_ERROR,
"Error powering down card: %ld 0x%04lX",
934 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
946 UCHAR controlBuffer[5];
953 controlBuffer[0] = 0x20;
954 controlBuffer[1] = 0x15;
955 controlBuffer[2] = (rContext->
slot & 0x0000FFFF) + 1;
956 controlBuffer[3] = 0x00;
957 controlBuffer[4] = 0x00;
959 rv = IFDControl_v2(rContext, controlBuffer, 5, receiveBuffer,
964 if (receiveLength == 2 && receiveBuffer[0] == 0x90)
966 Log1(PCSC_LOG_DEBUG,
"Card ejected successfully.");
972 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
975 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
988 (void)RFRemoveReaderHandle(rContext, hCard);
1008 RESPONSECODE (*fct)(DWORD) = NULL;
1014 if (POWER_STATE_POWERED <= rContext->powerState)
1017 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_GRACE_PERIOD");
1024 dwGetSize =
sizeof(fct);
1026 &dwGetSize, (PUCHAR)&fct);
1028 if ((
IFD_SUCCESS == rv) && (dwGetSize ==
sizeof(fct)))
1030 Log1(PCSC_LOG_INFO,
"Stopping polling thread");
1031 fct(rContext->
slot);
1043 UNREF_READER(rContext)
1057 rv = RFReaderInfoById(hCard, &rContext);
1064 rv = RFCheckReaderStatus(rContext);
1071 rv = RFCheckReaderEventState(rContext, hCard);
1075 rv = RFLockSharing(hCard, rContext);
1082 Log2(PCSC_LOG_DEBUG,
"Status: 0x%08lX", rv);
1085 UNREF_READER(rContext)
1109 rv = RFReaderInfoById(hCard, &rContext);
1116 rv = RFCheckReaderEventState(rContext, hCard);
1125 && (rContext->
hLockId != hCard))
1127 Log1(PCSC_LOG_INFO,
"No card reset within a transaction");
1165 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
1166 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
1173 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
1184 UCHAR controlBuffer[5];
1186 DWORD receiveLength;
1191 controlBuffer[0] = 0x20;
1192 controlBuffer[1] = 0x15;
1193 controlBuffer[2] = (rContext->
slot & 0x0000FFFF) + 1;
1194 controlBuffer[3] = 0x00;
1195 controlBuffer[4] = 0x00;
1197 rv = IFDControl_v2(rContext, controlBuffer, 5, receiveBuffer,
1202 if (receiveLength == 2 && receiveBuffer[0] == 0x90)
1204 Log1(PCSC_LOG_DEBUG,
"Card ejected successfully.");
1210 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
1213 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
1228 rv2 = RFUnlockSharing(hCard, rContext);
1234 Log2(PCSC_LOG_DEBUG,
"Status: 0x%08lX", rv);
1237 UNREF_READER(rContext)
1243 LPDWORD pcchReaderLen, LPDWORD pdwState,
1244 LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
1251 (void)szReaderNames;
1252 (void)pcchReaderLen;
1262 rv = RFReaderInfoById(hCard, &rContext);
1269 rv = RFCheckSharing(hCard, rContext);
1288 rv = RFCheckReaderEventState(rContext, hCard);
1295 rv = RFCheckReaderStatus(rContext);
1300 UNREF_READER(rContext)
1306 LPCVOID pbSendBuffer, DWORD cbSendLength,
1307 LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
1313 *lpBytesReturned = 0;
1319 rv = RFReaderInfoById(hCard, &rContext);
1326 rv = RFCheckSharing(hCard, rContext);
1330 if (IFD_HVERSION_2_0 == rContext->
version)
1331 if (NULL == pbSendBuffer || 0 == cbSendLength)
1340 rv = RFCheckReaderStatus(rContext);
1344 if (IFD_HVERSION_2_0 == rContext->
version)
1347 *lpBytesReturned = cbRecvLength;
1348 rv = IFDControl_v2(rContext, (PUCHAR)pbSendBuffer,
1349 cbSendLength, pbRecvBuffer, lpBytesReturned);
1352 if (IFD_HVERSION_3_0 == rContext->
version)
1353 rv =
IFDControl(rContext, dwControlCode, pbSendBuffer,
1354 cbSendLength, pbRecvBuffer, cbRecvLength, lpBytesReturned);
1359 UNREF_READER(rContext)
1365 LPBYTE pbAttr, LPDWORD pcbAttrLen)
1374 rv = RFReaderInfoById(hCard, &rContext);
1381 rv = RFCheckSharing(hCard, rContext);
1388 rv = RFCheckReaderStatus(rContext);
1395 rv = RFCheckReaderEventState(rContext, hCard);
1414 if (len > *pcbAttrLen)
1434 UNREF_READER(rContext)
1440 LPCBYTE pbAttr, DWORD cbAttrLen)
1449 rv = RFReaderInfoById(hCard, &rContext);
1456 rv = RFCheckSharing(hCard, rContext);
1463 rv = RFCheckReaderStatus(rContext);
1470 rv = RFCheckReaderEventState(rContext, hCard);
1484 UNREF_READER(rContext)
1490 LPCBYTE pbSendBuffer, DWORD cbSendLength,
1492 LPDWORD pcbRecvLength)
1497 DWORD dwRxLength, tempRxLength;
1499 dwRxLength = *pcbRecvLength;
1512 rv = RFReaderInfoById(hCard, &rContext);
1519 rv = RFCheckSharing(hCard, rContext);
1526 rv = RFCheckReaderStatus(rContext);
1533 rv = RFCheckReaderEventState(rContext, hCard);
1566 sSendPci.Protocol = 0;
1570 sSendPci.Protocol = 1;
1583 for (i = 0 ; prot != 1 && i < 16; i++)
1586 sSendPci.Protocol = i;
1595 Log2(PCSC_LOG_DEBUG,
"Send Protocol: T=%ld", sSendPci.Protocol);
1597 tempRxLength = dwRxLength;
1600 && (rContext->
version == IFD_HVERSION_2_0))
1602 rv = IFDControl_v2(rContext, (PUCHAR) pbSendBuffer, cbSendLength,
1603 pbRecvBuffer, &dwRxLength);
1606 rv =
IFDTransmit(rContext, sSendPci, (PUCHAR) pbSendBuffer,
1607 cbSendLength, pbRecvBuffer, &dwRxLength, &sRecvPci);
1620 Log2(PCSC_LOG_ERROR,
"Card not transacted: 0x%08lX", rv);
1635 if (tempRxLength < dwRxLength)
1645 *pcbRecvLength = dwRxLength;
1648 UNREF_READER(rContext)