Revert SCD changes of 2010-05-03 (scd/ChangeLog 2010-03-17).
authorNIIBE Yutaka <gniibe@fsij.org>
Fri, 7 Dec 2012 01:31:37 +0000 (10:31 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Fri, 7 Dec 2012 01:31:37 +0000 (10:31 +0900)
* 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.

scd/apdu.c
scd/apdu.h
scd/command.c
scd/sc-copykeys.c

index b369a26..962eb71 100644 (file)
@@ -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);
 }
 
 
index 94d7449..61501c4 100644 (file)
@@ -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,
index da11e88..2123b9d 100644 (file)
       && (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;
 
index b863b01..615e4b2 100644 (file)
@@ -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))