1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-05-24 16:43:28 +02:00

Revert SCD changes of 2010-05-03.

* 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_current_reader): 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.
This commit is contained in:
NIIBE Yutaka 2012-12-04 14:37:56 +09:00 committed by Werner Koch
parent baf7b09e12
commit 1e1326aeb8
4 changed files with 7 additions and 40 deletions

View File

@ -323,9 +323,6 @@ long (* DLSTDCALL pcsc_control) (unsigned long card,
unsigned long recv_len, unsigned long recv_len,
unsigned long *bytes_returned); unsigned long *bytes_returned);
/* Flag set if PC/SC returned the no-service error. */
static int pcsc_no_service;
/* Prototypes. */ /* Prototypes. */
static int pcsc_get_status (int slot, unsigned int *status); static int pcsc_get_status (int slot, unsigned int *status);
@ -1693,11 +1690,8 @@ open_pcsc_reader_direct (const char *portstr)
log_error ("pcsc_establish_context failed: %s (0x%lx)\n", log_error ("pcsc_establish_context failed: %s (0x%lx)\n",
pcsc_error_string (err), err); pcsc_error_string (err), err);
reader_table[slot].used = 0; reader_table[slot].used = 0;
if (err == PCSC_E_NO_SERVICE)
pcsc_no_service = 1;
return -1; return -1;
} }
pcsc_no_service = 0;
err = pcsc_list_readers (reader_table[slot].pcsc.context, err = pcsc_list_readers (reader_table[slot].pcsc.context,
NULL, NULL, &nreader); NULL, NULL, &nreader);
@ -1796,7 +1790,6 @@ open_pcsc_reader_wrapped (const char *portstr)
{ {
log_error ("can't run PC/SC access module '%s': %s\n", log_error ("can't run PC/SC access module '%s': %s\n",
wrapperpgm, strerror (errno)); wrapperpgm, strerror (errno));
pcsc_no_service = 1;
return -1; return -1;
} }
@ -1893,8 +1886,6 @@ open_pcsc_reader_wrapped (const char *portstr)
; ;
#undef WAIT #undef WAIT
pcsc_no_service = 1;
/* Now send the open request. */ /* Now send the open request. */
msgbuf[0] = 0x01; /* OPEN command. */ msgbuf[0] = 0x01; /* OPEN command. */
len = portstr? strlen (portstr):0; len = portstr? strlen (portstr):0;
@ -1927,15 +1918,11 @@ open_pcsc_reader_wrapped (const char *portstr)
{ {
log_error ("PC/SC returned a too large ATR (len=%lx)\n", log_error ("PC/SC returned a too large ATR (len=%lx)\n",
(unsigned long)len); (unsigned long)len);
pcsc_no_service = 0;
goto command_failed; goto command_failed;
} }
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16)
| (msgbuf[7] << 8 ) | msgbuf[8]); | (msgbuf[7] << 8 ) | msgbuf[8]);
if (err != PCSC_E_NO_SERVICE)
pcsc_no_service = 0;
if (err) if (err)
{ {
log_error ("PC/SC OPEN failed: %s\n", pcsc_error_string (err)); log_error ("PC/SC OPEN failed: %s\n", pcsc_error_string (err));
@ -2817,7 +2804,7 @@ unlock_slot (int slot)
error. If PORTSTR is NULL we default to a suitable port (for ctAPI: error. If PORTSTR is NULL we default to a suitable port (for ctAPI:
the first USB reader. For PC/SC the first listed reader). */ the first USB reader. For PC/SC the first listed reader). */
int 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; static int pcsc_api_loaded, ct_api_loaded;
int slot; int slot;
@ -2825,9 +2812,6 @@ apdu_open_reader (const char *portstr, int *r_no_service)
if (DBG_READER) if (DBG_READER)
log_debug ("enter: apdu_open_reader: portstr=%s\n", portstr); log_debug ("enter: apdu_open_reader: portstr=%s\n", portstr);
if (r_no_service)
*r_no_service = 0;
#ifdef HAVE_LIBUSB #ifdef HAVE_LIBUSB
if (!opt.disable_ccid) if (!opt.disable_ccid)
{ {
@ -2988,8 +2972,6 @@ apdu_open_reader (const char *portstr, int *r_no_service)
} }
slot = open_pcsc_reader (portstr); slot = open_pcsc_reader (portstr);
if (slot == -1 && r_no_service && pcsc_no_service)
*r_no_service = 1;
if (DBG_READER) if (DBG_READER)
log_debug ("leave: apdu_open_reader => slot=%d [pc/sc]\n", slot); log_debug ("leave: apdu_open_reader => slot=%d [pc/sc]\n", slot);

View File

@ -84,7 +84,7 @@ enum {
/* Note, that apdu_open_reader returns no status word but -1 on error. */ /* 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, int apdu_open_remote_reader (const char *portstr,
const unsigned char *cookie, size_t length, const unsigned char *cookie, size_t length,
int (*readfnc) (void *opaque, int (*readfnc) (void *opaque,

View File

@ -79,10 +79,6 @@
== locked_session->ctrl_backlink->server_local->vreader_idx)) == locked_session->ctrl_backlink->server_local->vreader_idx))
/* Flag indicating that the reader has been disabled. */
static int reader_disabled;
/* This structure is used to keep track of user readers. To /* This structure is used to keep track of user readers. To
eventually accommodate this structure for RFID cards, where more eventually accommodate this structure for RFID cards, where more
than one card is used per reader, we name it virtual reader. */ than one card is used per reader, we name it virtual reader. */
@ -444,9 +440,7 @@ get_current_reader (void)
/* Try to open the reader. */ /* Try to open the reader. */
if (vr->slot == -1) if (vr->slot == -1)
{ {
int no_service_flag; vr->slot = apdu_open_reader (opt.reader_port);
vr->slot = apdu_open_reader (opt.reader_port, &no_service_flag);
/* If we still don't have a slot, we have no readers. /* If we still don't have a slot, we have no readers.
Invalidate for now until a reader is attached. */ Invalidate for now until a reader is attached. */
@ -454,12 +448,6 @@ get_current_reader (void)
{ {
vr->valid = 0; vr->valid = 0;
} }
if (no_service_flag)
{
log_info ("no card services - disabling scdaemon\n");
reader_disabled = 1;
}
} }
/* Return the vreader index or -1. */ /* Return the vreader index or -1. */
@ -474,9 +462,6 @@ open_card (ctrl_t ctrl, const char *apptype)
gpg_error_t err; gpg_error_t err;
int vrdr; int vrdr;
if (reader_disabled)
return gpg_error (GPG_ERR_NOT_OPERATIONAL);
/* If we ever got a card not present error code, return that. Only /* 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 the SERIALNO command and a reset are able to clear from that
state. */ state. */
@ -512,7 +497,7 @@ open_card (ctrl_t ctrl, const char *apptype)
vrdr = get_current_reader (); vrdr = get_current_reader ();
ctrl->server_local->vreader_idx = vrdr; ctrl->server_local->vreader_idx = vrdr;
if (vrdr == -1) if (vrdr == -1)
err = gpg_error (reader_disabled? GPG_ERR_NOT_OPERATIONAL: GPG_ERR_CARD); err = gpg_error (GPG_ERR_CARD);
else else
{ {
/* Fixme: We should move the apdu_connect call to /* Fixme: We should move the apdu_connect call to
@ -570,7 +555,7 @@ cmd_serialno (assuan_context_t ctx, char *line)
/* Clear the remove flag so that the open_card is able to reread it. */ /* Clear the remove flag so that the open_card is able to reread it. */
retry: retry:
if (!reader_disabled && ctrl->server_local->card_removed) if (ctrl->server_local->card_removed)
{ {
if ( IS_LOCKED (ctrl) ) if ( IS_LOCKED (ctrl) )
return gpg_error (GPG_ERR_LOCKED); return gpg_error (GPG_ERR_LOCKED);
@ -2122,7 +2107,7 @@ scd_command_handler (ctrl_t ctrl, int fd)
BUG (); BUG ();
sl->next_session = ctrl->server_local->next_session; sl->next_session = ctrl->server_local->next_session;
} }
stopme = ctrl->server_local->stopme || reader_disabled; stopme = ctrl->server_local->stopme;
xfree (ctrl->server_local); xfree (ctrl->server_local);
ctrl->server_local = NULL; ctrl->server_local = NULL;

View File

@ -139,7 +139,7 @@ main (int argc, char **argv )
if (argc != 1) if (argc != 1)
usage (1); usage (1);
slot = apdu_open_reader (reader_port, NULL); slot = apdu_open_reader (reader_port);
if (slot == -1) if (slot == -1)
exit (1); exit (1);
if (apdu_connect (slot)) if (apdu_connect (slot))