Show
Ignore:
Timestamp:
04/22/08 18:52:14 (9 months ago)
Author:
alonbl
Message:

Survive pcscd restart

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/alonbl/pnp/src/libopensc/reader-pcsc.c

    r3487 r3488  
    761761        gpriv->enable_pinpad = 0; 
    762762        gpriv->provider_library = DEFAULT_PCSC_PROVIDER; 
     763        gpriv->pcsc_ctx = -1; 
    763764         
    764765        conf_block = sc_get_conf_block(ctx, "reader_driver", "pcsc", 1); 
     
    826827        } 
    827828 
    828         rv = gpriv->SCardEstablishContext(SCARD_SCOPE_USER, 
    829                               NULL, NULL, &gpriv->pcsc_ctx); 
    830         if (rv != SCARD_S_SUCCESS) { 
    831                 ret = pcsc_ret_to_error(rv); 
    832                 goto out; 
    833         } 
    834  
    835829        *reader_data = gpriv; 
    836830        gpriv = NULL; 
     
    871865        const char *mszGroups = NULL; 
    872866        int ret = SC_ERROR_INTERNAL; 
    873  
    874         rv = gpriv->SCardListReaders(gpriv->pcsc_ctx, NULL, NULL, 
    875                               (LPDWORD) &reader_buf_size); 
    876         if (rv != SCARD_S_SUCCESS) { 
    877                 ret = pcsc_ret_to_error(rv); 
     867        int again; 
     868 
     869        if (!priv) { 
     870                ret = SC_ERROR_NO_READERS_FOUND; 
    878871                goto out; 
    879872        } 
     873 
     874        do { 
     875                rv = gpriv->SCardListReaders(gpriv->pcsc_ctx, NULL, NULL, 
     876                                      (LPDWORD) &reader_buf_size); 
     877                if (rv != SCARD_S_SUCCESS) { 
     878                        if (rv != SCARD_E_INVALID_HANDLE) { 
     879                                ret = pcsc_ret_to_error(rv); 
     880                                goto out; 
     881                        } 
     882 
     883                        rv = gpriv->SCardEstablishContext(SCARD_SCOPE_USER, 
     884                                              NULL, NULL, &gpriv->pcsc_ctx); 
     885                        if (rv != SCARD_S_SUCCESS) { 
     886                                ret = pcsc_ret_to_error(rv); 
     887                                goto out; 
     888                        } 
     889 
     890                        rv = SCARD_E_INVALID_HANDLE; 
     891                } 
     892        } while (rv != SCARD_S_SUCCESS); 
    880893 
    881894        reader_buf = (char *) malloc(sizeof(char) * reader_buf_size);