summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Kashtan <ykashtan@redhat.com>2010-07-07 20:17:11 +0300
committerAlon Levy <alevy@redhat.com>2010-07-07 20:35:21 +0300
commit4a9450095700865359184aa7f0944a7608062f04 (patch)
treeb7db56bc0a113abd8f8e9789f84db02b2e749b90
parent4641d7b8a72a4ff5a35e60cf9048b4535ad3ab18 (diff)
support reader from commandlien (and whitespace)
-rw-r--r--SCClient.c91
1 files changed, 60 insertions, 31 deletions
diff --git a/SCClient.c b/SCClient.c
index ffa7259..ce1034d 100644
--- a/SCClient.c
+++ b/SCClient.c
@@ -17,7 +17,10 @@
#define ReaderName "Athena ASE IIIe 00 00"
int sock;
+SCARDHANDLE hCard;
+char *szReaderName;
SCARDCONTEXT hContext;
+DWORD dwActiveProtocol;
int
PrintByteArray (
@@ -108,6 +111,21 @@ printf ("Waiting for card!\n");
}
}
+ rv = SCardConnect (
+ hContext,
+ szReaderName,
+ SCARD_SHARE_SHARED,
+ SCARD_PROTOCOL_T0,
+ &hCard,
+ &dwActiveProtocol
+ );
+ if (rv != SCARD_S_SUCCESS) {
+ printf ("SCardConnect Error (%d)\n", rv);
+ exit (1);
+ } else {
+ printf ("!hCard=%x!\n", hCard);
+ }
+
SendMsg (
SCard_ATR,
rgReaderStates[0].rgbAtr,
@@ -126,16 +144,27 @@ main (
SCRMsgHeader mhHeader;
LONG rv;
- SCARDHANDLE hCard;
SCARD_READERSTATE_A rgReaderStates[1];
- DWORD dwActiveProtocol, dwSendLength, dwRecvLength;
+ DWORD dwSendLength;
+ DWORD dwRecvLength;
SCARD_IO_REQUEST pioRecvPci;
BYTE pbRecvBuffer[APDUBufSize];
BYTE pbSendBuffer[APDUBufSize];
-
- if (argc != 3) {
- PrintUsage();
- exit (4);
+
+ if (argc == 4) {
+ szReaderName = argv[2];
+ } else {
+ szReaderName = (char *) malloc (strlen (ReaderName));
+ strncpy (
+ szReaderName,
+ ReaderName,
+ strlen (ReaderName)
+ );
+
+ if (argc != 3) {
+ PrintUsage();
+ exit (4);
+ }
}
sock = socket (
@@ -144,7 +173,7 @@ main (
0
);
if (sock < 0) {
- // Error
+ // Error
printf ("Error opening socket!\n");
}
@@ -167,16 +196,16 @@ main (
printf ("Connected (sizeof Header=%d)!\n", sizeof (mhHeader));
rv = SCardEstablishContext (
- SCARD_SCOPE_SYSTEM,
- NULL,
- NULL,
+ SCARD_SCOPE_SYSTEM,
+ NULL,
+ NULL,
&hContext
);
if (rv != SCARD_S_SUCCESS) {
printf ("SCardEstablishContext error (%d)\n", rv);
}
- rgReaderStates[0].szReader = ReaderName;
+ rgReaderStates[0].szReader = szReaderName;
rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE;
rv = SCardGetStatusChange (
@@ -214,11 +243,11 @@ PrintByteArray (rgReaderStates[0].rgbAtr, rgReaderStates[0].cbAtr);
);
rv = SCardConnect (
- hContext,
- ReaderName,
+ hContext,
+ szReaderName,
SCARD_SHARE_SHARED,
- SCARD_PROTOCOL_T0,
- &hCard,
+ SCARD_PROTOCOL_T0,
+ &hCard,
&dwActiveProtocol
);
if (rv != SCARD_S_SUCCESS) {
@@ -259,12 +288,12 @@ PrintByteArray (pbSendBuffer, mhHeader.nLength);
dwSendLength = mhHeader.nLength;
dwRecvLength = sizeof(pbRecvBuffer);
rv = SCardTransmit (
- hCard,
- SCARD_PCI_T0,
- pbSendBuffer,
+ hCard,
+ SCARD_PCI_T0,
+ pbSendBuffer,
dwSendLength,
- &pioRecvPci,
- pbRecvBuffer,
+ &pioRecvPci,
+ pbRecvBuffer,
&dwRecvLength
);
if (rv == SCARD_S_SUCCESS) {
@@ -277,12 +306,6 @@ PrintByteArray (pbRecvBuffer, mhHeader.nLength);
dwRecvLength
);
} else {
- SendMsg (
- SCard_Error,
- &rv,
- sizeof (LONG)
- );
-
if (rv == SCARD_W_REMOVED_CARD) {
// Card removed
SendMsg (
@@ -291,6 +314,12 @@ PrintByteArray (pbRecvBuffer, mhHeader.nLength);
0
);
WaitForCardInsert ();
+ } else {
+ SendMsg (
+ SCard_Error,
+ &rv,
+ sizeof (LONG)
+ );
}
}
break;
@@ -303,12 +332,12 @@ PrintByteArray (pbRecvBuffer, mhHeader.nLength);
dwSendLength = sizeof(pbSendBuffer);
dwRecvLength = sizeof(pbRecvBuffer);
rv = SCardTransmit (
- hCard,
- SCARD_PCI_T0,
- pbSendBuffer,
+ hCard,
+ SCARD_PCI_T0,
+ pbSendBuffer,
dwSendLength,
- &pioRecvPci,
- pbRecvBuffer,
+ &pioRecvPci,
+ pbRecvBuffer,
&dwRecvLength
);
if (rv != SCARD_S_SUCCESS) {