Add _sc_delete_reader to allow for a single reader to be

deleted from the ctx->readers list. This will be used 
by cardmod and for consistence by sc_release_context.



git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@5127 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
dengert 2011-02-03 21:18:26 +00:00
parent d57395173c
commit 1adcc611c2
2 changed files with 15 additions and 6 deletions

View File

@ -44,6 +44,17 @@ int _sc_add_reader(sc_context_t *ctx, sc_reader_t *reader)
return SC_SUCCESS;
}
int _sc_delete_reader(sc_context_t *ctx, sc_reader_t *reader)
{
assert(reader != NULL);
if (reader->ops->release)
reader->ops->release(reader);
if (reader->name)
free(reader->name);
list_delete(&ctx->readers, reader);
free(reader);
}
struct _sc_driver_entry {
const char *name;
void *(*func)(void);
@ -692,12 +703,9 @@ int sc_release_context(sc_context_t *ctx)
assert(ctx != NULL);
SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE);
for (i=0; i<list_size(&ctx->readers); i++) {
sc_reader_t *rdr = (sc_reader_t *) list_get_at(&ctx->readers, i);
if (rdr->ops->release != NULL)
rdr->ops->release(rdr);
free(rdr->name);
free(rdr);
while (list_size(&ctx->readers)) {
sc_reader_t *rdr = (sc_reader_t *) list_get_at(&ctx->readers, 0);
_sc_delete_reader(ctx, rdr);
}
if (ctx->reader_driver->ops->finish != NULL)

View File

@ -74,6 +74,7 @@ struct sc_atr_table {
/* Internal use only */
int _sc_add_reader(struct sc_context *ctx, struct sc_reader *reader);
int _sc_delete_reader(struct sc_context *ctx, struct sc_reader *reader);
int _sc_parse_atr(struct sc_reader *reader);
/* Add an ATR to the card driver's struct sc_atr_table */