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:
parent
baf7b09e12
commit
1e1326aeb8
20
scd/apdu.c
20
scd/apdu.c
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user