Hello Alon,

On Sun, Apr 20, 2008 at 11:23 PM,  <[EMAIL PROTECTED]> wrote:
> Revision: 3483
>  Author:   alonbl
>  Date:     2008-04-20 23:23:26 +0200 (Sun, 20 Apr 2008)
>
>  Log Message:
>  -----------
>  Handle SCARD_E_INVALID_HANDLE at pcsc_lock
>
>  Modified Paths:
>  --------------
>     branches/alonbl/pnp/src/libopensc/internal-winscard.h
>     branches/alonbl/pnp/src/libopensc/reader-pcsc.c
>  Modified: branches/alonbl/pnp/src/libopensc/internal-winscard.h
>  ===================================================================
>  --- branches/alonbl/pnp/src/libopensc/internal-winscard.h       2008-04-20 
> 17:30:54 UTC (rev 3482)
>  +++ branches/alonbl/pnp/src/libopensc/internal-winscard.h       2008-04-20 
> 21:23:26 UTC (rev 3483)
>  @@ -51,6 +51,7 @@
>   #define SCARD_SCOPE_USER               0x0000  /**< Scope in user space */
>
>   #define SCARD_S_SUCCESS                        0x00000000 /**< No error was 
> encountered. */
>  +#define SCARD_E_INVALID_HANDLE         0x80100003 /**< The supplied handle 
> was invalid. */
>   #define SCARD_E_TIMEOUT                        0x8010000A /**< The 
> user-specified timeout value has expired. */
>   #define SCARD_E_SHARING_VIOLATION      0x8010000B /**< The smart card 
> cannot be accessed because of other connections outstanding. */
>   #define SCARD_E_NOT_TRANSACTED         0x80100016 /**< An attempt was made 
> to end a non-existent transaction. */
>
>  Modified: branches/alonbl/pnp/src/libopensc/reader-pcsc.c
>  ===================================================================
>  --- branches/alonbl/pnp/src/libopensc/reader-pcsc.c     2008-04-20 17:30:54 
> UTC (rev 3482)
>  +++ branches/alonbl/pnp/src/libopensc/reader-pcsc.c     2008-04-20 21:23:26 
> UTC (rev 3483)
>  @@ -644,6 +644,21 @@
>
>         rv = priv->gpriv->SCardBeginTransaction(pslot->pcsc_card);
>
>  +       if ((unsigned int)rv == SCARD_E_INVALID_HANDLE) {
>  +               rv = pcsc_connect(reader, slot);
>  +               if (rv != SCARD_S_SUCCESS) {
>  +                       PCSC_ERROR(reader->ctx, "SCardConnect failed", rv);
>  +                       return pcsc_ret_to_error(rv);
>  +               }
>  +/* STRANGE-BEGIN */
>  +rv = priv->gpriv->SCardEndTransaction(pslot->pcsc_card, SCARD_RESET_CARD);
>  +               /* Now try to begin a new transaction after we reconnected 
> and we fail if
>  +                some other program was faster to lock the reader */
>  +/*             rv = priv->gpriv->SCardBeginTransaction(pslot->pcsc_card);
>  + */
>  +/* STRANGE-END */
>  +       }
>  +
>         if ((unsigned int)rv == SCARD_W_RESET_CARD) {
>                 /* try to reconnect if the card was reset by some other 
> application */
>                 rv = pcsc_reconnect(reader, slot, 0);

Why is the SCardEndTransaction() call needed?
It is needed to Linux or Windows or both?

If the application calls SCardConnect() again then all previous
transactions should be automatically ended. If not I think it is a bug
in the PC/SC layer.

Bye

-- 
 Dr. Ludovic Rousseau
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel

Reply via email to