Made --fixed-list-mode obsolete.
[gnupg.git] / scd / pcsc-wrapper.c
index 23e8442..b913cdc 100644 (file)
@@ -1,11 +1,11 @@
-/* pcsc-wrapper.c - Wrapper for ccessing the PC/SC service
+/* pcsc-wrapper.c - Wrapper for accessing the PC/SC service
  *     Copyright (C) 2003, 2004 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -14,9 +14,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
@@ -169,7 +167,8 @@ long (* pcsc_status) (unsigned long card,
                       unsigned long *r_protocol,
                       unsigned char *atr, unsigned long *atrlen);
 long (* pcsc_begin_transaction) (unsigned long card);
-long (* pcsc_end_transaction) (unsigned long card);
+long (* pcsc_end_transaction) (unsigned long card,
+                               unsigned long disposition);
 long (* pcsc_transmit) (unsigned long card,
                         const pcsc_io_request_t send_pci,
                         const unsigned char *send_buffer,
@@ -474,6 +473,8 @@ handle_open (unsigned char *argbuf, size_t arglen)
       pcsc_release_context (pcsc_context);
       free (current_rdrname);
       current_rdrname = NULL;
+      pcsc_card = 0;
+      pcsc_protocol = 0;
       request_failed (err);
       return;
     }      
@@ -527,6 +528,8 @@ handle_close (unsigned char *argbuf, size_t arglen)
   free (current_rdrname);
   current_rdrname = NULL;
   pcsc_release_context (pcsc_context);
+  pcsc_card = 0;
+  pcsc_protocol = 0;
 
   request_succeeded (NULL, 0);
 }
@@ -567,17 +570,20 @@ handle_status (unsigned char *argbuf, size_t arglen)
     }
 
   status = 0;
-  if ( (rdrstates[0].event_state & PCSC_STATE_PRESENT) )
-    status |= 2;
-  if ( !(rdrstates[0].event_state & PCSC_STATE_MUTE) )
-    status |= 4;
-  /* We indicate a useful card if it is not in use by another
-     application.  This is because we only use exclusive access
-     mode.  */
-  if ( (status & 6) == 6
-       && !(rdrstates[0].event_state & PCSC_STATE_INUSE) )
-    status |= 1;
-  
+  if ( !(rdrstates[0].event_state & PCSC_STATE_UNKNOWN) )
+    {
+      if ( (rdrstates[0].event_state & PCSC_STATE_PRESENT) )
+        status |= 2;
+      if ( !(rdrstates[0].event_state & PCSC_STATE_MUTE) )
+        status |= 4;
+      /* We indicate a useful card if it is not in use by another
+         application.  This is because we only use exclusive access
+         mode.  */
+      if ( (status & 6) == 6
+           && !(rdrstates[0].event_state & PCSC_STATE_INUSE) )
+        status |= 1;
+    }
+
   /* First word is identical to the one used by apdu.c. */
   buf[0] = 0;
   buf[1] = 0;
@@ -618,6 +624,8 @@ handle_reset (unsigned char *argbuf, size_t arglen)
   if (pcsc_card)
     {
       err = pcsc_disconnect (pcsc_card, PCSC_LEAVE_CARD);
+      if (err == 0x80100003)  /* Invalid handle.  (already disconnected) */
+        err = 0;
       if (err)
         {
           fprintf (stderr, PGM": pcsc_disconnect failed: %s (0x%lx)\n",