From d3b3faa91af06ce27bed3ab580a16e9b54a90c5a Mon Sep 17 00:00:00 2001 From: dengert Date: Wed, 9 Feb 2011 14:33:52 +0000 Subject: [PATCH] Add sc_ctx_use_reader as a reader driver operation. It is used by cardmod to pass in pointers to the PC/SC handles provided by the caller of cardmod. Other drivers will return an error if this routine called. git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5190 c6295689-39f2-0310-b995-f0e70906c6a9 --- src/libopensc/ctx.c | 10 ++++++++++ src/libopensc/libopensc.exports | 1 + src/libopensc/opensc.h | 13 +++++++++++++ src/libopensc/reader-ctapi.c | 1 + src/libopensc/reader-openct.c | 1 + src/libopensc/reader-pcsc.c | 2 ++ 6 files changed, 28 insertions(+) diff --git a/src/libopensc/ctx.c b/src/libopensc/ctx.c index 1a2876bc..3acce456 100644 --- a/src/libopensc/ctx.c +++ b/src/libopensc/ctx.c @@ -677,6 +677,16 @@ int sc_context_create(sc_context_t **ctx_out, const sc_context_param_t *parm) return SC_SUCCESS; } +/* use by cardmod to pass in provided handles to reader-pcsc */ +int sc_ctx_use_reader(sc_context_t *ctx, void * pcsc_context_handle, void * pcsc_card_handle) +{ + SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_NORMAL); + if (ctx->reader_driver->ops->use_reader != NULL) + return ctx->reader_driver->ops->use_reader(ctx, pcsc_context_handle, pcsc_card_handle); + + return SC_ERROR_NOT_SUPPORTED; +} + /* Following two are only implemented with internal PC/SC and don't consume a reader object */ int sc_cancel(sc_context_t *ctx) { diff --git a/src/libopensc/libopensc.exports b/src/libopensc/libopensc.exports index 80a473a9..1fc79aa5 100644 --- a/src/libopensc/libopensc.exports +++ b/src/libopensc/libopensc.exports @@ -71,6 +71,7 @@ sc_ctx_get_reader sc_ctx_get_reader_by_id sc_ctx_get_reader_by_name sc_ctx_get_reader_count +sc_ctx_use_reader sc_decipher sc_delete_file sc_delete_record diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index f8c27543..44bad534 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -388,6 +388,8 @@ struct sc_reader_operations { int timeout, void **reader_states); /* Reset a reader */ int (*reset)(struct sc_reader *, int); + /* used to pass in reader handles in cardmod mode */ + int (*use_reader)(struct sc_context *ctx, void * pcsc_context_handle, void * pcsc_card_handle); }; /* @@ -726,6 +728,17 @@ int sc_ctx_detect_readers(sc_context_t *ctx); */ sc_reader_t *sc_ctx_get_reader(sc_context_t *ctx, unsigned int i); +/** + * Pass in pointers to handles to be used for the pcsc reader. + * This is used by cardmod to pass in handles provided by BaseCSP + * + * @param ctx pointer to a sc_context_t + * @param pcsc_context_handle pointer to the new context_handle to use + * @param pcsc_card_handle pointer to the new card_handle to use + * @return SC_SUCCESS on success and an error code otherwise. + */ +int sc_ctx_use_reader(sc_context_t *ctx, void * pcsc_context_handle, void * pcsc_card_handle); + /** * Returns a pointer to the specified sc_reader_t object * @param ctx OpenSC context diff --git a/src/libopensc/reader-ctapi.c b/src/libopensc/reader-ctapi.c index ed6d03cc..147bf63e 100644 --- a/src/libopensc/reader-ctapi.c +++ b/src/libopensc/reader-ctapi.c @@ -563,6 +563,7 @@ struct sc_reader_driver * sc_get_ctapi_driver(void) ctapi_ops.connect = ctapi_connect; ctapi_ops.disconnect = ctapi_disconnect; ctapi_ops.perform_verify = ctbcs_pin_cmd; + ctapi_ops.use_reader = NULL; return &ctapi_drv; } diff --git a/src/libopensc/reader-openct.c b/src/libopensc/reader-openct.c index 4285c619..5b2c9dcc 100644 --- a/src/libopensc/reader-openct.c +++ b/src/libopensc/reader-openct.c @@ -450,6 +450,7 @@ struct sc_reader_driver *sc_get_openct_driver(void) openct_ops.perform_verify = openct_reader_perform_verify; openct_ops.lock = openct_reader_lock; openct_ops.unlock = openct_reader_unlock; + openct_ops.use_reader = NULL; return &openct_reader_driver; } diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index e9dab2bf..50190475 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -1535,6 +1535,7 @@ struct sc_reader_driver * sc_get_pcsc_driver(void) pcsc_ops.wait_for_event = pcsc_wait_for_event; pcsc_ops.cancel = pcsc_cancel; pcsc_ops.reset = pcsc_reset; + pcsc_ops.use_reader = NULL; return &pcsc_drv; } @@ -1926,6 +1927,7 @@ struct sc_reader_driver * sc_get_cardmod_driver(void) /* cardmod_ops.perform_verify = ; */ cardmod_ops.wait_for_event = NULL; cardmod_ops.reset = NULL; + cardmod_ops.use_reader = NULL; /* TODO Replace with entry point with major changes to cardmod */ return &cardmod_drv; }