summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/p11-kit-sections.txt3
-rw-r--r--p11-kit/iter.c41
-rw-r--r--p11-kit/iter.h3
-rw-r--r--p11-kit/tests/test-iter.c28
4 files changed, 67 insertions, 8 deletions
diff --git a/doc/manual/p11-kit-sections.txt b/doc/manual/p11-kit-sections.txt
index efd0cc6..e066fe1 100644
--- a/doc/manual/p11-kit-sections.txt
+++ b/doc/manual/p11-kit-sections.txt
@@ -99,9 +99,10 @@ p11_kit_be_loud
p11_kit_destroyer
P11KitIter
p11_kit_iter_new
+p11_kit_iter_set_uri
p11_kit_iter_add_callback
-p11_kit_iter_callback
p11_kit_iter_add_filter
+p11_kit_iter_callback
p11_kit_iter_begin
p11_kit_iter_begin_with
p11_kit_iter_next
diff --git a/p11-kit/iter.c b/p11-kit/iter.c
index 61d0ee3..e8e466c 100644
--- a/p11-kit/iter.c
+++ b/p11-kit/iter.c
@@ -127,10 +127,6 @@ p11_kit_iter_new (P11KitUri *uri,
P11KitIterBehavior behavior)
{
P11KitIter *iter;
- CK_ATTRIBUTE *attrs;
- CK_TOKEN_INFO *tinfo;
- CK_INFO *minfo;
- CK_ULONG count;
iter = calloc (1, sizeof (P11KitIter));
return_val_if_fail (iter != NULL, NULL);
@@ -139,6 +135,39 @@ p11_kit_iter_new (P11KitUri *uri,
return_val_if_fail (iter->modules != NULL, NULL);
iter->want_writable = !!(behavior & P11_KIT_ITER_WANT_WRITABLE);
+ iter->preload_results = !(behavior & P11_KIT_ITER_BUSY_SESSIONS);
+
+ p11_kit_iter_set_uri (iter, uri);
+ return iter;
+}
+
+/**
+ * p11_kit_iter_set_uri:
+ * @iter: the iterator
+ * @uri: (allow-none): a PKCS\#11 URI to filter on, or %NULL
+ *
+ * Set the PKCS\#11 uri for iterator. Only
+ * objects that match the @uri will be returned by the iterator.
+ * Relevant information in @uri is copied, and you need not keep
+ * @uri around.
+ *
+ * If no @uri is specified then the iterator will iterate over all
+ * objects, unless otherwise filtered.
+ *
+ * This function should be called at most once, and should be
+ * called before iterating begins.
+ *
+ */
+void
+p11_kit_iter_set_uri (P11KitIter *iter,
+ P11KitUri *uri)
+{
+ CK_ATTRIBUTE *attrs;
+ CK_TOKEN_INFO *tinfo;
+ CK_INFO *minfo;
+ CK_ULONG count;
+
+ return_if_fail (iter != NULL);
if (uri != NULL) {
@@ -159,12 +188,10 @@ p11_kit_iter_new (P11KitUri *uri,
}
} else {
/* Match any module version number*/
+ memset (&iter->match_module, 0, sizeof (iter->match_module));
iter->match_module.libraryVersion.major = (CK_BYTE)-1;
iter->match_module.libraryVersion.minor = (CK_BYTE)-1;
}
- iter->preload_results = !(behavior & P11_KIT_ITER_BUSY_SESSIONS);
-
- return iter;
}
/**
diff --git a/p11-kit/iter.h b/p11-kit/iter.h
index ecf7db0..2ded9fe 100644
--- a/p11-kit/iter.h
+++ b/p11-kit/iter.h
@@ -70,6 +70,9 @@ void p11_kit_iter_add_filter (P11KitIter *iter,
CK_ATTRIBUTE *matching,
CK_ULONG count);
+void p11_kit_iter_set_uri (P11KitIter *iter,
+ P11KitUri *uri);
+
void p11_kit_iter_begin (P11KitIter *iter,
CK_FUNCTION_LIST_PTR *modules);
diff --git a/p11-kit/tests/test-iter.c b/p11-kit/tests/test-iter.c
index a1d1c9c..46b825e 100644
--- a/p11-kit/tests/test-iter.c
+++ b/p11-kit/tests/test-iter.c
@@ -519,6 +519,33 @@ test_uri_with_type (void)
}
static void
+test_set_uri (void)
+{
+ CK_FUNCTION_LIST_PTR *modules;
+ P11KitIter *iter;
+ P11KitUri *uri;
+ CK_RV rv;
+
+ modules = initialize_and_get_modules ();
+
+ uri = p11_kit_uri_new ();
+ p11_kit_uri_set_unrecognized (uri, 1);
+ iter = p11_kit_iter_new (NULL, 0);
+ p11_kit_iter_set_uri (iter, uri);
+ p11_kit_uri_free (uri);
+
+ p11_kit_iter_begin (iter, modules);
+
+ /* Nothing should have matched */
+ rv = p11_kit_iter_next (iter);
+ assert_num_eq (rv, CKR_CANCEL);
+
+ p11_kit_iter_free (iter);
+
+ finalize_and_free_modules (modules);
+}
+
+static void
test_filter (void)
{
CK_OBJECT_HANDLE objects[128];
@@ -1165,6 +1192,7 @@ main (int argc,
p11_test (test_all, "/iter/test_all");
p11_test (test_unrecognized, "/iter/test_unrecognized");
p11_test (test_uri_with_type, "/iter/test_uri_with_type");
+ p11_test (test_set_uri, "/iter/set-uri");
p11_test (test_session_flags, "/iter/test_session_flags");
p11_test (test_callback, "/iter/test_callback");
p11_test (test_callback_fails, "/iter/test_callback_fails");