55#define p_SCardEstablishContext(fct) LONG(fct)(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
57#define p_SCardReleaseContext(fct) LONG(fct)(SCARDCONTEXT hContext)
59#define p_SCardIsValidContext(fct) LONG(fct) (SCARDCONTEXT hContext)
61#define p_SCardConnect(fct) LONG(fct) (SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
63#define p_SCardReconnect(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol)
65#define p_SCardDisconnect(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwDisposition)
67#define p_SCardBeginTransaction(fct) LONG(fct) (SCARDHANDLE hCard)
69#define p_SCardEndTransaction(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwDisposition)
71#define p_SCardStatus(fct) LONG(fct) (SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
73#define p_SCardGetStatusChange(fct) LONG(fct) (SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATE rgReaderStates, DWORD cReaders)
75#define p_SCardControl(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer, DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
77#define p_SCardTransmit(fct) LONG(fct) (SCARDHANDLE hCard, const SCARD_IO_REQUEST * pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, SCARD_IO_REQUEST * pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
79#define p_SCardListReaderGroups(fct) LONG(fct) (SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups)
81#define p_SCardListReaders(fct) LONG(fct) (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
83#define p_SCardFreeMemory(fct) LONG(fct) (SCARDCONTEXT hContext, LPCVOID pvMem)
85#define p_SCardCancel(fct) LONG(fct) (SCARDCONTEXT hContext)
87#define p_SCardGetAttrib(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen)
89#define p_SCardSetAttrib(fct) LONG(fct) (SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen)
92static LONG internal_error(
void)
97#pragma GCC diagnostic push
98#pragma GCC diagnostic ignored "-Wcast-function-type"
102 p_SCardEstablishContext(*SCardEstablishContext);
103 p_SCardReleaseContext(*SCardReleaseContext);
104 p_SCardIsValidContext(*SCardIsValidContext);
105 p_SCardConnect(*SCardConnect);
106 p_SCardReconnect(*SCardReconnect);
107 p_SCardDisconnect(*SCardDisconnect);
108 p_SCardBeginTransaction(*SCardBeginTransaction);
109 p_SCardEndTransaction(*SCardEndTransaction);
110 p_SCardStatus(*SCardStatus);
111 p_SCardGetStatusChange(*SCardGetStatusChange);
112 p_SCardControl(*SCardControl);
113 p_SCardTransmit(*SCardTransmit);
114 p_SCardListReaderGroups(*SCardListReaderGroups);
115 p_SCardListReaders(*SCardListReaders);
116 p_SCardFreeMemory(*SCardFreeMemory);
117 p_SCardCancel(*SCardCancel);
118 p_SCardGetAttrib(*SCardGetAttrib);
119 p_SCardSetAttrib(*SCardSetAttrib);
122 .SCardEstablishContext = (p_SCardEstablishContext(*))internal_error,
123 .SCardReleaseContext = (p_SCardReleaseContext(*))internal_error,
124 .SCardIsValidContext = (p_SCardIsValidContext(*))internal_error,
125 .SCardConnect = (p_SCardConnect(*))internal_error,
126 .SCardReconnect = (p_SCardReconnect(*))internal_error,
127 .SCardDisconnect = (p_SCardDisconnect(*))internal_error,
128 .SCardBeginTransaction = (p_SCardBeginTransaction(*))internal_error,
129 .SCardEndTransaction = (p_SCardEndTransaction(*))internal_error,
130 .SCardStatus = (p_SCardStatus(*))internal_error,
131 .SCardGetStatusChange = (p_SCardGetStatusChange(*))internal_error,
132 .SCardControl = (p_SCardControl(*))internal_error,
133 .SCardTransmit = (p_SCardTransmit(*))internal_error,
134 .SCardListReaderGroups = (p_SCardListReaderGroups(*))internal_error,
135 .SCardListReaders = (p_SCardListReaders(*))internal_error,
136 .SCardFreeMemory = (p_SCardFreeMemory(*))internal_error,
137 .SCardCancel = (p_SCardCancel(*))internal_error,
138 .SCardGetAttrib = (p_SCardGetAttrib(*))internal_error,
139 .SCardSetAttrib = (p_SCardSetAttrib(*))internal_error,
141#pragma GCC diagnostic pop
143static void *Lib_handle = NULL;
146static void log_line(
const char *fmt, ...)
156static void log_line(
const char *fmt, ...)
161static LONG load_lib(
void)
163#define LIBPCSC "libpcsclite_real.so.1"
172 Lib_handle = dlopen(lib, RTLD_LAZY);
173 if (NULL == Lib_handle)
175 log_line(
"loading \"%s\" failed: %s", lib, dlerror());
179#define get_symbol(s) do { redirect.s = dlsym(Lib_handle, #s); if (NULL == redirect.s) { log_line("%s", dlerror()); return SCARD_F_INTERNAL_ERROR; } } while (0)
181 if (SCardEstablishContext == dlsym(Lib_handle,
"SCardEstablishContext"))
183 log_line(
"Symbols dlsym error");
187 get_symbol(SCardEstablishContext);
188 get_symbol(SCardReleaseContext);
189 get_symbol(SCardIsValidContext);
190 get_symbol(SCardConnect);
191 get_symbol(SCardReconnect);
192 get_symbol(SCardDisconnect);
193 get_symbol(SCardBeginTransaction);
194 get_symbol(SCardEndTransaction);
195 get_symbol(SCardStatus);
196 get_symbol(SCardGetStatusChange);
197 get_symbol(SCardControl);
198 get_symbol(SCardTransmit);
199 get_symbol(SCardListReaderGroups);
200 get_symbol(SCardListReaders);
201 get_symbol(SCardFreeMemory);
202 get_symbol(SCardCancel);
203 get_symbol(SCardGetAttrib);
204 get_symbol(SCardSetAttrib);
211PCSC_API p_SCardEstablishContext(SCardEstablishContext)
226 return redirect.SCardEstablishContext(dwScope, pvReserved1, pvReserved2,
231PCSC_API p_SCardReleaseContext(SCardReleaseContext)
233 return redirect.SCardReleaseContext(hContext);
236PCSC_API p_SCardIsValidContext(SCardIsValidContext)
238 return redirect.SCardIsValidContext(hContext);
241PCSC_API p_SCardConnect(SCardConnect)
243 return redirect.SCardConnect(hContext, szReader, dwShareMode,
244 dwPreferredProtocols, phCard, pdwActiveProtocol);
247PCSC_API p_SCardReconnect(SCardReconnect)
249 return redirect.SCardReconnect(hCard, dwShareMode, dwPreferredProtocols,
250 dwInitialization, pdwActiveProtocol);
253PCSC_API p_SCardDisconnect(SCardDisconnect)
255 return redirect.SCardDisconnect(hCard, dwDisposition);
258PCSC_API p_SCardBeginTransaction(SCardBeginTransaction)
260 return redirect.SCardBeginTransaction(hCard);
263PCSC_API p_SCardEndTransaction(SCardEndTransaction)
265 return redirect.SCardEndTransaction(hCard, dwDisposition);
268PCSC_API p_SCardStatus(SCardStatus)
270 return redirect.SCardStatus(hCard, mszReaderName, pcchReaderLen, pdwState,
271 pdwProtocol, pbAtr, pcbAtrLen);
274PCSC_API p_SCardGetStatusChange(SCardGetStatusChange)
276 return redirect.SCardGetStatusChange(hContext, dwTimeout, rgReaderStates,
280PCSC_API p_SCardControl(SCardControl)
282 return redirect.SCardControl(hCard, dwControlCode, pbSendBuffer, cbSendLength,
283 pbRecvBuffer, cbRecvLength, lpBytesReturned);
286PCSC_API p_SCardTransmit(SCardTransmit)
288 return redirect.SCardTransmit(hCard, pioSendPci, pbSendBuffer, cbSendLength,
289 pioRecvPci, pbRecvBuffer, pcbRecvLength);
292PCSC_API p_SCardListReaderGroups(SCardListReaderGroups)
294 return redirect.SCardListReaderGroups(hContext, mszGroups, pcchGroups);
297PCSC_API p_SCardListReaders(SCardListReaders)
299 return redirect.SCardListReaders(hContext, mszGroups, mszReaders, pcchReaders);
302PCSC_API p_SCardFreeMemory(SCardFreeMemory)
304 return redirect.SCardFreeMemory(hContext, pvMem);
307PCSC_API p_SCardCancel(SCardCancel)
309 return redirect.SCardCancel(hContext);
312PCSC_API p_SCardGetAttrib(SCardGetAttrib)
314 return redirect.SCardGetAttrib(hCard, dwAttrId, pbAttr, pcbAttrLen);
317PCSC_API p_SCardSetAttrib(SCardSetAttrib)
319 return redirect.SCardSetAttrib(hCard, dwAttrId, pbAttr, cbAttrLen);
#define SCARD_F_INTERNAL_ERROR
An internal consistency check failed.
#define SCARD_S_SUCCESS
No error was encountered.
PCSC_API const SCARD_IO_REQUEST g_rgSCardRawPci
Protocol Control Information for raw access.
PCSC_API const SCARD_IO_REQUEST g_rgSCardT1Pci
Protocol Control Information for T=1.
PCSC_API const SCARD_IO_REQUEST g_rgSCardT0Pci
Protocol Control Information for T=0.
#define SCARD_PROTOCOL_T1
T=1 active protocol.
#define SCARD_PROTOCOL_T0
T=0 active protocol.
#define SCARD_PROTOCOL_RAW
Raw active protocol.
Protocol Control Information (PCI)
This handles abstract system level calls.
const char * SYS_GetEnv(const char *name)
(More) secure version of getenv(3)
This handles smart card reader communications.