diff options
author | Yuval Kashtan <ykashtan@redhat.com> | 2010-07-06 18:50:17 +0300 |
---|---|---|
committer | Yuval Kashtan <ykashtan@redhat.com> | 2010-07-06 18:50:17 +0300 |
commit | 83c8528ce4a208e81ef55324648c79b153b3cedb (patch) | |
tree | 6b0d0530c9bd87fa082e537d88c4b3c726e0f847 | |
parent | b82112f289aa8d8ec8866e6f3f18df974c2cbc81 (diff) |
re-order and more features
-rw-r--r-- | SCClient.c | 153 | ||||
-rw-r--r-- | scard_common.h | 2 |
2 files changed, 144 insertions, 11 deletions
@@ -1,6 +1,7 @@ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <wintypes.h> #include <pcsclite.h> @@ -13,6 +14,10 @@ #include "scard_common.h" #define APDUBufSize 65535 +#define ReaderName "Athena ASE IIIe 00 00" + +int sock; +SCARDCONTEXT hContext; int PrintByteArray ( @@ -32,23 +37,101 @@ PrintUsage () { } int +SendMsg ( + MsgType type, + void *msg, + unsigned int nLength +) { + LONG rv; + SCRMsgHeader mhHeader; + + mhHeader.type = type; + mhHeader.nLength = nLength; + rv = write ( + sock, + &mhHeader, + sizeof (mhHeader) + ); + if (rv < 0) { + /* Error */ + printf ("write header error\n"); + close (sock); + return (16); + } + rv = write ( + sock, + msg, + nLength + ); + if (rv < 0) { + /* Error */ + printf ("write error\n"); + close (sock); + return (16); + } + + return (0); +} + +int +WaitForCardInsert () { + long rv; + + SCARD_READERSTATE_A rgReaderStates[1]; + + rgReaderStates[0].szReader = ReaderName; + rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE; + + rv = SCardGetStatusChange ( + hContext, + INFINITE, + rgReaderStates, + 1 + ); + if (rv != SCARD_S_SUCCESS) { + printf ("SCardGetStatusChange Error (%d)\n", rv); + } + +printf ("Reader state: 0x%04X\n", rgReaderStates[0].dwEventState); + while (!(rgReaderStates[0].dwEventState & SCARD_STATE_PRESENT)) { + /* No card */ +printf ("Waiting for card!\n"); + rgReaderStates[0].dwCurrentState = rgReaderStates[0].dwEventState; + rv = SCardGetStatusChange ( + hContext, + INFINITE, + rgReaderStates, + 1 + ); + if (rv != SCARD_S_SUCCESS) { + printf ("SCardGetStatusChange Error (%d)\n", rv); + } + } + + SendMsg ( + SCard_ATR, + rgReaderStates[0].rgbAtr, + rgReaderStates[0].cbAtr + ); +printf ("Card inserted!\nATR="); +} + +int main ( int argc, char *argv[] ) { - int sock; struct sockaddr_in servaddr; SCRMsgHeader mhHeader; LONG rv; - SCARDCONTEXT hContext; SCARDHANDLE hCard; + SCARD_READERSTATE_A rgReaderStates[1]; DWORD dwActiveProtocol, dwSendLength, dwRecvLength; SCARD_IO_REQUEST pioRecvPci; BYTE pbRecvBuffer[APDUBufSize]; BYTE pbSendBuffer[APDUBufSize]; - //BYTE pbSendBuffer[] = { 0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 }; if (argc != 3) { PrintUsage(); @@ -61,7 +144,7 @@ main ( 0 ); if (sock < 0) { - /* Error */ + // Error printf ("Error opening socket!\n"); } @@ -73,15 +156,16 @@ main ( if ( connect ( sock, - &servaddr, + (struct sockaddr *)&servaddr, sizeof(servaddr) ) < 0 ) { - /* Error */ + // Error printf ("Could not connect\n"); return (5); } printf ("Connected (sizeof Header=%d)!\n", sizeof (mhHeader)); + rv = SCardEstablishContext ( SCARD_SCOPE_SYSTEM, NULL, @@ -92,15 +176,51 @@ printf ("Connected (sizeof Header=%d)!\n", sizeof (mhHeader)); printf ("SCardEstablishContext error (%d)\n", rv); } + rgReaderStates[0].szReader = ReaderName; + rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE; + + rv = SCardGetStatusChange ( + hContext, + INFINITE, + rgReaderStates, + 1 + ); + if (rv != SCARD_S_SUCCESS) { + printf ("SCardGetStatusChange Error (%d)\n", rv); + } + +printf ("Reader state: 0x%04X\n", rgReaderStates[0].dwEventState); + while (!(rgReaderStates[0].dwEventState & SCARD_STATE_PRESENT)) { + /* No card */ +printf ("Waiting for card!\n"); + rgReaderStates[0].dwCurrentState = rgReaderStates[0].dwEventState; + rv = SCardGetStatusChange ( + hContext, + INFINITE, + rgReaderStates, + 1 + ); + if (rv != SCARD_S_SUCCESS) { + printf ("SCardGetStatusChange Error (%d)\n", rv); + } + } +printf ("Card inserted!\nATR="); +PrintByteArray (rgReaderStates[0].rgbAtr, rgReaderStates[0].cbAtr); + + SendMsg ( + SCard_ATR, + rgReaderStates[0].rgbAtr, + rgReaderStates[0].cbAtr + ); + rv = SCardConnect ( hContext, - "Athena ASE IIIe 00 00", + ReaderName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol ); - if (rv != SCARD_S_SUCCESS) { printf ("SCardConnect Error (%d)\n", rv); exit (1); @@ -148,8 +268,21 @@ PrintByteArray (pbSendBuffer, mhHeader.nLength); &dwRecvLength ); if (rv != SCARD_S_SUCCESS) { - printf ("SCardTransmit Error (%d)\n", rv); - exit (12); + SendMsg ( + SCard_Error, + &rv, + sizeof (LONG) + ); + + if (rv == SCARD_W_REMOVED_CARD) { + // Card removed + SendMsg ( + SCard_Remove, + NULL, + 0 + ); + WaitForCardInsert (); + } } mhHeader.nLength = dwRecvLength; printf ("send APDU: "); diff --git a/scard_common.h b/scard_common.h index c84bf5b..8e54f86 100644 --- a/scard_common.h +++ b/scard_common.h @@ -5,7 +5,7 @@ typedef enum { SCard_ATR, SCard_APDU, SCard_Remove, - SCard_Quit + SCard_Error } MsgType; typedef struct SCRMsgHeader { |