summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Kashtan <ykashtan@redhat.com>2010-07-06 18:50:17 +0300
committerYuval Kashtan <ykashtan@redhat.com>2010-07-06 18:50:17 +0300
commit83c8528ce4a208e81ef55324648c79b153b3cedb (patch)
tree6b0d0530c9bd87fa082e537d88c4b3c726e0f847
parentb82112f289aa8d8ec8866e6f3f18df974c2cbc81 (diff)
re-order and more features
-rw-r--r--SCClient.c153
-rw-r--r--scard_common.h2
2 files changed, 144 insertions, 11 deletions
diff --git a/SCClient.c b/SCClient.c
index cc52aae..d912a2d 100644
--- a/SCClient.c
+++ b/SCClient.c
@@ -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 {