mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
* cardglue.c (card_close): New.
* ccid-driver.c (ccid_close_reader): New. * apdu.c (close_ccid_reader, close_ct_reader, close_csc_reader) (close_osc_reader, apdu_close_reader): New. Not all are properly implemented yet. * g10.c (g10_exit): Use close_card.
This commit is contained in:
parent
547b00c9ff
commit
5a0fbad9b3
8 changed files with 139 additions and 12 deletions
|
@ -174,6 +174,12 @@ struct ccid_driver_s {
|
|||
};
|
||||
|
||||
|
||||
static int bulk_out (ccid_driver_t handle, unsigned char *msg, size_t msglen);
|
||||
static int bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length,
|
||||
size_t *nread, int expected_type, int seqno);
|
||||
|
||||
|
||||
|
||||
/* Convert a little endian stored 4 byte value into an unsigned
|
||||
integer. */
|
||||
static unsigned int
|
||||
|
@ -182,6 +188,16 @@ convert_le_u32 (const unsigned char *buf)
|
|||
return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
|
||||
}
|
||||
|
||||
static void
|
||||
set_msg_len (unsigned char *msg, unsigned int length)
|
||||
{
|
||||
msg[1] = length;
|
||||
msg[2] = length >> 8;
|
||||
msg[3] = length >> 16;
|
||||
msg[4] = length >> 24;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Parse a CCID descriptor, optionally print all available features
|
||||
|
@ -482,6 +498,41 @@ ccid_open_reader (ccid_driver_t *handle, int readerno)
|
|||
}
|
||||
|
||||
|
||||
/* Close the reader HANDLE. */
|
||||
int
|
||||
ccid_close_reader (ccid_driver_t handle)
|
||||
{
|
||||
if (!handle || !handle->idev)
|
||||
return 0;
|
||||
|
||||
{
|
||||
int rc;
|
||||
unsigned char msg[100];
|
||||
size_t msglen;
|
||||
unsigned char seqno;
|
||||
|
||||
msg[0] = PC_to_RDR_IccPowerOff;
|
||||
msg[5] = 0; /* slot */
|
||||
msg[6] = seqno = handle->seqno++;
|
||||
msg[7] = 0; /* RFU */
|
||||
msg[8] = 0; /* RFU */
|
||||
msg[9] = 0; /* RFU */
|
||||
set_msg_len (msg, 0);
|
||||
msglen = 10;
|
||||
|
||||
rc = bulk_out (handle, msg, msglen);
|
||||
if (!rc)
|
||||
bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus, seqno);
|
||||
}
|
||||
|
||||
usb_release_interface (handle->idev, 0);
|
||||
usb_close (handle->idev);
|
||||
handle->idev = NULL;
|
||||
free (handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Return False if a card is present and powered. */
|
||||
int
|
||||
ccid_check_card_presence (ccid_driver_t handle)
|
||||
|
@ -491,16 +542,6 @@ ccid_check_card_presence (ccid_driver_t handle)
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
set_msg_len (unsigned char *msg, unsigned int length)
|
||||
{
|
||||
msg[1] = length;
|
||||
msg[2] = length >> 8;
|
||||
msg[3] = length >> 16;
|
||||
msg[4] = length >> 24;
|
||||
}
|
||||
|
||||
|
||||
/* Write a MSG of length MSGLEN to the designated bulk out endpoint.
|
||||
Returns 0 on success. */
|
||||
static int
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue