diff options
author | Werner Koch <[email protected]> | 2020-08-12 14:06:49 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2020-08-12 14:06:49 +0000 |
commit | 9a8d7e41bba1926158a21ebdda542241493ef983 (patch) | |
tree | 6bc39decf6d542b22e743062ca41466aca861ac8 /scd/ccid-driver.c | |
parent | common: Pass the WAYLAND_DISPLAY envvar along (diff) | |
download | gnupg-9a8d7e41bba1926158a21ebdda542241493ef983.tar.gz gnupg-9a8d7e41bba1926158a21ebdda542241493ef983.zip |
scd: Map some error codes from libusb to ccid-driver error codes.
* scd/ccid-driver.h (CCID_DRIVER_ERR_USB_*): New error codes.
* scd/apdu.h: New SW_HOST error codes.
* scd/apdu.c (host_sw_string): Print them
* scd/ccid-driver.c (map_libusb_error): New.
(ccid_open_usb_reader, bulk_in, abort_cmd): Map libusb error codes.
* scd/iso7816.c (map_sw): Map new codes to gpg-error.
--
This change will help to get low level error conditions from hipher
application code.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'scd/ccid-driver.c')
-rw-r--r-- | scd/ccid-driver.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index 60252c04f..776c7ab06 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -271,6 +271,24 @@ static int send_escape_cmd (ccid_driver_t handle, const unsigned char *data, size_t datalen, unsigned char *result, size_t resultmax, size_t *resultlen); + +static int +map_libusb_error (int usberr) +{ + switch (usberr) + { + case 0: return 0; + case LIBUSB_ERROR_IO: return CCID_DRIVER_ERR_USB_IO; + case LIBUSB_ERROR_ACCESS: return CCID_DRIVER_ERR_USB_ACCESS; + case LIBUSB_ERROR_NO_DEVICE:return CCID_DRIVER_ERR_USB_NO_DEVICE; + case LIBUSB_ERROR_BUSY: return CCID_DRIVER_ERR_USB_BUSY; + case LIBUSB_ERROR_TIMEOUT: return CCID_DRIVER_ERR_USB_TIMEOUT; + case LIBUSB_ERROR_OVERFLOW: return CCID_DRIVER_ERR_USB_OVERFLOW; + } + return CCID_DRIVER_ERR_USB_OTHER; +} + + /* Convert a little endian stored 4 byte value into an unsigned integer. */ static unsigned int @@ -1568,7 +1586,7 @@ ccid_open_usb_reader (const char *spec_reader_name, DEBUGOUT_1 ("usb_open failed: %s\n", libusb_error_name (rc)); free (*handle); *handle = NULL; - return rc; + return map_libusb_error (rc); } if (ccid_usb_thread_is_alive++ == 0) @@ -1603,6 +1621,7 @@ ccid_open_usb_reader (const char *spec_reader_name, if (rc) { DEBUGOUT ("get_device_descripor failed\n"); + rc = map_libusb_error (rc); goto leave; } @@ -1642,7 +1661,7 @@ ccid_open_usb_reader (const char *spec_reader_name, if (rc) { DEBUGOUT_1 ("usb_claim_interface failed: %d\n", rc); - rc = CCID_DRIVER_ERR_CARD_IO_ERROR; + rc = map_libusb_error (rc); goto leave; } @@ -1651,7 +1670,7 @@ ccid_open_usb_reader (const char *spec_reader_name, if (rc) { DEBUGOUT_1 ("usb_set_interface_alt_setting failed: %d\n", rc); - rc = CCID_DRIVER_ERR_CARD_IO_ERROR; + rc = map_libusb_error (rc); goto leave; } @@ -1964,12 +1983,9 @@ bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length, { DEBUGOUT_1 ("usb_bulk_read error: %s\n", libusb_error_name (rc)); if (rc == LIBUSB_ERROR_NO_DEVICE) - { - handle->enodev_seen = 1; - return CCID_DRIVER_ERR_NO_READER; - } + handle->enodev_seen = 1; - return CCID_DRIVER_ERR_CARD_IO_ERROR; + return map_libusb_error (rc); } if (msglen < 0) return CCID_DRIVER_ERR_INV_VALUE; /* Faulty libusb. */ @@ -2122,7 +2138,7 @@ abort_cmd (ccid_driver_t handle, int seqno) if (rc) { DEBUGOUT_1 ("usb_control_msg error: %s\n", libusb_error_name (rc)); - return CCID_DRIVER_ERR_CARD_IO_ERROR; + return map_libusb_error (rc); } /* Now send the abort command to the bulk out pipe using the same @@ -2159,7 +2175,7 @@ abort_cmd (ccid_driver_t handle, int seqno) libusb_error_name (rc)); if (rc) - return rc; + return map_libusb_error (rc); #ifdef USE_NPTH npth_unprotect (); @@ -2174,7 +2190,7 @@ abort_cmd (ccid_driver_t handle, int seqno) { DEBUGOUT_1 ("usb_bulk_read error in abort_cmd: %s\n", libusb_error_name (rc)); - return CCID_DRIVER_ERR_CARD_IO_ERROR; + return map_libusb_error (rc); } if (msglen < 10) |