105 #include <sys/time.h>
125 #define PROFILE_FILE "/tmp/pcscd_profile"
127 #include <sys/time.h>
131 struct timeval profile_time_start;
135 #define PROFILE_START profile_start(__FUNCTION__);
136 #define PROFILE_END profile_end(__FUNCTION__, __LINE__);
138 static void profile_start(
const char *f)
140 static bool initialized =
false;
145 fd = fopen(PROFILE_FILE,
"a+");
148 fprintf(stderr,
"\33[01;31mCan't open %s: %s\33[0m\n",
149 PROFILE_FILE, strerror(errno));
152 fprintf(fd,
"\nStart a new profile\n");
155 if (isatty(fileno(stderr)))
161 gettimeofday(&profile_time_start, NULL);
165 static void profile_end(
const char *f,
int line)
167 struct timeval profile_time_end;
170 gettimeofday(&profile_time_end, NULL);
171 d =
time_sub(&profile_time_end, &profile_time_start);
174 fprintf(stderr,
"\33[01;31mRESULT %s \33[35m%ld\33[0m (%d)\n", f, d,
176 fprintf(fd,
"%s %ld\n", f, d);
181 #define PROFILE_START
186 #define SCARD_PROTOCOL_ANY_OLD 0x1000
188 static pthread_mutex_t LockMutex = PTHREAD_MUTEX_INITIALIZER;
190 LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
191 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
210 Log2(PCSC_LOG_DEBUG,
"Establishing Context: 0x%lX", *phContext);
224 Log2(PCSC_LOG_DEBUG,
"Releasing Context: 0x%lX", hContext);
229 LONG SCardConnect(
SCARDCONTEXT hContext, LPCSTR szReader,
230 DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
231 LPDWORD pdwActiveProtocol)
253 Log3(PCSC_LOG_DEBUG,
"Attempting Connect to %s using protocol: %ld",
254 szReader, dwPreferredProtocols);
256 rv = RFReaderInfo((LPSTR) szReader, &rContext);
259 Log2(PCSC_LOG_ERROR,
"Reader %s Not Found", szReader);
266 rv = RFCheckReaderStatus(rContext);
281 Log1(PCSC_LOG_ERROR,
"Error Reader Exclusive");
291 Log1(PCSC_LOG_INFO,
"Waiting for release of lock");
294 Log1(PCSC_LOG_INFO,
"Lock released");
307 Log1(PCSC_LOG_DEBUG,
"Card Not Inserted");
314 if (POWER_STATE_UNPOWERED == rContext->
powerState)
327 Log1(PCSC_LOG_DEBUG,
"power up complete.");
328 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
333 Log2(PCSC_LOG_ERROR,
"Error powering up card: %s",
339 Log1(PCSC_LOG_ERROR,
"Card Not Powered");
347 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_IN_USE");
365 (void)pthread_mutex_lock(rContext->
mMutex);
370 int availableProtocols, defaultProtocol;
382 availableProtocols &= dwPreferredProtocols;
385 availableProtocols, defaultProtocol);
388 if (SET_PROTOCOL_PPS_FAILED == ret)
390 (void)pthread_mutex_unlock(rContext->
mMutex);
395 if (SET_PROTOCOL_WRONG_ARGUMENT == ret)
397 (void)pthread_mutex_unlock(rContext->
mMutex);
405 (void)pthread_mutex_unlock(rContext->
mMutex);
409 (void)pthread_mutex_unlock(rContext->
mMutex);
424 switch (*pdwActiveProtocol)
428 Log2(PCSC_LOG_DEBUG,
"Active Protocol: T=%d",
433 Log1(PCSC_LOG_DEBUG,
"Active Protocol: RAW");
437 Log2(PCSC_LOG_ERROR,
"Active Protocol: unknown %ld",
442 Log1(PCSC_LOG_DEBUG,
"Direct access: no protocol selected");
450 (void)pthread_mutex_lock(&LockMutex);
452 *phCard = RFCreateReaderHandle(rContext);
454 Log2(PCSC_LOG_DEBUG,
"hCard Identity: %lx", *phCard);
468 (void)RFLockSharing(*phCard, rContext);
474 (void)pthread_mutex_unlock(&LockMutex);
489 rv = RFAddReaderHandle(rContext, *phCard);
491 (void)pthread_mutex_unlock(&LockMutex);
516 UNREF_READER(rContext)
523 LONG SCardReconnect(
SCARDHANDLE hCard, DWORD dwShareMode,
524 DWORD dwPreferredProtocols, DWORD dwInitialization,
525 LPDWORD pdwActiveProtocol)
530 Log1(PCSC_LOG_DEBUG,
"Attempting reconnect to token.");
556 rv = RFReaderInfoById(hCard, &rContext);
563 rv = RFCheckReaderStatus(rContext);
570 rv = RFCheckSharing(hCard, rContext);
582 RFSetReaderEventState(rContext, SCARD_RESET);
607 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
608 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
615 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
665 (void)pthread_mutex_lock(rContext->
mMutex);
670 int availableProtocols, defaultProtocol;
682 availableProtocols &= dwPreferredProtocols;
685 availableProtocols, defaultProtocol);
688 if (SET_PROTOCOL_PPS_FAILED == ret)
690 (void)pthread_mutex_unlock(rContext->
mMutex);
695 if (SET_PROTOCOL_WRONG_ARGUMENT == ret)
697 (void)pthread_mutex_unlock(rContext->
mMutex);
705 (void)pthread_mutex_unlock(rContext->
mMutex);
709 (void)pthread_mutex_unlock(rContext->
mMutex);
719 RFSetPowerState(rContext, POWER_STATE_IN_USE);
720 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_IN_USE");
728 switch (*pdwActiveProtocol)
732 Log2(PCSC_LOG_DEBUG,
"Active Protocol: T=%d",
737 Log1(PCSC_LOG_DEBUG,
"Active Protocol: RAW");
741 Log2(PCSC_LOG_ERROR,
"Active Protocol: unknown %ld",
746 Log1(PCSC_LOG_DEBUG,
"Direct access: no protocol selected");
761 (void)RFLockSharing(hCard, rContext);
783 (void)RFUnlockSharing(hCard, rContext);
800 (void)RFUnlockSharing(hCard, rContext);
813 (void)RFClearReaderEventState(rContext, hCard);
823 UNREF_READER(rContext)
828 LONG SCardDisconnect(
SCARDHANDLE hCard, DWORD dwDisposition)
843 rv = RFReaderInfoById(hCard, &rContext);
854 && (rContext->
hLockId != hCard))
856 Log1(PCSC_LOG_INFO,
"Waiting for release of lock");
859 Log1(PCSC_LOG_INFO,
"Lock released");
869 rv = RFUnlockAllSharing(hCard, rContext);
883 Log2(PCSC_LOG_DEBUG,
"Active Contexts: %d", rContext->
contexts);
884 Log2(PCSC_LOG_DEBUG,
"dwDisposition: %ld", dwDisposition);
894 RFSetReaderEventState(rContext, SCARD_RESET);
905 RFSetPowerState(rContext, POWER_STATE_UNPOWERED);
906 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
922 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
923 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
931 Log2(PCSC_LOG_ERROR,
"Error powering down card: %s",
936 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
948 UCHAR controlBuffer[5];
955 controlBuffer[0] = 0x20;
956 controlBuffer[1] = 0x15;
957 controlBuffer[2] = (rContext->
slot & 0x0000FFFF) + 1;
958 controlBuffer[3] = 0x00;
959 controlBuffer[4] = 0x00;
961 rv = IFDControl_v2(rContext, controlBuffer, 5, receiveBuffer,
966 if (receiveLength == 2 && receiveBuffer[0] == 0x90)
968 Log1(PCSC_LOG_DEBUG,
"Card ejected successfully.");
974 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
977 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
990 (void)RFRemoveReaderHandle(rContext, hCard);
1010 RESPONSECODE (*fct)(DWORD) = NULL;
1016 if (POWER_STATE_POWERED <= rContext->powerState)
1018 rContext->
powerState = POWER_STATE_GRACE_PERIOD;
1019 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_GRACE_PERIOD");
1026 dwGetSize =
sizeof(fct);
1028 &dwGetSize, (PUCHAR)&fct);
1030 if ((
IFD_SUCCESS == rv) && (dwGetSize ==
sizeof(fct)))
1032 Log1(PCSC_LOG_INFO,
"Stopping polling thread");
1033 fct(rContext->
slot);
1045 UNREF_READER(rContext)
1059 rv = RFReaderInfoById(hCard, &rContext);
1066 rv = RFCheckReaderStatus(rContext);
1073 rv = RFCheckReaderEventState(rContext, hCard);
1077 rv = RFLockSharing(hCard, rContext);
1084 Log2(PCSC_LOG_DEBUG,
"Status: %s", rv2text(rv));
1087 UNREF_READER(rContext)
1092 LONG SCardEndTransaction(
SCARDHANDLE hCard, DWORD dwDisposition)
1111 rv = RFReaderInfoById(hCard, &rContext);
1118 rv = RFCheckReaderEventState(rContext, hCard);
1127 && (rContext->
hLockId != hCard))
1129 Log1(PCSC_LOG_INFO,
"No card reset within a transaction");
1156 RFSetReaderEventState(rContext, SCARD_RESET);
1167 Log1(PCSC_LOG_DEBUG,
"Reset complete.");
1168 LogXxd(PCSC_LOG_DEBUG,
"Card ATR: ",
1175 Log1(PCSC_LOG_ERROR,
"Error resetting card.");
1186 UCHAR controlBuffer[5];
1188 DWORD receiveLength;
1193 controlBuffer[0] = 0x20;
1194 controlBuffer[1] = 0x15;
1195 controlBuffer[2] = (rContext->
slot & 0x0000FFFF) + 1;
1196 controlBuffer[3] = 0x00;
1197 controlBuffer[4] = 0x00;
1199 rv = IFDControl_v2(rContext, controlBuffer, 5, receiveBuffer,
1204 if (receiveLength == 2 && receiveBuffer[0] == 0x90)
1206 Log1(PCSC_LOG_DEBUG,
"Card ejected successfully.");
1212 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
1215 Log1(PCSC_LOG_ERROR,
"Error ejecting card.");
1230 rv2 = RFUnlockSharing(hCard, rContext);
1236 Log2(PCSC_LOG_DEBUG,
"Status: %s", rv2text(rv));
1239 UNREF_READER(rContext)
1244 LONG SCardStatus(
SCARDHANDLE hCard, LPSTR szReaderNames,
1245 LPDWORD pcchReaderLen, LPDWORD pdwState,
1246 LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
1253 (void)szReaderNames;
1254 (void)pcchReaderLen;
1264 rv = RFReaderInfoById(hCard, &rContext);
1271 rv = RFCheckSharing(hCard, rContext);
1290 rv = RFCheckReaderEventState(rContext, hCard);
1297 rv = RFCheckReaderStatus(rContext);
1302 UNREF_READER(rContext)
1307 LONG SCardControl(
SCARDHANDLE hCard, DWORD dwControlCode,
1308 LPCVOID pbSendBuffer, DWORD cbSendLength,
1309 LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
1315 *lpBytesReturned = 0;
1321 rv = RFReaderInfoById(hCard, &rContext);
1328 rv = RFCheckSharing(hCard, rContext);
1332 if (IFD_HVERSION_2_0 == rContext->
version)
1333 if (NULL == pbSendBuffer || 0 == cbSendLength)
1342 rv = RFCheckReaderStatus(rContext);
1346 if (IFD_HVERSION_2_0 == rContext->
version)
1349 *lpBytesReturned = cbRecvLength;
1350 rv = IFDControl_v2(rContext, (PUCHAR)pbSendBuffer,
1351 cbSendLength, pbRecvBuffer, lpBytesReturned);
1354 if (IFD_HVERSION_3_0 == rContext->
version)
1355 rv =
IFDControl(rContext, dwControlCode, pbSendBuffer,
1356 cbSendLength, pbRecvBuffer, cbRecvLength, lpBytesReturned);
1361 UNREF_READER(rContext)
1366 LONG SCardGetAttrib(
SCARDHANDLE hCard, DWORD dwAttrId,
1367 LPBYTE pbAttr, LPDWORD pcbAttrLen)
1376 rv = RFReaderInfoById(hCard, &rContext);
1383 rv = RFCheckSharing(hCard, rContext);
1390 rv = RFCheckReaderStatus(rContext);
1397 rv = RFCheckReaderEventState(rContext, hCard);
1416 if (len > *pcbAttrLen)
1436 UNREF_READER(rContext)
1441 LONG SCardSetAttrib(
SCARDHANDLE hCard, DWORD dwAttrId,
1442 LPCBYTE pbAttr, DWORD cbAttrLen)
1451 rv = RFReaderInfoById(hCard, &rContext);
1458 rv = RFCheckSharing(hCard, rContext);
1465 rv = RFCheckReaderStatus(rContext);
1472 rv = RFCheckReaderEventState(rContext, hCard);
1486 UNREF_READER(rContext)
1492 LPCBYTE pbSendBuffer, DWORD cbSendLength,
1494 LPDWORD pcbRecvLength)
1499 DWORD dwRxLength, tempRxLength;
1501 dwRxLength = *pcbRecvLength;
1514 rv = RFReaderInfoById(hCard, &rContext);
1521 rv = RFCheckSharing(hCard, rContext);
1528 rv = RFCheckReaderStatus(rContext);
1535 rv = RFCheckReaderEventState(rContext, hCard);
1568 sSendPci.Protocol = 0;
1572 sSendPci.Protocol = 1;
1585 for (i = 0 ; prot != 1 && i < 16; i++)
1588 sSendPci.Protocol = i;
1597 Log2(PCSC_LOG_DEBUG,
"Send Protocol: T=%ld", sSendPci.Protocol);
1599 tempRxLength = dwRxLength;
1602 && (rContext->
version == IFD_HVERSION_2_0))
1604 rv = IFDControl_v2(rContext, (PUCHAR) pbSendBuffer, cbSendLength,
1605 pbRecvBuffer, &dwRxLength);
1608 rv =
IFDTransmit(rContext, sSendPci, (PUCHAR) pbSendBuffer,
1609 cbSendLength, pbRecvBuffer, &dwRxLength, &sRecvPci);
1622 Log2(PCSC_LOG_ERROR,
"Card not transacted: %s", rv2text(rv));
1637 if (tempRxLength < dwRxLength)
1647 *pcbRecvLength = dwRxLength;
1650 UNREF_READER(rContext)