mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
scd: New command DEVINFO.
* scd/app.c (notify_cond): New condition variable. (app_send_devinfo, app_wait): New. (scd_update_reader_status_file): Kick NOTIFY_COND. (initialize_module_command): Initialize NOTIFY_COND. * scd/command.c (struct server_local_s): Add watching_status. (cmd_devinfo): New. (register_commands): Add DEVINFO command. (send_client_notifications): Write status change to DEVINFO channel. * scd/scdaemon.h (app_wait, app_send_devinfo): New. GnuPG-bug-id: 4864 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
29f8f52bf8
commit
2ccbcfec12
3 changed files with 202 additions and 61 deletions
55
scd/app.c
55
scd/app.c
|
@ -42,6 +42,9 @@ send_serialno_and_app_status (card_t card, int with_apps, ctrl_t ctrl);
|
|||
* applications. */
|
||||
static npth_mutex_t card_list_lock;
|
||||
|
||||
/* Notification to threads which keep watching the status change. */
|
||||
static npth_cond_t notify_cond;
|
||||
|
||||
/* A list of card contexts. A card is a collection of applications
|
||||
* (described by app_t) on the same physical token. */
|
||||
static card_t card_top;
|
||||
|
@ -280,6 +283,37 @@ app_dump_state (void)
|
|||
}
|
||||
|
||||
|
||||
gpg_error_t
|
||||
app_send_devinfo (ctrl_t ctrl)
|
||||
{
|
||||
card_t c;
|
||||
app_t a;
|
||||
int no_device;
|
||||
|
||||
send_status_direct (ctrl, "DEVINFO_START", "");
|
||||
|
||||
npth_mutex_lock (&card_list_lock);
|
||||
no_device = (card_top == NULL);
|
||||
for (c = card_top; c; c = c->next)
|
||||
{
|
||||
char *serialno;
|
||||
char card_info[80];
|
||||
|
||||
serialno = card_get_serialno (c);
|
||||
snprintf (card_info, sizeof card_info, "DEVICE %s %s",
|
||||
strcardtype (c->cardtype), serialno);
|
||||
xfree (serialno);
|
||||
|
||||
for (a = c->app; a; a = a->next)
|
||||
send_status_direct (ctrl, card_info, strapptype (a->apptype));
|
||||
}
|
||||
npth_mutex_unlock (&card_list_lock);
|
||||
|
||||
send_status_direct (ctrl, "DEVINFO_END", "");
|
||||
|
||||
return no_device ? gpg_error (GPG_ERR_NOT_FOUND): 0;
|
||||
}
|
||||
|
||||
/* Check whether the application NAME is allowed. This does not mean
|
||||
we have support for it though. */
|
||||
static int
|
||||
|
@ -1934,6 +1968,7 @@ scd_update_reader_status_file (void)
|
|||
{
|
||||
card_t card, card_next;
|
||||
int periodical_check_needed = 0;
|
||||
int reported = 0;
|
||||
|
||||
npth_mutex_lock (&card_list_lock);
|
||||
for (card = card_top; card; card = card_next)
|
||||
|
@ -1968,6 +2003,7 @@ scd_update_reader_status_file (void)
|
|||
{
|
||||
report_change (card->slot, card->card_status, status);
|
||||
send_client_notifications (card, status == 0);
|
||||
reported++;
|
||||
|
||||
if (status == 0)
|
||||
{
|
||||
|
@ -1992,6 +2028,9 @@ scd_update_reader_status_file (void)
|
|||
}
|
||||
}
|
||||
|
||||
if (reported)
|
||||
npth_cond_broadcast (¬ify_cond);
|
||||
|
||||
npth_mutex_unlock (&card_list_lock);
|
||||
|
||||
return periodical_check_needed;
|
||||
|
@ -2013,6 +2052,14 @@ initialize_module_command (void)
|
|||
return err;
|
||||
}
|
||||
|
||||
err = npth_cond_init (¬ify_cond, NULL);
|
||||
if (err)
|
||||
{
|
||||
err = gpg_error_from_syserror ();
|
||||
log_error ("npth_cond_init failed: %s\n", gpg_strerror (err));
|
||||
return err;
|
||||
}
|
||||
|
||||
return apdu_init ();
|
||||
}
|
||||
|
||||
|
@ -2279,3 +2326,11 @@ app_do_with_keygrip (ctrl_t ctrl, int action, const char *keygrip_str,
|
|||
npth_mutex_unlock (&card_list_lock);
|
||||
return c;
|
||||
}
|
||||
|
||||
void
|
||||
app_wait (void)
|
||||
{
|
||||
npth_mutex_lock (&card_list_lock);
|
||||
npth_cond_wait (¬ify_cond, &card_list_lock);
|
||||
npth_mutex_unlock (&card_list_lock);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue