[gnome-keyring/gck-work] [gck] Add methods for listing and initializing registered modules.



commit cea36adf672a4b26a632362c8559d9db2785d66e
Author: Stef Walter <stef memberwebs com>
Date:   Sun Aug 1 12:02:56 2010 +0200

    [gck] Add methods for listing and initializing registered modules.
    
     * We use the concept of a PKCS #11 registry as outlined here:
       http://wiki.cacert.org/Pkcs11TaskForce

 gck/Makefile.am   |    3 +-
 gck/gck-modules.c |   65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 gck/gck.h         |    4 +++
 3 files changed, 71 insertions(+), 1 deletions(-)
---
diff --git a/gck/Makefile.am b/gck/Makefile.am
index b6ed66d..a860f71 100644
--- a/gck/Makefile.am
+++ b/gck/Makefile.am
@@ -8,7 +8,8 @@ INCLUDES = \
 	-I$(top_srcdir) \
 	$(GOBJECT_CFLAGS) \
 	$(GTHREAD_CFLAGS) \
-	$(GLIB_CFLAGS)
+	$(GLIB_CFLAGS) \
+	-DPKCS11_REGISTRY_DIR=\"$(libdir)/pkcs11\"
 
 BUILT_SOURCES = \
 	gck-marshal.c gck-marshal.h
diff --git a/gck/gck-modules.c b/gck/gck-modules.c
index bf13de1..c27062d 100644
--- a/gck/gck-modules.c
+++ b/gck/gck-modules.c
@@ -37,6 +37,71 @@
  * Xxxxx
  */
 
+gchar**
+gck_modules_list_registered_paths (GError **err)
+{
+	const gchar *name;
+	gchar *path;
+	GDir *dir;
+	GArray *paths;
+
+	g_return_val_if_fail (!err || !*err, NULL);
+
+	dir = g_dir_open (PKCS11_REGISTRY_DIR, 0, err);
+	if (dir == NULL)
+		return NULL;
+
+	paths = g_array_new (TRUE, TRUE, sizeof (gchar*));
+
+	for (;;) {
+		name = g_dir_read_name (dir);
+		if (!name)
+			break;
+
+		path = g_build_filename (PKCS11_REGISTRY_DIR, name, NULL);
+		if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+			g_array_append_val (paths, path);
+		else
+			g_free (path);
+	}
+
+	g_dir_close (dir);
+
+	return (gchar**)g_array_free (paths, FALSE);
+}
+
+GList*
+gck_modules_initialize_registered (guint options)
+{
+	GError *err = NULL;
+	gchar **paths, **p;
+	GckModule *module;
+	GList *results = NULL;
+
+	paths = gck_modules_list_registered_paths (&err);
+	if (!paths && err) {
+		g_warning ("couldn't list registered PKCS#11 module paths: %s",
+		           err && err->message ? err->message : "");
+		g_clear_error (&err);
+		return NULL;
+	}
+
+	for (p = paths; *p; ++p) {
+		module = gck_module_initialize (*p, NULL, 0, &err);
+		if (module) {
+			results = g_list_prepend (results, module);
+
+		} else {
+			g_warning ("couldn't load PKCS#11 module: %s: %s",
+			           *p, err && err->message ? err->message : "");
+			g_clear_error (&err);
+		}
+	}
+
+	g_strfreev (paths);
+	return results;
+}
+
 GList*
 gck_modules_get_slots (GList *modules, gboolean token_present)
 {
diff --git a/gck/gck.h b/gck/gck.h
index f4a2fc4..d804071 100644
--- a/gck/gck.h
+++ b/gck/gck.h
@@ -299,6 +299,10 @@ GList*                gck_module_get_slots                    (GckModule *self,
 
 guint                 gck_module_get_options                  (GckModule *self);
 
+gchar**               gck_modules_list_registered_paths       (GError **err);
+
+GList*                gck_modules_initialize_registered       (guint options);
+
 GList*                gck_modules_get_slots                   (GList *modules,
                                                                gboolean token_present);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]