110 #define PROFILE_FILE "/tmp/pcscd_profile"
112 #include <sys/time.h>
116 struct timeval profile_time_start;
120 #define PROFILE_START profile_start(__FUNCTION__);
121 #define PROFILE_END profile_end(__FUNCTION__, __LINE__);
123 static void profile_start(
const char *f)
125 static char initialized = FALSE;
130 fd = fopen(PROFILE_FILE,
"a+");
133 fprintf(stderr,
"\33[01;31mCan't open %s: %s\33[0m\n",
134 PROFILE_FILE, strerror(errno));
137 fprintf(fd,
"\nStart a new profile\n");
140 if (isatty(fileno(stderr)))
146 gettimeofday(&profile_time_start, NULL);
150 static void profile_end(
const char *f,
int line)
152 struct timeval profile_time_end;
155 gettimeofday(&profile_time_end, NULL);
156 d =
time_sub(&profile_time_end, &profile_time_start);
159 fprintf(stderr,
"\33[01;31mRESULT %s \33[35m%ld\33[0m (%d)\n", f, d,
161 fprintf(fd,
"%s %ld\n", f, d);
166 #define PROFILE_START
171 #define SCARD_PROTOCOL_ANY_OLD 0x1000
174 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
193 Log2(PCSC_LOG_DEBUG,
"Establishing Context: 0x%lX", *phContext);
204 Log2(PCSC_LOG_DEBUG,
"Releasing Context: 0x%lX", hContext);
210 DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
211 LPDWORD pdwActiveProtocol)
215 uint32_t readerState;
234 Log3(PCSC_LOG_DEBUG,
"Attempting Connect to %s using protocol: %ld",
235 szReader, dwPreferredProtocols);
237 rv = RFReaderInfo((LPSTR) szReader, &rContext);
241 Log2(PCSC_LOG_ERROR,
"Reader %s Not Found", szReader);
248 rv = RFCheckReaderStatus(rContext);
263 Log1(PCSC_LOG_ERROR,
"Error Reader Exclusive");
272 Log1(PCSC_LOG_INFO,
"Waiting for release of lock");
275 Log1(PCSC_LOG_INFO,
"Lock released");
290 Log1(PCSC_LOG_DEBUG,
"Card Not Inserted");
309 Log1(PCSC_LOG_DEBUG,
"power up complete.");
310 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
315 Log3(PCSC_LOG_ERROR,
"Error powering up card: %ld 0x%04lX",
321 Log1(PCSC_LOG_ERROR,
"Card Not Powered");
328 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_INUSE");
346 (void)pthread_mutex_lock(rContext->
mMutex);
351 int availableProtocols, defaultProtocol;
359 if (dwPreferredProtocols & SCARD_PROTOCOL_ANY_OLD)
363 availableProtocols, defaultProtocol);
366 if (SET_PROTOCOL_PPS_FAILED == ret)
368 (void)pthread_mutex_unlock(rContext->
mMutex);
372 if (SET_PROTOCOL_WRONG_ARGUMENT == ret)
374 (void)pthread_mutex_unlock(rContext->
mMutex);
381 (void)pthread_mutex_unlock(rContext->
mMutex);
385 (void)pthread_mutex_unlock(rContext->
mMutex);
397 switch (*pdwActiveProtocol)
400 case SCARD_PROTOCOL_T1:
401 Log2(PCSC_LOG_DEBUG,
"Active Protocol: T=%d",
405 case SCARD_PROTOCOL_RAW:
406 Log1(PCSC_LOG_DEBUG,
"Active Protocol: RAW");
410 Log2(PCSC_LOG_ERROR,
"Active Protocol: unknown %ld",
415 Log1(PCSC_LOG_DEBUG,
"Direct access: no protocol selected");
420 *phCard = RFCreateReaderHandle(rContext);
422 Log2(PCSC_LOG_DEBUG,
"hCard Identity: %lx", *phCard);
436 (void)RFLockSharing(*phCard, rContext);
440 (void)RFDestroyReaderHandle(*phCard);
456 rv = RFAddReaderHandle(rContext, *phCard);
463 (void)RFDestroyReaderHandle(*phCard);
488 DWORD dwPreferredProtocols, DWORD dwInitialization,
489 LPDWORD pdwActiveProtocol)
494 Log1(PCSC_LOG_DEBUG,
"Attempting reconnect to token.");
520 rv = RFReaderInfoById(hCard, &rContext);
527 rv = RFCheckReaderStatus(rContext);
531 rv = RFFindReaderHandle(hCard);
538 rv = RFCheckSharing(hCard, rContext);
550 (void)RFSetReaderEventState(rContext,
SCARD_RESET);
579 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
580 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
587 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
621 if (dwPreferredProtocols & SCARD_PROTOCOL_RAW)
629 (void)pthread_mutex_lock(rContext->
mMutex);
634 int availableProtocols, defaultProtocol;
642 if (dwPreferredProtocols & SCARD_PROTOCOL_ANY_OLD)
646 availableProtocols, defaultProtocol);
649 if (SET_PROTOCOL_PPS_FAILED == ret)
651 (void)pthread_mutex_unlock(rContext->
mMutex);
655 if (SET_PROTOCOL_WRONG_ARGUMENT == ret)
657 (void)pthread_mutex_unlock(rContext->
mMutex);
664 (void)pthread_mutex_unlock(rContext->
mMutex);
668 (void)pthread_mutex_unlock(rContext->
mMutex);
680 switch (*pdwActiveProtocol)
682 case SCARD_PROTOCOL_T0:
683 case SCARD_PROTOCOL_T1:
684 Log2(PCSC_LOG_DEBUG,
"Active Protocol: T=%d",
685 (*pdwActiveProtocol == SCARD_PROTOCOL_T0) ? 0 : 1);
688 case SCARD_PROTOCOL_RAW:
689 Log1(PCSC_LOG_DEBUG,
"Active Protocol: RAW");
693 Log2(PCSC_LOG_ERROR,
"Active Protocol: unknown %ld",
698 Log1(PCSC_LOG_DEBUG,
"Direct access: no protocol selected");
712 (void)RFLockSharing(hCard, rContext);
730 (void)RFUnlockSharing(hCard, rContext);
745 (void)RFUnlockSharing(hCard, rContext);
754 (void)RFClearReaderEventState(rContext, hCard);
773 rv = RFReaderInfoById(hCard, &rContext);
777 rv = RFFindReaderHandle(hCard);
791 && (rContext->
hLockId != hCard))
793 Log1(PCSC_LOG_INFO,
"Waiting for release of lock");
796 Log1(PCSC_LOG_INFO,
"Lock released");
806 rv = RFUnlockAllSharing(hCard, rContext);
820 Log2(PCSC_LOG_DEBUG,
"Active Contexts: %d", rContext->
contexts);
821 Log2(PCSC_LOG_DEBUG,
"dwDisposition: %ld", dwDisposition);
831 (void)RFSetReaderEventState(rContext,
SCARD_RESET);
845 #ifdef DISABLE_AUTO_POWER_ON
847 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
857 #ifdef DISABLE_AUTO_POWER_ON
865 Log3(PCSC_LOG_ERROR,
"Error powering down card: %d 0x%04X",
873 Log1(PCSC_LOG_INFO,
"Skip card power on");
887 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
888 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
895 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
907 UCHAR controlBuffer[5];
914 controlBuffer[0] = 0x20;
915 controlBuffer[1] = 0x15;
916 controlBuffer[2] = (rContext->
slot & 0x0000FFFF) + 1;
917 controlBuffer[3] = 0x00;
918 controlBuffer[4] = 0x00;
920 rv = IFDControl_v2(rContext, controlBuffer, 5, receiveBuffer,
925 if (receiveLength == 2 && receiveBuffer[0] == 0x90)
927 Log1(PCSC_LOG_DEBUG,
"Card ejected successfully.");
933 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
936 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
949 (void)RFRemoveReaderHandle(rContext, hCard);
950 (void)RFDestroyReaderHandle(hCard);
970 RESPONSECODE (*fct)(DWORD) = NULL;
976 if (POWER_STATE_POWERED <= rContext->powerState)
978 #ifdef DISABLE_AUTO_POWER_ON
982 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_GRACE_PERIOD");
986 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_GRACE_PERIOD");
994 dwGetSize =
sizeof(fct);
996 &dwGetSize, (PUCHAR)&fct);
998 if ((
IFD_SUCCESS == rv) && (dwGetSize ==
sizeof(fct)))
1000 Log1(PCSC_LOG_INFO,
"Stoping polling thread");
1001 fct(rContext->
slot);
1022 rv = RFReaderInfoById(hCard, &rContext);
1029 rv = RFCheckReaderStatus(rContext);
1033 rv = RFFindReaderHandle(hCard);
1040 rv = RFCheckReaderEventState(rContext, hCard);
1044 rv = RFLockSharing(hCard, rContext);
1051 Log2(PCSC_LOG_DEBUG,
"Status: 0x%08lX", rv);
1074 rv = RFReaderInfoById(hCard, &rContext);
1078 rv = RFFindReaderHandle(hCard);
1085 rv = RFCheckReaderEventState(rContext, hCard);
1114 (void)RFSetReaderEventState(rContext,
SCARD_RESET);
1125 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
1126 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
1133 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
1144 UCHAR controlBuffer[5];
1146 DWORD receiveLength;
1151 controlBuffer[0] = 0x20;
1152 controlBuffer[1] = 0x15;
1153 controlBuffer[2] = (rContext->
slot & 0x0000FFFF) + 1;
1154 controlBuffer[3] = 0x00;
1155 controlBuffer[4] = 0x00;
1157 rv = IFDControl_v2(rContext, controlBuffer, 5, receiveBuffer,
1162 if (receiveLength == 2 && receiveBuffer[0] == 0x90)
1164 Log1(PCSC_LOG_DEBUG,
"Card ejected successfully.");
1170 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
1173 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
1186 (void)RFUnlockSharing(hCard, rContext);
1188 Log2(PCSC_LOG_DEBUG,
"Status: 0x%08lX", rv);
1194 LPDWORD pcchReaderLen, LPDWORD pdwState,
1195 LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
1202 (void)mszReaderNames;
1203 (void)pcchReaderLen;
1213 rv = RFReaderInfoById(hCard, &rContext);
1220 rv = RFCheckSharing(hCard, rContext);
1236 rv = RFCheckReaderEventState(rContext, hCard);
1243 rv = RFCheckReaderStatus(rContext);
1251 LPCVOID pbSendBuffer, DWORD cbSendLength,
1252 LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
1258 *lpBytesReturned = 0;
1264 rv = RFReaderInfoById(hCard, &rContext);
1271 rv = RFCheckSharing(hCard, rContext);
1275 if (IFD_HVERSION_2_0 == rContext->
version)
1276 if (NULL == pbSendBuffer || 0 == cbSendLength)
1282 rv = RFCheckReaderStatus(rContext);
1286 rv = RFFindReaderHandle(hCard);
1290 if (IFD_HVERSION_2_0 == rContext->
version)
1293 *lpBytesReturned = cbRecvLength;
1294 return IFDControl_v2(rContext, (PUCHAR)pbSendBuffer,
1295 cbSendLength, pbRecvBuffer, lpBytesReturned);
1298 if (IFD_HVERSION_3_0 == rContext->
version)
1299 return IFDControl(rContext, dwControlCode, pbSendBuffer,
1300 cbSendLength, pbRecvBuffer, cbRecvLength, lpBytesReturned);
1306 LPBYTE pbAttr, LPDWORD pcbAttrLen)
1315 rv = RFReaderInfoById(hCard, &rContext);
1322 rv = RFCheckSharing(hCard, rContext);
1329 rv = RFCheckReaderStatus(rContext);
1333 rv = RFFindReaderHandle(hCard);
1340 rv = RFCheckReaderEventState(rContext, hCard);
1359 if (len > *pcbAttrLen)
1363 (void)strlcpy((
char *)pbAttr,
1383 LPCBYTE pbAttr, DWORD cbAttrLen)
1392 rv = RFReaderInfoById(hCard, &rContext);
1399 rv = RFCheckSharing(hCard, rContext);
1406 rv = RFCheckReaderStatus(rContext);
1410 rv = RFFindReaderHandle(hCard);
1417 rv = RFCheckReaderEventState(rContext, hCard);
1432 LPCBYTE pbSendBuffer, DWORD cbSendLength,
1434 LPDWORD pcbRecvLength)
1439 DWORD dwRxLength, tempRxLength;
1441 dwRxLength = *pcbRecvLength;
1454 rv = RFReaderInfoById(hCard, &rContext);
1461 rv = RFCheckSharing(hCard, rContext);
1468 rv = RFCheckReaderStatus(rContext);
1472 rv = RFFindReaderHandle(hCard);
1479 rv = RFCheckReaderEventState(rContext, hCard);
1510 sSendPci.Protocol = 0;
1514 sSendPci.Protocol = 1;
1527 for (i = 0 ; prot != 1 ; i++)
1530 sSendPci.Protocol = i;
1539 Log2(PCSC_LOG_DEBUG,
"Send Protocol: T=%ld", sSendPci.Protocol);
1541 tempRxLength = dwRxLength;
1544 && (rContext->
version == IFD_HVERSION_2_0))
1546 rv = IFDControl_v2(rContext, (PUCHAR) pbSendBuffer, cbSendLength,
1547 pbRecvBuffer, &dwRxLength);
1550 rv =
IFDTransmit(rContext, sSendPci, (PUCHAR) pbSendBuffer,
1551 cbSendLength, pbRecvBuffer, &dwRxLength, &sRecvPci);
1564 Log2(PCSC_LOG_ERROR,
"Card not transacted: 0x%08lX", rv);
1571 if (tempRxLength < dwRxLength)
1580 *pcbRecvLength = dwRxLength;