[PATCH] 1.4.x: Fix PC/SC
NIIBE Yutaka
gniibe at fsij.org
Thu May 1 05:09:29 CEST 2014
Hello,
For the issue 1358, I fixed 2.0 (and master branch) but not 1.4.
https://bugs.g10code.com/gnupg/issue1358
I thought MacOS X user used 2.0 or internal driver, but it seems
wrong.
Here is a patch to 1.4, backported. Building on x86 has no problem.
OK to apply?
diff --git a/g10/apdu.c b/g10/apdu.c
index 4544d70..62180b3 100644
--- a/g10/apdu.c
+++ b/g10/apdu.c
@@ -83,6 +83,11 @@
#define DLSTDCALL
#endif
+#if defined(__APPLE__) || defined(_WIN32) || defined(__CYGWIN__)
+typedef unsigned int pcsc_dword_t;
+#else
+typedef unsigned long pcsc_dword_t;
+#endif
/* Helper to pass parameters related to keypad based operations. */
struct pininfo_s
@@ -116,9 +121,9 @@ struct reader_table_s {
ccid_driver_t handle;
} ccid;
struct {
- unsigned long context;
- unsigned long card;
- unsigned long protocol;
+ long context;
+ long card;
+ pcsc_dword_t protocol;
#ifdef NEED_PCSC_WRAPPER
int req_fd;
int rsp_fd;
@@ -225,69 +230,76 @@ static char (* DLSTDCALL CT_close) (unsigned short ctn);
it. */
#define PCSC_ERR_MASK(a) ((a) & 0xffffffff)
-
struct pcsc_io_request_s
{
- unsigned long protocol;
- unsigned long pci_len;
+ pcsc_dword_t protocol;
+ pcsc_dword_t pci_len;
};
typedef struct pcsc_io_request_s *pcsc_io_request_t;
+#ifdef __APPLE__
+#pragma pack(1)
+#endif
+
struct pcsc_readerstate_s
{
const char *reader;
void *user_data;
- unsigned long current_state;
- unsigned long event_state;
- unsigned long atrlen;
+ pcsc_dword_t current_state;
+ pcsc_dword_t event_state;
+ pcsc_dword_t atrlen;
unsigned char atr[33];
};
+#ifdef __APPLE__
+#pragma pack()
+#endif
+
typedef struct pcsc_readerstate_s *pcsc_readerstate_t;
-long (* DLSTDCALL pcsc_establish_context) (unsigned long scope,
+long (* DLSTDCALL pcsc_establish_context) (pcsc_dword_t scope,
const void *reserved1,
const void *reserved2,
- unsigned long *r_context);
-long (* DLSTDCALL pcsc_release_context) (unsigned long context);
-long (* DLSTDCALL pcsc_list_readers) (unsigned long context,
+ long *r_context);
+long (* DLSTDCALL pcsc_release_context) (long context);
+long (* DLSTDCALL pcsc_list_readers) (long context,
const char *groups,
- char *readers, unsigned long*readerslen);
-long (* DLSTDCALL pcsc_get_status_change) (unsigned long context,
- unsigned long timeout,
+ char *readers, pcsc_dword_t *readerslen);
+long (* DLSTDCALL pcsc_get_status_change) (long context,
+ pcsc_dword_t timeout,
pcsc_readerstate_t readerstates,
- unsigned long nreaderstates);
-long (* DLSTDCALL pcsc_connect) (unsigned long context,
+ pcsc_dword_t nreaderstates);
+long (* DLSTDCALL pcsc_connect) (long context,
const char *reader,
- unsigned long share_mode,
- unsigned long preferred_protocols,
- unsigned long *r_card,
- unsigned long *r_active_protocol);
-long (* DLSTDCALL pcsc_reconnect) (unsigned long card,
- unsigned long share_mode,
- unsigned long preferred_protocols,
- unsigned long initialization,
- unsigned long *r_active_protocol);
-long (* DLSTDCALL pcsc_disconnect) (unsigned long card,
- unsigned long disposition);
-long (* DLSTDCALL pcsc_status) (unsigned long card,
- char *reader, unsigned long *readerlen,
- unsigned long *r_state,
- unsigned long *r_protocol,
- unsigned char *atr, unsigned long *atrlen);
-long (* DLSTDCALL pcsc_begin_transaction) (unsigned long card);
-long (* DLSTDCALL pcsc_end_transaction) (unsigned long card,
- unsigned long disposition);
-long (* DLSTDCALL pcsc_transmit) (unsigned long card,
+ pcsc_dword_t share_mode,
+ pcsc_dword_t preferred_protocols,
+ long *r_card,
+ pcsc_dword_t *r_active_protocol);
+long (* DLSTDCALL pcsc_reconnect) (long card,
+ pcsc_dword_t share_mode,
+ pcsc_dword_t preferred_protocols,
+ pcsc_dword_t initialization,
+ pcsc_dword_t *r_active_protocol);
+long (* DLSTDCALL pcsc_disconnect) (long card,
+ pcsc_dword_t disposition);
+long (* DLSTDCALL pcsc_status) (long card,
+ char *reader, pcsc_dword_t *readerlen,
+ pcsc_dword_t *r_state,
+ pcsc_dword_t *r_protocol,
+ unsigned char *atr, pcsc_dword_t *atrlen);
+long (* DLSTDCALL pcsc_begin_transaction) (long card);
+long (* DLSTDCALL pcsc_end_transaction) (long card,
+ pcsc_dword_t disposition);
+long (* DLSTDCALL pcsc_transmit) (long card,
const pcsc_io_request_t send_pci,
const unsigned char *send_buffer,
- unsigned long send_len,
+ pcsc_dword_t send_len,
pcsc_io_request_t recv_pci,
unsigned char *recv_buffer,
- unsigned long *recv_len);
-long (* DLSTDCALL pcsc_set_timeout) (unsigned long context,
- unsigned long timeout);
+ pcsc_dword_t *recv_len);
+long (* DLSTDCALL pcsc_set_timeout) (long context,
+ pcsc_dword_t timeout);
/* Prototypes. */
@@ -990,7 +1002,7 @@ pcsc_send_apdu_direct (int slot, unsigned char *apdu, size_t apdulen,
{
long err;
struct pcsc_io_request_s send_pci;
- unsigned long recv_len;
+ pcsc_dword_t recv_len;
if (!reader_table[slot].atrlen
&& (err = reset_pcsc_reader (slot)))
@@ -1276,8 +1288,8 @@ connect_pcsc_card (int slot)
else
{
char reader[250];
- unsigned long readerlen, atrlen;
- unsigned long card_state, card_protocol;
+ pcsc_dword_t readerlen, atrlen;
+ pcsc_dword_t card_state, card_protocol;
atrlen = DIM (reader_table[0].atr);
readerlen = sizeof reader -1 ;
@@ -1286,8 +1298,8 @@ connect_pcsc_card (int slot)
&card_state, &card_protocol,
reader_table[slot].atr, &atrlen);
if (err)
- log_error ("pcsc_status failed: %s (0x%lx) %lu\n",
- pcsc_error_string (err), err, readerlen);
+ log_error ("pcsc_status failed: %s (0x%lx) %u\n",
+ pcsc_error_string (err), err, (unsigned int)readerlen);
else
{
if (atrlen > DIM (reader_table[0].atr))
@@ -1473,7 +1485,7 @@ open_pcsc_reader_direct (const char *portstr)
long err;
int slot;
char *list = NULL;
- unsigned long nreader;
+ pcsc_dword_t nreader;
char *p;
slot = new_reader_slot ();
--
More information about the Gnupg-devel
mailing list