/** * gck_module_equal: * @module1: A pointer to the first GckModule * @module2: A pointer to the second GckModule * * Checks equality of two modules. Two GckModule objects can point to the same * underlying PKCS#11 module. * * Return value: TRUE if module1 and module2 are equal. FALSE if either is not a GckModule. **/ gboolean gck_module_equal (gconstpointer module1, gconstpointer module2) { GckModule *mod1, *mod2; if (module1 == module2) return TRUE; if (!GCK_IS_MODULE (module1) || !GCK_IS_MODULE (module2)) return FALSE; mod1 = GCK_MODULE (module1); mod2 = GCK_MODULE (module2); return mod1->pv->funcs == mod2->pv->funcs; }
/** * gck_module_hash: * @module: A pointer to a GckModule * * Create a hash value for the GckModule. * * This function is intended for easily hashing a GckModule to add to * a GHashTable or similar data structure. * * Return value: An integer that can be used as a hash value, or 0 if invalid. **/ guint gck_module_hash (gconstpointer module) { GckModule *self; g_return_val_if_fail (GCK_IS_MODULE (module), 0); self = GCK_MODULE (module); return g_direct_hash (self->pv->funcs); }
static void gck_module_finalize (GObject *obj) { GckModule *self = GCK_MODULE (obj); if (self->pv->initialized && self->pv->funcs) p11_kit_module_release (self->pv->funcs); self->pv->funcs = NULL; g_free (self->pv->path); self->pv->path = NULL; G_OBJECT_CLASS (gck_module_parent_class)->finalize (obj); }
static void gck_module_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec) { GckModule *self = GCK_MODULE (obj); switch (prop_id) { case PROP_PATH: g_value_set_string (value, gck_module_get_path (self)); break; case PROP_FUNCTIONS: g_value_set_pointer (value, gck_module_get_functions (self)); break; } }
static void gck_module_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GckModule *self = GCK_MODULE (obj); /* Only allowed during initialization */ switch (prop_id) { case PROP_PATH: g_return_if_fail (!self->pv->path); self->pv->path = g_value_dup_string (value); break; case PROP_FUNCTIONS: g_return_if_fail (!self->pv->funcs); self->pv->funcs = g_value_get_pointer (value); break; } }
static void gck_module_finalize (GObject *obj) { GckModule *self = GCK_MODULE (obj); self->pv->funcs = NULL; if (self->pv->module) { if (!g_module_close (self->pv->module)) g_warning ("failed to close the pkcs11 module: %s", g_module_error ()); self->pv->module = NULL; } g_free (self->pv->path); self->pv->path = NULL; G_OBJECT_CLASS (gck_module_parent_class)->finalize (obj); }
static void gck_module_dispose (GObject *obj) { GckModule *self = GCK_MODULE (obj); gboolean finalize = FALSE; CK_RV rv; if (self->pv->initialized && self->pv->funcs) { if (g_atomic_int_compare_and_exchange (&self->pv->finalized, 0, 1)) finalize = TRUE; } /* Must be careful when accessing funcs */ if (finalize) { rv = (self->pv->funcs->C_Finalize) (NULL); if (rv != CKR_OK) { g_warning ("C_Finalize on module '%s' failed: %s", self->pv->path, gck_message_from_rv (rv)); } } G_OBJECT_CLASS (gck_module_parent_class)->dispose (obj); }