diff options
author | Richard Levitte <levitte@openssl.org> | 2019-02-25 01:53:34 +0100 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2019-03-12 20:25:46 +0100 |
commit | 85e2417c0d81cfe97586b74c410ef37595aea72d (patch) | |
tree | 1bd00d198ab71707c691b0b9ae896e2ee5527a50 /crypto/provider_core.c | |
parent | e2146e120f5bab21dcedfb34741141897f80e1ee (diff) |
Replumbing: Add an OSSL_PROVIDER iterator with callback
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8340)
Diffstat (limited to 'crypto/provider_core.c')
-rw-r--r-- | crypto/provider_core.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/crypto/provider_core.c b/crypto/provider_core.c index 05a6bfff49..e7cbee2e43 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -328,6 +328,30 @@ int ossl_provider_activate(OSSL_PROVIDER *prov) return 1; } +int ossl_provider_forall_loaded(OPENSSL_CTX *ctx, + int (*cb)(OSSL_PROVIDER *provider, + void *cbdata), + void *cbdata) +{ + int ret = 1; + int i; + struct provider_store_st *store = get_provider_store(ctx); + + if (store != NULL) { + CRYPTO_THREAD_read_lock(store->lock); + for (i = 0; i < sk_OSSL_PROVIDER_num(store->providers); i++) { + OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(store->providers, i); + + if (prov->flag_initialized + && !(ret = cb(prov, cbdata))) + break; + } + CRYPTO_THREAD_unlock(store->lock); + } + + return ret; +} + /* Getters of Provider Object data */ const char *ossl_provider_name(OSSL_PROVIDER *prov) { |