FreeCalypso > hg > freecalypso-hwlab
comparison pcsc-test/pcsc-test2.c @ 84:1d7d8615d628
pcsc-test: some experiments to get pcsc-lite working
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sat, 23 Jan 2021 17:21:08 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 83:d7a1e7a6d6ba | 84:1d7d8615d628 |
|---|---|
| 1 #include <sys/types.h> | |
| 2 #include <string.h> | |
| 3 #include <strings.h> | |
| 4 #include <stdio.h> | |
| 5 #include <stdlib.h> | |
| 6 #include <pcsclite.h> | |
| 7 #include <winscard.h> | |
| 8 #include <reader.h> | |
| 9 | |
| 10 #define MAX_ATR_BYTES 33 | |
| 11 | |
| 12 SCARDCONTEXT hContext; | |
| 13 SCARDHANDLE hCard; | |
| 14 char *reader_name_buf; | |
| 15 | |
| 16 setup_pcsc_context() | |
| 17 { | |
| 18 LONG rv; | |
| 19 | |
| 20 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext); | |
| 21 if (rv != SCARD_S_SUCCESS) { | |
| 22 fprintf(stderr, "SCardEstablishContext: %s\n", | |
| 23 pcsc_stringify_error(rv)); | |
| 24 exit(1); | |
| 25 } | |
| 26 return(0); | |
| 27 } | |
| 28 | |
| 29 get_reader_name() | |
| 30 { | |
| 31 LONG rv; | |
| 32 DWORD dwReaders; | |
| 33 | |
| 34 rv = SCardListReaders(hContext, NULL, NULL, &dwReaders); | |
| 35 if (rv != SCARD_S_SUCCESS) { | |
| 36 fprintf(stderr, "SCardListReaders 1st call: %s\n", | |
| 37 pcsc_stringify_error(rv)); | |
| 38 SCardReleaseContext(hContext); | |
| 39 exit(1); | |
| 40 } | |
| 41 if (dwReaders < 1) { | |
| 42 fprintf(stderr, | |
| 43 "error: dwReaders returned by SCardListReaders() is less than 1\n"); | |
| 44 SCardReleaseContext(hContext); | |
| 45 exit(1); | |
| 46 } | |
| 47 reader_name_buf = malloc(dwReaders); | |
| 48 if (!reader_name_buf) { | |
| 49 perror("malloc for readers list"); | |
| 50 SCardReleaseContext(hContext); | |
| 51 exit(1); | |
| 52 } | |
| 53 reader_name_buf[0] = '\0'; | |
| 54 rv = SCardListReaders(hContext, NULL, reader_name_buf, &dwReaders); | |
| 55 if (rv != SCARD_S_SUCCESS) { | |
| 56 fprintf(stderr, "SCardListReaders 2nd call: %s\n", | |
| 57 pcsc_stringify_error(rv)); | |
| 58 SCardReleaseContext(hContext); | |
| 59 exit(1); | |
| 60 } | |
| 61 if (reader_name_buf[0] == '\0') { | |
| 62 fprintf(stderr, | |
| 63 "error: list returned by SCardListReaders() begins with a NUL byte\n"); | |
| 64 SCardReleaseContext(hContext); | |
| 65 exit(1); | |
| 66 } | |
| 67 if (!memchr(reader_name_buf, 0, dwReaders)) { | |
| 68 fprintf(stderr, | |
| 69 "error: list returned by SCardListReaders() does not contain a NUL byte\n"); | |
| 70 SCardReleaseContext(hContext); | |
| 71 exit(1); | |
| 72 } | |
| 73 return(0); | |
| 74 } | |
| 75 | |
| 76 connect_to_card() | |
| 77 { | |
| 78 LONG rv; | |
| 79 DWORD dwActiveProtocol; | |
| 80 | |
| 81 rv = SCardConnect(hContext, reader_name_buf, SCARD_SHARE_EXCLUSIVE, | |
| 82 SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol); | |
| 83 if (rv != SCARD_S_SUCCESS) { | |
| 84 fprintf(stderr, "SCardConnect: %s\n", pcsc_stringify_error(rv)); | |
| 85 SCardReleaseContext(hContext); | |
| 86 exit(1); | |
| 87 } | |
| 88 return(0); | |
| 89 } | |
| 90 | |
| 91 retrieve_atr() | |
| 92 { | |
| 93 u_char atrbuf[MAX_ATR_BYTES]; | |
| 94 LONG rv; | |
| 95 DWORD dwAttrLen; | |
| 96 unsigned n; | |
| 97 | |
| 98 dwAttrLen = MAX_ATR_BYTES; | |
| 99 rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, atrbuf, &dwAttrLen); | |
| 100 if (rv != SCARD_S_SUCCESS) { | |
| 101 fprintf(stderr, "SCardGetAttrib for ATR: %s\n", | |
| 102 pcsc_stringify_error(rv)); | |
| 103 return(-1); | |
| 104 } | |
| 105 printf("ATR:"); | |
| 106 for (n = 0; n < dwAttrLen; n++) | |
| 107 printf(" %02X", atrbuf[n]); | |
| 108 putchar('\n'); | |
| 109 return(0); | |
| 110 } | |
| 111 | |
| 112 main(argc, argv) | |
| 113 char **argv; | |
| 114 { | |
| 115 setup_pcsc_context(); | |
| 116 get_reader_name(); | |
| 117 printf("Card reader name: %s\n", reader_name_buf); | |
| 118 connect_to_card(); | |
| 119 retrieve_atr(); | |
| 120 SCardDisconnect(hCard, SCARD_UNPOWER_CARD); | |
| 121 SCardReleaseContext(hContext); | |
| 122 exit(0); | |
| 123 } |
