1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-02 22:46:30 +02:00

* pcsc-wrapper.c: New.

* Makefile.am (pkglib_PROGRAMS): Install it here.
* apdu.c (writen, readn): New.
(open_pcsc_reader, pcsc_send_apdu, close_pcsc_reader): Use the
pcsc-wrapper if we are using Pth.
This commit is contained in:
Werner Koch 2004-04-20 14:17:10 +00:00
parent d70bc68c30
commit e950b01ff5
11 changed files with 1828 additions and 79 deletions

View file

@ -56,14 +56,11 @@ has_option (const char *line, const char *name)
}
/* Note, that this reset_notify is also used for cleanup purposes. */
/* Reset the card and free the application context. With DO_CLOSE set
to true, close the reader and don't do just a reset. */
static void
reset_notify (ASSUAN_CONTEXT ctx)
do_reset (ctrl_t ctrl, int do_close)
{
CTRL ctrl = assuan_get_pointer (ctx);
if (ctrl->card_ctx)
{
card_close (ctrl->card_ctx);
@ -73,11 +70,26 @@ reset_notify (ASSUAN_CONTEXT ctx)
}
if (ctrl->app_ctx)
{
int slot = ctrl->app_ctx->slot;
release_application (ctrl->app_ctx);
ctrl->app_ctx = NULL;
apdu_close_reader (slot);
}
if (ctrl->reader_slot != -1)
{
if (do_close || apdu_reset (ctrl->reader_slot))
{
apdu_close_reader (ctrl->reader_slot);
ctrl->reader_slot = -1;
}
}
}
static void
reset_notify (ASSUAN_CONTEXT ctx)
{
CTRL ctrl = assuan_get_pointer (ctx);
do_reset (ctrl, 0);
}
@ -92,7 +104,7 @@ option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value)
function returns an Assuan error, so don't map the error a second
time */
static AssuanError
open_card (CTRL ctrl, const char *apptype)
open_card (ctrl_t ctrl, const char *apptype)
{
int slot;
@ -101,13 +113,13 @@ open_card (CTRL ctrl, const char *apptype)
if (ctrl->card_ctx)
return 0; /* Already initialized using a card context. */
slot = apdu_open_reader (opt.reader_port);
if (ctrl->reader_slot != -1)
slot = ctrl->reader_slot;
else
slot = apdu_open_reader (opt.reader_port);
ctrl->reader_slot = slot;
if (slot != -1)
{
ctrl->app_ctx = select_application (ctrl, slot, apptype);
if (!ctrl->app_ctx)
apdu_close_reader (slot);
}
ctrl->app_ctx = select_application (ctrl, slot, apptype);
if (!ctrl->app_ctx)
{ /* No application found - fall back to old mode. */
/* Note that we should rework the old code to use the
@ -1084,6 +1096,12 @@ scd_command_handler (int listen_fd)
if (DBG_ASSUAN)
assuan_set_log_stream (ctx, log_get_stream ());
/* We open the reader right at startup so that the ticker is able to
update the status file. */
if (ctrl.reader_slot == -1)
ctrl.reader_slot = apdu_open_reader (opt.reader_port);
/* Command processing loop. */
for (;;)
{
rc = assuan_accept (ctx);
@ -1104,7 +1122,7 @@ scd_command_handler (int listen_fd)
continue;
}
}
reset_notify (ctx); /* used for cleanup */
do_reset (&ctrl, 1); /* Cleanup. */
assuan_deinit_server (ctx);
}
@ -1156,3 +1174,22 @@ send_status_info (CTRL ctrl, const char *keyword, ...)
va_end (arg_ptr);
}
void
scd_update_reader_status_file (void)
{
int slot;
int used;
unsigned int status, changed;
/* Note, that we only try to get the status, becuase it does not
make sense to wait here for a operation to complete. If we are
so busy working with the card, delays in the status file updated
are should be acceptable. */
for (slot=0; !apdu_enum_reader (slot, &used); slot++)
if (used && !apdu_get_status (slot, 0, &status, &changed))
{
log_info ("status of slot %d is %u\n", slot, status);
}
}