19 #include <sys/types.h>
46 LONG EHRegisterClientForEvent(int32_t filedes)
50 (void)list_append(&ClientsWaitingForEvent, &filedes);
68 ret = list_delete(&ClientsWaitingForEvent, &filedes);
86 Log2(PCSC_LOG_ERROR,
"Can't remove client: %d", filedes);
101 (void)list_iterator_start(&ClientsWaitingForEvent);
102 while (list_iterator_hasnext(&ClientsWaitingForEvent))
104 filedes = *(int32_t *)list_iterator_next(&ClientsWaitingForEvent);
107 (void)list_iterator_stop(&ClientsWaitingForEvent);
109 (void)list_clear(&ClientsWaitingForEvent);
116 LONG EHInitializeEventStructures(
void)
118 (void)list_init(&ClientsWaitingForEvent);
121 (void)list_attributes_copy(&ClientsWaitingForEvent, list_meter_int32_t, 1);
124 (void)list_attributes_comparator(&ClientsWaitingForEvent, list_comparator_int32_t);
139 Log1(PCSC_LOG_INFO,
"Thread already stomped.");
148 Log1(PCSC_LOG_INFO,
"Stomping thread.");
151 dwGetSize =
sizeof(ucGetData);
153 &dwGetSize, ucGetData);
155 #ifdef HAVE_PTHREAD_CANCEL
156 if ((
IFD_SUCCESS == rv) && (1 == dwGetSize) && ucGetData[0])
158 Log1(PCSC_LOG_INFO,
"Killing polling thread");
159 (void)pthread_cancel(rContext->
pthThread);
165 RESPONSECODE (*fct)(DWORD) = NULL;
167 dwGetSize =
sizeof(fct);
169 &dwGetSize, (PUCHAR)&fct);
171 if ((
IFD_SUCCESS == rv) && (dwGetSize ==
sizeof(fct)))
173 Log1(PCSC_LOG_INFO,
"Request stopping of polling thread");
177 Log1(PCSC_LOG_INFO,
"Waiting polling thread");
181 rv = pthread_join(rContext->
pthThread, NULL);
183 Log2(PCSC_LOG_ERROR,
"pthread_join failed: %s", strerror(rv));
188 Log1(PCSC_LOG_INFO,
"Thread stomped.");
201 Log2(PCSC_LOG_ERROR,
"Initial Check Failed on %s",
206 rv = ThreadCreate(&rContext->
pthThread, 0,
207 (PCSCLITE_THREAD_FUNCTION( ))EHStatusHandlerThread, (LPVOID) rContext);
210 Log2(PCSC_LOG_ERROR,
"ThreadCreate failed: %s", strerror(rv));
220 const char *readerName;
222 uint32_t readerState;
223 int32_t readerSharing;
224 DWORD dwCurrentState;
238 #ifdef DISABLE_AUTO_POWER_ON
242 Log1(PCSC_LOG_INFO,
"Skip card power on");
256 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_POWERED");
260 LogXxd(PCSC_LOG_INFO,
"Card ATR: ",
265 Log1(PCSC_LOG_INFO,
"Card ATR: (NULL)");
271 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
272 Log3(PCSC_LOG_ERROR,
"Error powering up card: %ld 0x%04lX", rv, rv);
303 Log2(PCSC_LOG_ERROR,
"Error communicating to: %s", readerName);
319 if (dwCurrentState == SCARD_PRESENT ||
325 Log2(PCSC_LOG_INFO,
"Card Removed From %s", readerName);
342 else if (dwStatus & SCARD_PRESENT)
344 if (dwCurrentState == SCARD_ABSENT ||
347 #ifdef DISABLE_AUTO_POWER_ON
352 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
355 Log1(PCSC_LOG_INFO,
"Skip card power on");
372 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_POWERED");
378 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
387 Log2(PCSC_LOG_INFO,
"Card inserted into %s", readerName);
395 LogXxd(PCSC_LOG_INFO,
"Card ATR: ",
400 Log1(PCSC_LOG_INFO,
"Card ATR: (NULL)");
403 Log1(PCSC_LOG_ERROR,
"Error powering up card.");
410 if (readerSharing != rContext->
contexts)
422 #ifndef DISABLE_ON_DEMAND_POWER_ON
438 #ifndef DISABLE_ON_DEMAND_POWER_ON
446 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_UNPOWERED");
458 Log1(PCSC_LOG_DEBUG,
"powerState: POWER_STATE_POWERED");
463 if (rContext->
hLockId == 0xFFFF)
469 Log1(PCSC_LOG_INFO,
"Die");
471 (void)pthread_exit(NULL);