[Spice-devel] [PATCH GTK 4/4] don't attempt to use libcacard before it's inited
Christophe Fergeau
cfergeau at redhat.com
Tue Jul 5 01:37:54 PDT 2011
Now that libcacard initialization is run asynchronously,
the methods to insert/remove a software smartcard need to make
sure libcacard is initialized before trying to trigger such an
insertion/removal. When these functions are called too early,
the insertion/removal attempt is ignored.
---
gtk/smartcard-manager.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/gtk/smartcard-manager.c b/gtk/smartcard-manager.c
index 9565840..16029c7 100644
--- a/gtk/smartcard-manager.c
+++ b/gtk/smartcard-manager.c
@@ -59,6 +59,7 @@ struct spice_smartcard_manager {
*/
#ifdef USE_SMARTCARD
VReader *software_reader;
+ gboolean libcacard_inited;
#endif
};
@@ -389,6 +390,14 @@ gboolean spice_smartcard_reader_is_software(SpiceSmartCardReader *reader)
return (strcmp(vreader_get_name((VReader*)reader), SPICE_SOFTWARE_READER_NAME) == 0);
}
+static gboolean spice_libcacard_inited(G_GNUC_UNUSED gpointer data)
+{
+ SpiceSmartCardManager *manager = spice_smartcard_manager_get();
+
+ manager->priv->libcacard_inited = TRUE;
+ return FALSE;
+}
+
static gpointer spice_vcard_emul_init_thread(gpointer data)
{
VCardEmulError error;
@@ -398,6 +407,7 @@ static gpointer spice_vcard_emul_init_thread(gpointer data)
if (error != VCARD_EMUL_OK) {
g_critical("vcard_emul_init() failed: %d", error);
}
+ g_idle_add(spice_libcacard_inited, NULL);
return NULL;
}
@@ -460,6 +470,8 @@ gboolean spice_smartcard_manager_insert_card(SpiceSmartCardManager *manager)
VCardEmulError status;
g_return_val_if_fail(manager->priv->software_reader != NULL, FALSE);
+ if (!manager->priv->libcacard_inited)
+ return FALSE;
status = vcard_emul_force_card_insert(manager->priv->software_reader);
@@ -471,6 +483,8 @@ gboolean spice_smartcard_manager_remove_card(SpiceSmartCardManager *manager)
VCardEmulError status;
g_return_val_if_fail(manager->priv->software_reader != NULL, FALSE);
+ if (!manager->priv->libcacard_inited)
+ return FALSE;
status = vcard_emul_force_card_remove(manager->priv->software_reader);
--
1.7.5.4
More information about the Spice-devel
mailing list