From: Stef Walter Date: Tue, 27 Aug 2013 19:15:24 +0000 (+0200) Subject: iter: Add a p11_kit_iter_destroy_object() function X-Git-Tag: 0.20.0~14 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1fac2b92d6c53655086a2cc3a653b8e78d92a043;p=p11-kit iter: Add a p11_kit_iter_destroy_object() function Handy function since this is a common need. --- diff --git a/doc/manual/p11-kit-sections.txt b/doc/manual/p11-kit-sections.txt index e066fe1..28ebae0 100644 --- a/doc/manual/p11-kit-sections.txt +++ b/doc/manual/p11-kit-sections.txt @@ -113,6 +113,7 @@ p11_kit_iter_get_session p11_kit_iter_keep_session p11_kit_iter_get_object p11_kit_iter_load_attributes +p11_kit_iter_destroy_object p11_kit_iter_free P11KitIterBehavior diff --git a/p11-kit/iter.c b/p11-kit/iter.c index e8e466c..6a3ad4a 100644 --- a/p11-kit/iter.c +++ b/p11-kit/iter.c @@ -730,6 +730,24 @@ p11_kit_iter_get_object (P11KitIter *iter) return iter->object; } +/** + * p11_kit_iter_destroy_object: + * @iter: teh iterator + * + * Destory the current matching object. + * + * This can only be called after p11_kit_iter_next() succeeds. + * + * Returns: CKR_OK or a failure code + */ +CK_RV +p11_kit_iter_destroy_object (P11KitIter *iter) +{ + return_val_if_fail (iter != NULL, CKR_GENERAL_ERROR); + return_val_if_fail (iter->iterating, CKR_GENERAL_ERROR); + return (iter->module->C_DestroyObject) (iter->session, iter->object); +} + /** * p11_kit_iter_load_attributes: * @iter: the iterator diff --git a/p11-kit/iter.h b/p11-kit/iter.h index 2ded9fe..0201db0 100644 --- a/p11-kit/iter.h +++ b/p11-kit/iter.h @@ -99,6 +99,7 @@ CK_RV p11_kit_iter_load_attributes (P11KitIter *iter, CK_SESSION_HANDLE p11_kit_iter_keep_session (P11KitIter *iter); +CK_RV p11_kit_iter_destroy_object (P11KitIter *iter); #endif /* P11_KIT_FUTURE_UNSTABLE_API */ diff --git a/p11-kit/tests/test-iter.c b/p11-kit/tests/test-iter.c index 46b825e..b72795e 100644 --- a/p11-kit/tests/test-iter.c +++ b/p11-kit/tests/test-iter.c @@ -1182,6 +1182,45 @@ test_many (void *flags) assert (rv == CKR_OK); } +static void +test_destroy_object (void) +{ + CK_FUNCTION_LIST **modules; + P11KitIter *iter; + CK_OBJECT_HANDLE object; + CK_SESSION_HANDLE session; + CK_FUNCTION_LIST *module; + CK_ULONG size; + CK_RV rv; + + modules = initialize_and_get_modules (); + + iter = p11_kit_iter_new (NULL, P11_KIT_ITER_WANT_WRITABLE); + + p11_kit_iter_begin (iter, modules); + + /* Should have matched */ + rv = p11_kit_iter_next (iter); + assert_num_eq (rv, CKR_OK); + + object = p11_kit_iter_get_object (iter); + session = p11_kit_iter_get_session (iter); + module = p11_kit_iter_get_module (iter); + + rv = (module->C_GetObjectSize) (session, object, &size); + assert_num_eq (rv, CKR_OK); + + rv = p11_kit_iter_destroy_object (iter); + assert_num_eq (rv, CKR_OK); + + rv = (module->C_GetObjectSize) (session, object, &size); + assert_num_eq (rv, CKR_OBJECT_HANDLE_INVALID); + + p11_kit_iter_free (iter); + + finalize_and_free_modules (modules); +} + int main (int argc, char *argv[]) @@ -1218,6 +1257,7 @@ main (int argc, p11_test (test_load_attributes_fail_late, "/iter/test_load_attributes_fail_late"); p11_testx (test_many, "", "/iter/test-many"); p11_testx (test_many, "busy-sessions", "/iter/test-many-busy"); + p11_test (test_destroy_object, "/iter/destroy-object"); return p11_test_run (argc, argv); }