diff options
author | NIIBE Yutaka <[email protected]> | 2012-12-07 01:31:37 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2012-12-07 01:31:37 +0000 |
commit | 0d7cf7bb0669ca280e6259a9c34612a8ff56acda (patch) | |
tree | 0c318811cdbbd879a4e58a8b3d0c7007cd0f6220 | |
parent | Don't keep opening unavailable card reader. (diff) | |
download | gnupg-0d7cf7bb0669ca280e6259a9c34612a8ff56acda.tar.gz gnupg-0d7cf7bb0669ca280e6259a9c34612a8ff56acda.zip |
Revert SCD changes of 2010-05-03 (scd/ChangeLog 2010-03-17).
* scd/apdu.c (pcsc_no_service): Remove.
(open_pcsc_reader_direct, open_pcsc_reader_wrapped): Remove
pcsc_no_service support.
(apdu_open_reader): Remove R_NO_SERVICE.
* scd/apdu.h (apdu_open_reader): Remove R_NO_SERVICE.
* scd/command.c (reader_disabled): Remove.
(get_reader_slot): Follow the change of R_NO_SERVICE.
(open_card, cmd_serialno, scd_command_handler): Remove reader_disabled
support.
* scd/sc-copykeys.c (main): Follow the change of R_NO_SERVICE.
--
Daemon should handle all possible cases. Even if such a difficult
case like reader_disabled, it should not exit.
-rw-r--r-- | scd/apdu.c | 27 | ||||
-rw-r--r-- | scd/apdu.h | 2 | ||||
-rw-r--r-- | scd/command.c | 22 | ||||
-rw-r--r-- | scd/sc-copykeys.c | 2 |
4 files changed, 9 insertions, 44 deletions
diff --git a/scd/apdu.c b/scd/apdu.c index b369a268c..962eb7191 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -305,9 +305,6 @@ long (* DLSTDCALL pcsc_control) (unsigned long card, unsigned long recv_len, unsigned long *bytes_returned); -/* Flag set if PC/SC returned the no-service error. */ -static int pcsc_no_service; - /* Prototypes. */ static int pcsc_get_status (int slot, unsigned int *status); @@ -1712,11 +1709,8 @@ open_pcsc_reader_direct (const char *portstr) pcsc_error_string (err), err); reader_table[slot].used = 0; unlock_slot (slot); - if (err == PCSC_E_NO_SERVICE) - pcsc_no_service = 1; return -1; } - pcsc_no_service = 0; err = pcsc_list_readers (reader_table[slot].pcsc.context, NULL, NULL, &nreader); @@ -1820,7 +1814,6 @@ open_pcsc_reader_wrapped (const char *portstr) { log_error ("can't run PC/SC access module `%s': %s\n", wrapperpgm, strerror (errno)); - pcsc_no_service = 1; return -1; } @@ -1920,8 +1913,6 @@ open_pcsc_reader_wrapped (const char *portstr) ; #undef WAIT - pcsc_no_service = 1; - /* Now send the open request. */ msgbuf[0] = 0x01; /* OPEN command. */ len = portstr? strlen (portstr):0; @@ -1954,15 +1945,11 @@ open_pcsc_reader_wrapped (const char *portstr) { log_error ("PC/SC returned a too large ATR (len=%lx)\n", (unsigned long)len); - pcsc_no_service = 0; goto command_failed; } err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) | (msgbuf[7] << 8 ) | msgbuf[8]); - if (err != PCSC_E_NO_SERVICE) - pcsc_no_service = 0; - if (err) { log_error ("PC/SC OPEN failed: %s (0x%08x)\n", @@ -2803,18 +2790,14 @@ open_rapdu_reader (int portno, error. If PORTSTR is NULL we default to a suitable port (for ctAPI: the first USB reader. For PC/SC the first listed reader). */ int -apdu_open_reader (const char *portstr, int *r_no_service) +apdu_open_reader (const char *portstr) { static int pcsc_api_loaded, ct_api_loaded; - int slot; - - if (r_no_service) - *r_no_service = 0; #ifdef HAVE_LIBUSB if (!opt.disable_ccid) { - int i; + int slot, i; const char *s; slot = open_ccid_reader (portstr); @@ -2947,11 +2930,7 @@ apdu_open_reader (const char *portstr, int *r_no_service) pcsc_api_loaded = 1; } - slot = open_pcsc_reader (portstr); - if (slot == -1 && r_no_service && pcsc_no_service) - *r_no_service = 1; - - return slot; + return open_pcsc_reader (portstr); } diff --git a/scd/apdu.h b/scd/apdu.h index 94d7449bb..61501c43b 100644 --- a/scd/apdu.h +++ b/scd/apdu.h @@ -81,7 +81,7 @@ enum { /* Note, that apdu_open_reader returns no status word but -1 on error. */ -int apdu_open_reader (const char *portstr, int *r_no_service); +int apdu_open_reader (const char *portstr); int apdu_open_remote_reader (const char *portstr, const unsigned char *cookie, size_t length, int (*readfnc) (void *opaque, diff --git a/scd/command.c b/scd/command.c index da11e881f..2123b9d6d 100644 --- a/scd/command.c +++ b/scd/command.c @@ -74,10 +74,6 @@ && (c)->reader_slot == locked_session->ctrl_backlink->reader_slot) -/* Flag indicating that the reader has been disabled. */ -static int reader_disabled; - - /* This structure is used to keep track of open readers (slots). */ struct slot_status_s { @@ -414,14 +410,7 @@ get_reader_slot (void) /* Try to open the reader. */ if (ss->slot == -1) { - int no_service_flag; - ss->slot = apdu_open_reader (opt.reader_port, &no_service_flag); - - if (no_service_flag) - { - log_info ("no card services - disabling scdaemon\n"); - reader_disabled = 1; - } + ss->slot = apdu_open_reader (opt.reader_port); /* If we still don't have a slot, we have no readers. Invalidate for now until a reader is attached. */ @@ -444,9 +433,6 @@ open_card (ctrl_t ctrl, const char *apptype) gpg_error_t err; int slot; - if (reader_disabled) - return gpg_error (GPG_ERR_NOT_OPERATIONAL); - /* If we ever got a card not present error code, return that. Only the SERIALNO command and a reset are able to clear from that state. */ @@ -479,7 +465,7 @@ open_card (ctrl_t ctrl, const char *apptype) slot = get_reader_slot (); ctrl->reader_slot = slot; if (slot == -1) - err = gpg_error (reader_disabled? GPG_ERR_NOT_OPERATIONAL: GPG_ERR_CARD); + err = gpg_error (GPG_ERR_CARD); else { /* Fixme: We should move the apdu_connect call to @@ -537,7 +523,7 @@ cmd_serialno (assuan_context_t ctx, char *line) /* Clear the remove flag so that the open_card is able to reread it. */ retry: - if (!reader_disabled && ctrl->server_local->card_removed) + if (ctrl->server_local->card_removed) { if ( IS_LOCKED (ctrl) ) return gpg_error (GPG_ERR_LOCKED); @@ -2066,7 +2052,7 @@ scd_command_handler (ctrl_t ctrl, int fd) BUG (); sl->next_session = ctrl->server_local->next_session; } - stopme = ctrl->server_local->stopme || reader_disabled; + stopme = ctrl->server_local->stopme; xfree (ctrl->server_local); ctrl->server_local = NULL; diff --git a/scd/sc-copykeys.c b/scd/sc-copykeys.c index b863b01b3..615e4b28a 100644 --- a/scd/sc-copykeys.c +++ b/scd/sc-copykeys.c @@ -139,7 +139,7 @@ main (int argc, char **argv ) if (argc != 1) usage (1); - slot = apdu_open_reader (reader_port, NULL); + slot = apdu_open_reader (reader_port); if (slot == -1) exit (1); if (apdu_connect (slot)) |