On Fri, 2011-02-04 at 07:58 +0200, Martin Paljak wrote:
> On Feb 3, 2011, at 10:04 PM, Douglas E. Engert wrote:
>
> > I have updates #321 with a new version of the cardmod patch
> > and would like to start to commit it in pieces.
> >
> > Piece 1 is the attachment I sent on 1/28 as new.martin.patch
> > based on Martin's patch from 1/19. This was the patch that would
> > work for Brian. The main change is adding two parameters to all
> > the *_detect_readers routines. Martin's patch already required these
> > to be added in a number of places.
> >
> > Is there any objection to adding this patch now?
>
> I would consider using a new hook, like "use_reader" or
> "use_pcsc_parameters" to send the arguments to reader-pcsc.c and set the
> (pcsc, not cardmod) driver to "cardmod state". The reader operations API is
> by no means set in stone. Nor is there need to abstract it away too much, the
> usage pattern is known and the code path to implement it should be as simple
> as possible (sc_XXX wrapper that will not be used by any other reader driver,
> like sc_cancel and sc_wait_for_event are examples of "somewhat bad ideas".
> Yet it is a working pattern.)
Attachment shows a different approach. It's not a complete solution but
should be sufficient to demonstrate an alternative method of
SCARDCONTEXT passing.
Regards
Andre
Index: src/libopensc/reader-pcsc.c
===================================================================
--- src/libopensc/reader-pcsc.c (revision 5127)
+++ src/libopensc/reader-pcsc.c (working copy)
@@ -1900,6 +1900,20 @@
SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_VERBOSE, ret);
}
+int sc_cardmod_set_ctx(sc_reader_t *reader, SCARDCONTEXT hSCardCtx, SCARDHANDLE hSCard)
+{
+ struct pcsc_private_data *priv;
+
+ if (reader == NULL || strcmp(reader->driver->name, "cardmod") != 0)
+ return SC_ERROR_INVALID_ARGUMENTS;
+
+ priv = GET_PRIV_DATA(reader);
+ priv->gpriv->pcsc_ctx = hSCardCtx;
+ priv->pcsc_card = hSCard;
+
+ return SC_SUCCESS;
+}
+
struct sc_reader_driver * sc_get_cardmod_driver(void)
{
Index: src/cardmod/cardmod.c
===================================================================
--- src/cardmod/cardmod.c (revision 5127)
+++ src/cardmod/cardmod.c (working copy)
@@ -1454,6 +1454,14 @@
vs->reader = sc_ctx_get_reader(vs->ctx, 0);
if(vs->reader)
{
+ r = sc_cardmod_set_ctx(vs->reader, pCardData->hSCardCtx, pCardData->hScard);
+ if (r != SC_SUCCESS)
+ {
+ logprintf(pCardData, 0, "");
+ /* TODO: free allocated resources */
+ return SCARD_F_UNKNOWN_ERROR;
+ }
+
logprintf(pCardData, 3, "%s\n", NULLSTR(vs->reader->name));
r = sc_connect_card(vs->reader, &(vs->card));
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel